Merge pull request #427 from wesleygriffin/master

Build: Bump required CMake version down to 2.8.11
diff --git a/OGLCompilersDLL/InitializeDll.cpp b/OGLCompilersDLL/InitializeDll.cpp
index cc2b742..e479881 100644
--- a/OGLCompilersDLL/InitializeDll.cpp
+++ b/OGLCompilersDLL/InitializeDll.cpp
@@ -34,7 +34,7 @@
 
 #define SH_EXPORTING
 
-#include <assert.h>
+#include <cassert>
 
 #include "InitializeDll.h"
 #include "../glslang/Include/InitializeGlobals.h"
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index be266ac..5993e16 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -283,10 +283,10 @@
     }
 }
 
-// Translate glslang type to SPIR-V precision decorations.
-spv::Decoration TranslatePrecisionDecoration(const glslang::TType& type)
+// Translate glslang precision to SPIR-V precision decorations.
+spv::Decoration TranslatePrecisionDecoration(glslang::TPrecisionQualifier glslangPrecision)
 {
-    switch (type.getQualifier().precision) {
+    switch (glslangPrecision) {
     case glslang::EpqLow:    return spv::DecorationRelaxedPrecision;
     case glslang::EpqMedium: return spv::DecorationRelaxedPrecision;
     default:
@@ -294,6 +294,12 @@
     }
 }
 
+// Translate glslang type to SPIR-V precision decorations.
+spv::Decoration TranslatePrecisionDecoration(const glslang::TType& type)
+{
+    return TranslatePrecisionDecoration(type.getQualifier().precision);
+}
+
 // Translate glslang type to SPIR-V block decorations.
 spv::Decoration TranslateBlockDecoration(const glslang::TType& type)
 {
@@ -940,7 +946,7 @@
                 spv::Id leftRValue = accessChainLoad(node->getLeft()->getType());
 
                 // do the operation
-                rValue = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getType()),
+                rValue = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getOperationPrecision()),
                                                TranslateNoContractionDecoration(node->getType().getQualifier()),
                                                convertGlslangToSpvType(node->getType()), leftRValue, rValue,
                                                node->getType().getBasicType());
@@ -1065,7 +1071,7 @@
     spv::Id right = accessChainLoad(node->getRight()->getType());
 
     // get result
-    spv::Id result = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getType()),
+    spv::Id result = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getOperationPrecision()),
                                            TranslateNoContractionDecoration(node->getType().getQualifier()),
                                            convertGlslangToSpvType(node->getType()), left, right,
                                            node->getLeft()->getType().getBasicType());
@@ -1142,7 +1148,7 @@
     else
         operand = accessChainLoad(node->getOperand()->getType());
 
-    spv::Decoration precision = TranslatePrecisionDecoration(node->getType());
+    spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision());
     spv::Decoration noContraction = TranslateNoContractionDecoration(node->getType().getQualifier());
 
     // it could be a conversion
@@ -1187,7 +1193,7 @@
             else
                 op = glslang::EOpSub;
 
-            spv::Id result = createBinaryOperation(op, TranslatePrecisionDecoration(node->getType()),
+            spv::Id result = createBinaryOperation(op, precision,
                                                    TranslateNoContractionDecoration(node->getType().getQualifier()),
                                                    convertGlslangToSpvType(node->getType()), operand, one,
                                                    node->getType().getBasicType());
@@ -1249,7 +1255,7 @@
 
     assert(node->getOp());
 
-    spv::Decoration precision = TranslatePrecisionDecoration(node->getType());
+    spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision());
 
     switch (node->getOp()) {
     case glslang::EOpSequence:
@@ -2573,7 +2579,7 @@
         translateArguments(*node->getAsAggregate(), arguments);
     else
         translateArguments(*node->getAsUnaryNode(), arguments);
-    spv::Decoration precision = TranslatePrecisionDecoration(node->getType());
+    spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision());
 
     spv::Builder::TextureParameters params = { };
     params.sampler = arguments[0];
@@ -3076,11 +3082,9 @@
 
     // Handle comparison instructions
 
-    if (reduceComparison && (builder.isVector(left) || builder.isMatrix(left) || builder.isAggregate(left))) {
-        assert(op == glslang::EOpEqual || op == glslang::EOpNotEqual);
-
+    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);
-    }
 
     switch (op) {
     case glslang::EOpLessThan:
diff --git a/SPIRV/SPVRemapper.h b/SPIRV/SPVRemapper.h
index e5e8e1b..c2dc529 100755
--- a/SPIRV/SPVRemapper.h
+++ b/SPIRV/SPVRemapper.h
@@ -38,7 +38,7 @@
 
 #include <string>
 #include <vector>
-#include <stdlib.h>
+#include <cstdlib>
 
 namespace spv {
 
@@ -74,7 +74,7 @@
 } // namespace SPV
 
 #if !defined (use_cpp11)
-#include <stdio.h>
+#include <cstdio>
 
 namespace spv {
 class spirvbin_t : public spirvbin_base_t
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 1411d16..f2af3b5 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -38,8 +38,8 @@
 // SpvBuilder.h.
 //
 
-#include <assert.h>
-#include <stdlib.h>
+#include <cassert>
+#include <cstdlib>
 
 #include <unordered_set>
 #include <algorithm>
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
index b60b3ba..a7838a1 100644
--- a/SPIRV/disassemble.cpp
+++ b/SPIRV/disassemble.cpp
@@ -36,9 +36,9 @@
 // Disassembler for SPIR-V.
 //
 
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
 #include <iomanip>
 #include <stack>
 #include <sstream>
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index 9b58b59..a25f7c0 100755
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -33,7 +33,7 @@
 //POSSIBILITY OF SUCH DAMAGE.
 
 //
-// 1) Programatically fill in instruction/operand information.
+// 1) Programmatically fill in instruction/operand information.
 //    This can be used for disassembly, printing documentation, etc.
 //
 // 2) Print documentation from this parameterization.
@@ -41,8 +41,8 @@
 
 #include "doc.h"
 
-#include <stdio.h>
-#include <string.h>
+#include <cstdio>
+#include <cstring>
 #include <algorithm>
 
 #ifdef AMD_EXTENSIONS
diff --git a/SPIRV/doc.h b/SPIRV/doc.h
index cf9e059..743896f 100644
--- a/SPIRV/doc.h
+++ b/SPIRV/doc.h
@@ -149,7 +149,7 @@
     OperandMemorySemantics,
     OperandMemoryAccess,
     OperandScope,
-	OperandGroupOperation,
+    OperandGroupOperation,
     OperandKernelEnqueueFlags,
     OperandKernelProfilingInfo,
     OperandCapability,
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index c014be2..c0fdeb9 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -46,9 +46,9 @@
 #include "../SPIRV/GLSL.std.450.h"
 #include "../SPIRV/doc.h"
 #include "../SPIRV/disassemble.h"
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
+#include <cstring>
+#include <cstdlib>
+#include <cmath>
 
 #include "../glslang/OSDependent/osinclude.h"
 
diff --git a/Test/440.vert b/Test/440.vert
index bfcdfd2..2e61f79 100644
--- a/Test/440.vert
+++ b/Test/440.vert
@@ -73,6 +73,9 @@
 layout(location = 56, component = 3) out float sf2o;

 layout(location = 57, component = 2) out vec2 dv3o;

 layout(location = 57, component = 3) out float sf4o;     // ERROR, overlapping component

+layout(location=58) out flat dvec3 dv3o2;                // uses part of location 59

+layout(location=59, component=2) out flat double dfo3;   // okay, fits

+layout(location=59, component=0) out flat double dfo4;   // ERROR, overlaps the dvec3 in starting in 58

 

 out bblck1 {

     vec4 bbv;

diff --git a/Test/baseResults/100.frag.out b/Test/baseResults/100.frag.out
index 70b8934..edd65ab 100644
--- a/Test/baseResults/100.frag.out
+++ b/Test/baseResults/100.frag.out
@@ -241,7 +241,7 @@
 0:122        'sExt' (uniform lowp samplerExternalOES)
 0:122        Construct vec3 (temp lowp 3-component vector of float)
 0:122          'f13' (invariant global mediump float)
-0:123      textureProj (global lowp 4-component vector of float)
+0:123      textureProj (global lowp 4-component vector of float, operation at mediump)
 0:123        'sExt' (uniform lowp samplerExternalOES)
 0:123        direct index (smooth temp mediump 4-component vector of float)
 0:123          'v' (smooth in 3-element array of mediump 4-component vector of float)
@@ -278,7 +278,7 @@
 0:145      'a' (in mediump int)
 0:145      'b' (in mediump float)
 0:147    Sequence
-0:147      textureProjGrad (global lowp 4-component vector of float)
+0:147      textureProjGrad (global lowp 4-component vector of float, operation at mediump)
 0:147        's2Dg' (uniform lowp sampler2D)
 0:147        Construct vec3 (temp mediump 3-component vector of float)
 0:147          'f13' (invariant global mediump float)
@@ -299,17 +299,17 @@
 0:158  Function Definition: foo323433( (global void)
 0:158    Function Parameters: 
 0:160    Sequence
-0:160      textureLod (global lowp 4-component vector of float)
+0:160      textureLod (global lowp 4-component vector of float, operation at mediump)
 0:160        's2Dg' (uniform lowp sampler2D)
 0:160        'uv2' (invariant uniform mediump 2-component vector of float)
 0:160        'f13' (invariant global mediump float)
-0:161      textureProjGrad (global lowp 4-component vector of float)
+0:161      textureProjGrad (global lowp 4-component vector of float, operation at mediump)
 0:161        's2Dg' (uniform lowp sampler2D)
 0:161        Construct vec3 (temp mediump 3-component vector of float)
 0:161          'f13' (invariant global mediump float)
 0:161        'uv2' (invariant uniform mediump 2-component vector of float)
 0:161        'uv2' (invariant uniform mediump 2-component vector of float)
-0:162      textureGrad (global lowp 4-component vector of float)
+0:162      textureGrad (global lowp 4-component vector of float, operation at mediump)
 0:162        's2Dg' (uniform lowp sampler2D)
 0:162        'uv2' (invariant uniform mediump 2-component vector of float)
 0:162        'uv2' (invariant uniform mediump 2-component vector of float)
@@ -579,7 +579,7 @@
 0:122        'sExt' (uniform lowp samplerExternalOES)
 0:122        Construct vec3 (temp lowp 3-component vector of float)
 0:122          'f13' (invariant global mediump float)
-0:123      textureProj (global lowp 4-component vector of float)
+0:123      textureProj (global lowp 4-component vector of float, operation at mediump)
 0:123        'sExt' (uniform lowp samplerExternalOES)
 0:123        direct index (smooth temp mediump 4-component vector of float)
 0:123          'v' (smooth in 3-element array of mediump 4-component vector of float)
@@ -616,7 +616,7 @@
 0:145      'a' (in mediump int)
 0:145      'b' (in mediump float)
 0:147    Sequence
-0:147      textureProjGrad (global lowp 4-component vector of float)
+0:147      textureProjGrad (global lowp 4-component vector of float, operation at mediump)
 0:147        's2Dg' (uniform lowp sampler2D)
 0:147        Construct vec3 (temp mediump 3-component vector of float)
 0:147          'f13' (invariant global mediump float)
@@ -637,17 +637,17 @@
 0:158  Function Definition: foo323433( (global void)
 0:158    Function Parameters: 
 0:160    Sequence
-0:160      textureLod (global lowp 4-component vector of float)
+0:160      textureLod (global lowp 4-component vector of float, operation at mediump)
 0:160        's2Dg' (uniform lowp sampler2D)
 0:160        'uv2' (invariant uniform mediump 2-component vector of float)
 0:160        'f13' (invariant global mediump float)
-0:161      textureProjGrad (global lowp 4-component vector of float)
+0:161      textureProjGrad (global lowp 4-component vector of float, operation at mediump)
 0:161        's2Dg' (uniform lowp sampler2D)
 0:161        Construct vec3 (temp mediump 3-component vector of float)
 0:161          'f13' (invariant global mediump float)
 0:161        'uv2' (invariant uniform mediump 2-component vector of float)
 0:161        'uv2' (invariant uniform mediump 2-component vector of float)
-0:162      textureGrad (global lowp 4-component vector of float)
+0:162      textureGrad (global lowp 4-component vector of float, operation at mediump)
 0:162        's2Dg' (uniform lowp sampler2D)
 0:162        'uv2' (invariant uniform mediump 2-component vector of float)
 0:162        'uv2' (invariant uniform mediump 2-component vector of float)
diff --git a/Test/baseResults/300.frag.out b/Test/baseResults/300.frag.out
index a0c2615..2a3341a 100644
--- a/Test/baseResults/300.frag.out
+++ b/Test/baseResults/300.frag.out
@@ -72,20 +72,20 @@
 0:59            1.200000
 0:60      move second child to first child (temp lowp float)
 0:60        'f' (temp lowp float)
-0:60        textureOffset (global lowp float)
+0:60        textureOffset (global lowp float, operation at mediump)
 0:60          's2DShadow' (uniform lowp sampler2DShadow)
 0:60          'c3D' (smooth in lowp 3-component vector of float)
 0:60          'ic2D' (flat in mediump 2-component vector of int)
 0:60          'c1D' (smooth in lowp float)
 0:61      move second child to first child (temp lowp 4-component vector of float)
 0:61        'v' (temp lowp 4-component vector of float)
-0:61        textureFetch (global lowp 4-component vector of float)
+0:61        textureFetch (global lowp 4-component vector of float, operation at mediump)
 0:61          's3D' (uniform lowp sampler3D)
 0:61          'ic3D' (flat in mediump 3-component vector of int)
 0:61          'ic1D' (flat in mediump int)
 0:62      move second child to first child (temp lowp 4-component vector of float)
 0:62        'v' (temp lowp 4-component vector of float)
-0:62        textureFetchOffset (global lowp 4-component vector of float)
+0:62        textureFetchOffset (global lowp 4-component vector of float, operation at mediump)
 0:62          direct index (temp lowp sampler2D)
 0:62            'arrayedSampler' (uniform 5-element array of lowp sampler2D)
 0:62            Constant:
@@ -96,14 +96,14 @@
 0:62          'ic2D' (flat in mediump 2-component vector of int)
 0:63      move second child to first child (temp lowp float)
 0:63        'f' (temp lowp float)
-0:63        textureLodOffset (global lowp float)
+0:63        textureLodOffset (global lowp float, operation at mediump)
 0:63          's2DShadow' (uniform lowp sampler2DShadow)
 0:63          'c3D' (smooth in lowp 3-component vector of float)
 0:63          'c1D' (smooth in lowp float)
 0:63          'ic2D' (flat in mediump 2-component vector of int)
 0:64      move second child to first child (temp lowp 4-component vector of float)
 0:64        'v' (temp lowp 4-component vector of float)
-0:64        textureProjLodOffset (global lowp 4-component vector of float)
+0:64        textureProjLodOffset (global lowp 4-component vector of float, operation at mediump)
 0:64          's2D' (uniform lowp sampler2D)
 0:64          'c3D' (smooth in lowp 3-component vector of float)
 0:64          'c1D' (smooth in lowp float)
@@ -117,7 +117,7 @@
 0:65          'c3D' (smooth in lowp 3-component vector of float)
 0:66      move second child to first child (temp lowp float)
 0:66        'f' (temp lowp float)
-0:66        textureGradOffset (global lowp float)
+0:66        textureGradOffset (global lowp float, operation at mediump)
 0:66          's2DArrayShadow' (uniform lowp sampler2DArrayShadow)
 0:66          'c4D' (smooth temp lowp 4-component vector of float)
 0:66          'c2D' (smooth in lowp 2-component vector of float)
@@ -132,7 +132,7 @@
 0:67          'c3D' (smooth in lowp 3-component vector of float)
 0:68      move second child to first child (temp lowp 4-component vector of float)
 0:68        'v' (temp lowp 4-component vector of float)
-0:68        textureProjGradOffset (global lowp 4-component vector of float)
+0:68        textureProjGradOffset (global lowp 4-component vector of float, operation at mediump)
 0:68          's2D' (uniform lowp sampler2D)
 0:68          'c3D' (smooth in lowp 3-component vector of float)
 0:68          'c2D' (smooth in lowp 2-component vector of float)
@@ -152,7 +152,7 @@
 0:72          'c2D' (smooth in lowp 2-component vector of float)
 0:73      move second child to first child (temp mediump 4-component vector of int)
 0:73        'iv' (temp mediump 4-component vector of int)
-0:73        textureProjOffset (global lowp 4-component vector of int)
+0:73        textureProjOffset (global lowp 4-component vector of int, operation at mediump)
 0:73          'is2D' (uniform lowp isampler2D)
 0:73          'c4D' (smooth temp lowp 4-component vector of float)
 0:73          'ic2D' (flat in mediump 2-component vector of int)
@@ -184,7 +184,7 @@
 0:77          'c1D' (smooth in lowp float)
 0:78      move second child to first child (temp mediump 4-component vector of int)
 0:78        'iv' (temp mediump 4-component vector of int)
-0:78        textureFetch (global lowp 4-component vector of int)
+0:78        textureFetch (global lowp 4-component vector of int, operation at mediump)
 0:78          'is2DArray' (uniform lowp isampler2DArray)
 0:78          'ic3D' (flat in mediump 3-component vector of int)
 0:78          'ic1D' (flat in mediump int)
@@ -196,7 +196,7 @@
 0:80              0 (const int)
 0:80            Constant:
 0:80              1 (const int)
-0:80        textureSize (global highp 2-component vector of int)
+0:80        textureSize (global highp 2-component vector of int, operation at lowp)
 0:80          'sCubeShadow' (uniform lowp samplerCubeShadow)
 0:80          Constant:
 0:80            2 (const int)
@@ -428,20 +428,20 @@
 0:59            1.200000
 0:60      move second child to first child (temp lowp float)
 0:60        'f' (temp lowp float)
-0:60        textureOffset (global lowp float)
+0:60        textureOffset (global lowp float, operation at mediump)
 0:60          's2DShadow' (uniform lowp sampler2DShadow)
 0:60          'c3D' (smooth in lowp 3-component vector of float)
 0:60          'ic2D' (flat in mediump 2-component vector of int)
 0:60          'c1D' (smooth in lowp float)
 0:61      move second child to first child (temp lowp 4-component vector of float)
 0:61        'v' (temp lowp 4-component vector of float)
-0:61        textureFetch (global lowp 4-component vector of float)
+0:61        textureFetch (global lowp 4-component vector of float, operation at mediump)
 0:61          's3D' (uniform lowp sampler3D)
 0:61          'ic3D' (flat in mediump 3-component vector of int)
 0:61          'ic1D' (flat in mediump int)
 0:62      move second child to first child (temp lowp 4-component vector of float)
 0:62        'v' (temp lowp 4-component vector of float)
-0:62        textureFetchOffset (global lowp 4-component vector of float)
+0:62        textureFetchOffset (global lowp 4-component vector of float, operation at mediump)
 0:62          direct index (temp lowp sampler2D)
 0:62            'arrayedSampler' (uniform 5-element array of lowp sampler2D)
 0:62            Constant:
@@ -452,14 +452,14 @@
 0:62          'ic2D' (flat in mediump 2-component vector of int)
 0:63      move second child to first child (temp lowp float)
 0:63        'f' (temp lowp float)
-0:63        textureLodOffset (global lowp float)
+0:63        textureLodOffset (global lowp float, operation at mediump)
 0:63          's2DShadow' (uniform lowp sampler2DShadow)
 0:63          'c3D' (smooth in lowp 3-component vector of float)
 0:63          'c1D' (smooth in lowp float)
 0:63          'ic2D' (flat in mediump 2-component vector of int)
 0:64      move second child to first child (temp lowp 4-component vector of float)
 0:64        'v' (temp lowp 4-component vector of float)
-0:64        textureProjLodOffset (global lowp 4-component vector of float)
+0:64        textureProjLodOffset (global lowp 4-component vector of float, operation at mediump)
 0:64          's2D' (uniform lowp sampler2D)
 0:64          'c3D' (smooth in lowp 3-component vector of float)
 0:64          'c1D' (smooth in lowp float)
@@ -473,7 +473,7 @@
 0:65          'c3D' (smooth in lowp 3-component vector of float)
 0:66      move second child to first child (temp lowp float)
 0:66        'f' (temp lowp float)
-0:66        textureGradOffset (global lowp float)
+0:66        textureGradOffset (global lowp float, operation at mediump)
 0:66          's2DArrayShadow' (uniform lowp sampler2DArrayShadow)
 0:66          'c4D' (smooth temp lowp 4-component vector of float)
 0:66          'c2D' (smooth in lowp 2-component vector of float)
@@ -488,7 +488,7 @@
 0:67          'c3D' (smooth in lowp 3-component vector of float)
 0:68      move second child to first child (temp lowp 4-component vector of float)
 0:68        'v' (temp lowp 4-component vector of float)
-0:68        textureProjGradOffset (global lowp 4-component vector of float)
+0:68        textureProjGradOffset (global lowp 4-component vector of float, operation at mediump)
 0:68          's2D' (uniform lowp sampler2D)
 0:68          'c3D' (smooth in lowp 3-component vector of float)
 0:68          'c2D' (smooth in lowp 2-component vector of float)
@@ -508,7 +508,7 @@
 0:72          'c2D' (smooth in lowp 2-component vector of float)
 0:73      move second child to first child (temp mediump 4-component vector of int)
 0:73        'iv' (temp mediump 4-component vector of int)
-0:73        textureProjOffset (global lowp 4-component vector of int)
+0:73        textureProjOffset (global lowp 4-component vector of int, operation at mediump)
 0:73          'is2D' (uniform lowp isampler2D)
 0:73          'c4D' (smooth temp lowp 4-component vector of float)
 0:73          'ic2D' (flat in mediump 2-component vector of int)
@@ -540,7 +540,7 @@
 0:77          'c1D' (smooth in lowp float)
 0:78      move second child to first child (temp mediump 4-component vector of int)
 0:78        'iv' (temp mediump 4-component vector of int)
-0:78        textureFetch (global lowp 4-component vector of int)
+0:78        textureFetch (global lowp 4-component vector of int, operation at mediump)
 0:78          'is2DArray' (uniform lowp isampler2DArray)
 0:78          'ic3D' (flat in mediump 3-component vector of int)
 0:78          'ic1D' (flat in mediump int)
@@ -552,7 +552,7 @@
 0:80              0 (const int)
 0:80            Constant:
 0:80              1 (const int)
-0:80        textureSize (global highp 2-component vector of int)
+0:80        textureSize (global highp 2-component vector of int, operation at lowp)
 0:80          'sCubeShadow' (uniform lowp samplerCubeShadow)
 0:80          Constant:
 0:80            2 (const int)
diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index 80745ab..66a0651 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -175,7 +175,7 @@
 0:120      Sequence
 0:120        move second child to first child (temp highp 2-component vector of int)
 0:120          'x1' (temp highp 2-component vector of int)
-0:120          textureSize (global highp 2-component vector of int)
+0:120          textureSize (global highp 2-component vector of int, operation at lowp)
 0:120            's2D' (uniform lowp sampler2D)
 0:120            Constant:
 0:120              2 (const int)
@@ -184,7 +184,7 @@
 0:122      Sequence
 0:122        move second child to first child (temp highp 3-component vector of int)
 0:122          'x3' (temp highp 3-component vector of int)
-0:122          textureSize (global highp 3-component vector of int)
+0:122          textureSize (global highp 3-component vector of int, operation at lowp)
 0:122            's2DAS' (uniform lowp sampler2DArrayShadow)
 0:122            Constant:
 0:122              -1 (const int)
@@ -193,7 +193,7 @@
 0:124      Sequence
 0:124        move second child to first child (temp highp 4-component vector of float)
 0:124          'x4' (temp highp 4-component vector of float)
-0:124          texture (global lowp 4-component vector of float)
+0:124          texture (global lowp 4-component vector of float, operation at highp)
 0:124            's2D' (uniform lowp sampler2D)
 0:124            'c2D' (in highp 2-component vector of float)
 0:125      Constant:
@@ -217,7 +217,7 @@
 0:128      Sequence
 0:128        move second child to first child (temp highp float)
 0:128          'x6' (temp highp float)
-0:128          textureProjGradOffset (global lowp float)
+0:128          textureProjGradOffset (global lowp float, operation at highp)
 0:128            's2DS' (uniform lowp sampler2DShadow)
 0:128            'invIn' (invariant in highp 4-component vector of float)
 0:128            Constant:
@@ -459,7 +459,7 @@
 0:120      Sequence
 0:120        move second child to first child (temp highp 2-component vector of int)
 0:120          'x1' (temp highp 2-component vector of int)
-0:120          textureSize (global highp 2-component vector of int)
+0:120          textureSize (global highp 2-component vector of int, operation at lowp)
 0:120            's2D' (uniform lowp sampler2D)
 0:120            Constant:
 0:120              2 (const int)
@@ -468,7 +468,7 @@
 0:122      Sequence
 0:122        move second child to first child (temp highp 3-component vector of int)
 0:122          'x3' (temp highp 3-component vector of int)
-0:122          textureSize (global highp 3-component vector of int)
+0:122          textureSize (global highp 3-component vector of int, operation at lowp)
 0:122            's2DAS' (uniform lowp sampler2DArrayShadow)
 0:122            Constant:
 0:122              -1 (const int)
@@ -477,7 +477,7 @@
 0:124      Sequence
 0:124        move second child to first child (temp highp 4-component vector of float)
 0:124          'x4' (temp highp 4-component vector of float)
-0:124          texture (global lowp 4-component vector of float)
+0:124          texture (global lowp 4-component vector of float, operation at highp)
 0:124            's2D' (uniform lowp sampler2D)
 0:124            'c2D' (in highp 2-component vector of float)
 0:125      Constant:
@@ -501,7 +501,7 @@
 0:128      Sequence
 0:128        move second child to first child (temp highp float)
 0:128          'x6' (temp highp float)
-0:128          textureProjGradOffset (global lowp float)
+0:128          textureProjGradOffset (global lowp float, operation at highp)
 0:128            's2DS' (uniform lowp sampler2DShadow)
 0:128            'invIn' (invariant in highp 4-component vector of float)
 0:128            Constant:
diff --git a/Test/baseResults/300BuiltIns.frag.out b/Test/baseResults/300BuiltIns.frag.out
index c2f12c9..a3bab69 100644
--- a/Test/baseResults/300BuiltIns.frag.out
+++ b/Test/baseResults/300BuiltIns.frag.out
@@ -128,12 +128,12 @@
 0:52      Sequence
 0:52        move second child to first child (temp 2-component vector of bool)
 0:52          'b10' (temp 2-component vector of bool)
-0:52          isnan (global 2-component vector of bool)
+0:52          isnan (global 2-component vector of bool, operation at mediump)
 0:52            'v2a' (global mediump 2-component vector of float)
 0:53      Sequence
 0:53        move second child to first child (temp 4-component vector of bool)
 0:53          'b11' (temp 4-component vector of bool)
-0:53          isinf (global 4-component vector of bool)
+0:53          isinf (global 4-component vector of bool, operation at mediump)
 0:53            'v4' (global mediump 4-component vector of float)
 0:56      Sequence
 0:56        move second child to first child (temp highp int)
@@ -158,17 +158,17 @@
 0:62      Sequence
 0:62        move second child to first child (temp highp uint)
 0:62          'u19' (temp mediump uint)
-0:62          packSnorm2x16 (global highp uint)
+0:62          packSnorm2x16 (global highp uint, operation at mediump)
 0:62            'v2a' (global mediump 2-component vector of float)
 0:63      Sequence
-0:63        move second child to first child (temp mediump 2-component vector of float)
+0:63        move second child to first child (temp highp 2-component vector of float)
 0:63          'v20' (temp mediump 2-component vector of float)
-0:63          unpackSnorm2x16 (global mediump 2-component vector of float)
+0:63          unpackSnorm2x16 (global highp 2-component vector of float)
 0:63            'uy' (global mediump uint)
 0:64      Sequence
 0:64        move second child to first child (temp highp uint)
 0:64          'u15' (temp mediump uint)
-0:64          packUnorm2x16 (global highp uint)
+0:64          packUnorm2x16 (global highp uint, operation at mediump)
 0:64            'v2a' (global mediump 2-component vector of float)
 0:65      Sequence
 0:65        move second child to first child (temp highp 2-component vector of float)
@@ -178,12 +178,12 @@
 0:66      Sequence
 0:66        move second child to first child (temp highp uint)
 0:66          'u17' (temp mediump uint)
-0:66          packHalf2x16 (global highp uint)
+0:66          packHalf2x16 (global highp uint, operation at mediump)
 0:66            'v2b' (global mediump 2-component vector of float)
 0:67      Sequence
 0:67        move second child to first child (temp mediump 2-component vector of float)
 0:67          'v18' (temp mediump 2-component vector of float)
-0:67          unpackHalf2x16 (global mediump 2-component vector of float)
+0:67          unpackHalf2x16 (global mediump 2-component vector of float, operation at highp)
 0:67            'uy' (global mediump uint)
 0:70      Constant:
 0:70        0.000000
@@ -335,12 +335,12 @@
 0:52      Sequence
 0:52        move second child to first child (temp 2-component vector of bool)
 0:52          'b10' (temp 2-component vector of bool)
-0:52          isnan (global 2-component vector of bool)
+0:52          isnan (global 2-component vector of bool, operation at mediump)
 0:52            'v2a' (global mediump 2-component vector of float)
 0:53      Sequence
 0:53        move second child to first child (temp 4-component vector of bool)
 0:53          'b11' (temp 4-component vector of bool)
-0:53          isinf (global 4-component vector of bool)
+0:53          isinf (global 4-component vector of bool, operation at mediump)
 0:53            'v4' (global mediump 4-component vector of float)
 0:56      Sequence
 0:56        move second child to first child (temp highp int)
@@ -365,17 +365,17 @@
 0:62      Sequence
 0:62        move second child to first child (temp highp uint)
 0:62          'u19' (temp mediump uint)
-0:62          packSnorm2x16 (global highp uint)
+0:62          packSnorm2x16 (global highp uint, operation at mediump)
 0:62            'v2a' (global mediump 2-component vector of float)
 0:63      Sequence
-0:63        move second child to first child (temp mediump 2-component vector of float)
+0:63        move second child to first child (temp highp 2-component vector of float)
 0:63          'v20' (temp mediump 2-component vector of float)
-0:63          unpackSnorm2x16 (global mediump 2-component vector of float)
+0:63          unpackSnorm2x16 (global highp 2-component vector of float)
 0:63            'uy' (global mediump uint)
 0:64      Sequence
 0:64        move second child to first child (temp highp uint)
 0:64          'u15' (temp mediump uint)
-0:64          packUnorm2x16 (global highp uint)
+0:64          packUnorm2x16 (global highp uint, operation at mediump)
 0:64            'v2a' (global mediump 2-component vector of float)
 0:65      Sequence
 0:65        move second child to first child (temp highp 2-component vector of float)
@@ -385,12 +385,12 @@
 0:66      Sequence
 0:66        move second child to first child (temp highp uint)
 0:66          'u17' (temp mediump uint)
-0:66          packHalf2x16 (global highp uint)
+0:66          packHalf2x16 (global highp uint, operation at mediump)
 0:66            'v2b' (global mediump 2-component vector of float)
 0:67      Sequence
 0:67        move second child to first child (temp mediump 2-component vector of float)
 0:67          'v18' (temp mediump 2-component vector of float)
-0:67          unpackHalf2x16 (global mediump 2-component vector of float)
+0:67          unpackHalf2x16 (global mediump 2-component vector of float, operation at highp)
 0:67            'uy' (global mediump uint)
 0:70      Constant:
 0:70        0.000000
diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index b56f070..9a5e4e8 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -122,7 +122,7 @@
 0:61            2 (const int)
 0:61        Constant:
 0:61          4.700000
-0:62      array length (temp highp int)
+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          Constant:
@@ -178,9 +178,9 @@
 0:92          0 (const int)
 0:92          0 (const int)
 0:92          0 (const int)
-0:93      imageLoad (global highp 4-component vector of float)
+0:93      imageLoad (global mediump 4-component vector of float)
 0:93        'img2Drgba' (layout(rgba32f ) readonly uniform mediump image2D)
-0:93        Construct ivec2 (temp highp 2-component vector of int)
+0:93        Construct ivec2 (temp mediump 2-component vector of int)
 0:93          'i' (temp highp int)
 0:93          'i' (temp highp int)
 0:94      imageLoad (global highp 4-component vector of int)
@@ -549,7 +549,7 @@
 0:61            2 (const int)
 0:61        Constant:
 0:61          4.700000
-0:62      array length (temp highp int)
+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          Constant:
@@ -605,9 +605,9 @@
 0:92          0 (const int)
 0:92          0 (const int)
 0:92          0 (const int)
-0:93      imageLoad (global highp 4-component vector of float)
+0:93      imageLoad (global mediump 4-component vector of float)
 0:93        'img2Drgba' (layout(rgba32f ) readonly uniform mediump image2D)
-0:93        Construct ivec2 (temp highp 2-component vector of int)
+0:93        Construct ivec2 (temp mediump 2-component vector of int)
 0:93          'i' (temp highp int)
 0:93          'i' (temp highp int)
 0:94      imageLoad (global highp 4-component vector of int)
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 905a9ca..6cfd3f4 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -353,7 +353,7 @@
 0:101              3 (const int)
 0:102      move second child to first child (temp highp 2-component vector of int)
 0:102        'v2' (temp highp 2-component vector of int)
-0:102        textureSize (global highp 2-component vector of int)
+0:102        textureSize (global highp 2-component vector of int, operation at mediump)
 0:102          's2dms' (uniform mediump sampler2DMS)
 0:103      move second child to first child (temp highp 2-component vector of int)
 0:103        'v2' (temp highp 2-component vector of int)
@@ -361,19 +361,19 @@
 0:103          'i2D' (layout(binding=2 ) writeonly uniform highp image2D)
 0:104      move second child to first child (temp highp 3-component vector of int)
 0:104        'v3' (temp highp 3-component vector of int)
-0:104        imageQuerySize (global highp 3-component vector of int)
+0:104        imageQuerySize (global highp 3-component vector of int, operation at mediump)
 0:104          'i3D' (layout(binding=4 ) readonly uniform mediump image3D)
 0:105      move second child to first child (temp highp 2-component vector of int)
 0:105        'v2' (temp highp 2-component vector of int)
-0:105        imageQuerySize (global highp 2-component vector of int)
+0:105        imageQuerySize (global highp 2-component vector of int, operation at mediump)
 0:105          'iCube' (layout(binding=5 ) uniform mediump imageCube)
 0:106      move second child to first child (temp highp 3-component vector of int)
 0:106        'v3' (temp highp 3-component vector of int)
-0:106        imageQuerySize (global highp 3-component vector of int)
+0:106        imageQuerySize (global highp 3-component vector of int, operation at mediump)
 0:106          'i2DA' (layout(binding=6 ) uniform mediump image2DArray)
 0:107      move second child to first child (temp highp 2-component vector of int)
 0:107        'v2' (temp highp 2-component vector of int)
-0:107        imageQuerySize (global highp 2-component vector of int)
+0:107        imageQuerySize (global highp 2-component vector of int, operation at mediump)
 0:107          'i2Dqualified' (layout(binding=6 ) coherent volatile restrict uniform mediump image2D)
 0:165  Function Definition: fooIO( (global void)
 0:165    Function Parameters: 
@@ -1234,7 +1234,7 @@
 0:101              3 (const int)
 0:102      move second child to first child (temp highp 2-component vector of int)
 0:102        'v2' (temp highp 2-component vector of int)
-0:102        textureSize (global highp 2-component vector of int)
+0:102        textureSize (global highp 2-component vector of int, operation at mediump)
 0:102          's2dms' (uniform mediump sampler2DMS)
 0:103      move second child to first child (temp highp 2-component vector of int)
 0:103        'v2' (temp highp 2-component vector of int)
@@ -1242,19 +1242,19 @@
 0:103          'i2D' (layout(binding=2 ) writeonly uniform highp image2D)
 0:104      move second child to first child (temp highp 3-component vector of int)
 0:104        'v3' (temp highp 3-component vector of int)
-0:104        imageQuerySize (global highp 3-component vector of int)
+0:104        imageQuerySize (global highp 3-component vector of int, operation at mediump)
 0:104          'i3D' (layout(binding=4 ) readonly uniform mediump image3D)
 0:105      move second child to first child (temp highp 2-component vector of int)
 0:105        'v2' (temp highp 2-component vector of int)
-0:105        imageQuerySize (global highp 2-component vector of int)
+0:105        imageQuerySize (global highp 2-component vector of int, operation at mediump)
 0:105          'iCube' (layout(binding=5 ) uniform mediump imageCube)
 0:106      move second child to first child (temp highp 3-component vector of int)
 0:106        'v3' (temp highp 3-component vector of int)
-0:106        imageQuerySize (global highp 3-component vector of int)
+0:106        imageQuerySize (global highp 3-component vector of int, operation at mediump)
 0:106          'i2DA' (layout(binding=6 ) uniform mediump image2DArray)
 0:107      move second child to first child (temp highp 2-component vector of int)
 0:107        'v2' (temp highp 2-component vector of int)
-0:107        imageQuerySize (global highp 2-component vector of int)
+0:107        imageQuerySize (global highp 2-component vector of int, operation at mediump)
 0:107          'i2Dqualified' (layout(binding=6 ) coherent volatile restrict uniform mediump image2D)
 0:165  Function Definition: fooIO( (global void)
 0:165    Function Parameters: 
diff --git a/Test/baseResults/310.vert.out b/Test/baseResults/310.vert.out
index 678c3e1..84a50e8 100644
--- a/Test/baseResults/310.vert.out
+++ b/Test/baseResults/310.vert.out
@@ -125,12 +125,12 @@
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
-0:19      uMulExtended (global void)
+0:19      uMulExtended (global highp void)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
-0:21      iMulExtended (global void)
+0:21      iMulExtended (global highp void)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
@@ -179,27 +179,27 @@
 0:31          'u4' (temp highp 4-component vector of uint)
 0:32      move second child to first child (temp highp int)
 0:32        'i1' (temp highp int)
-0:32        bitCount (global highp int)
+0:32        bitCount (global lowp int, operation at highp)
 0:32          'i1' (temp highp int)
 0:33      move second child to first child (temp highp 3-component vector of int)
 0:33        'i3' (temp highp 3-component vector of int)
-0:33        bitCount (global highp 3-component vector of int)
+0:33        bitCount (global lowp 3-component vector of int, operation at highp)
 0:33          'u3' (temp highp 3-component vector of uint)
 0:34      move second child to first child (temp highp 2-component vector of int)
 0:34        'i2' (temp highp 2-component vector of int)
-0:34        findLSB (global highp 2-component vector of int)
+0:34        findLSB (global lowp 2-component vector of int, operation at highp)
 0:34          'i2' (temp highp 2-component vector of int)
 0:35      move second child to first child (temp highp 4-component vector of int)
 0:35        'i4' (temp highp 4-component vector of int)
-0:35        findLSB (global highp 4-component vector of int)
+0:35        findLSB (global lowp 4-component vector of int, operation at highp)
 0:35          'u4' (temp highp 4-component vector of uint)
 0:36      move second child to first child (temp highp int)
 0:36        'i1' (temp highp int)
-0:36        findMSB (global highp int)
+0:36        findMSB (global lowp int, operation at highp)
 0:36          'i1' (temp highp int)
 0:37      move second child to first child (temp highp 2-component vector of int)
 0:37        'i2' (temp highp 2-component vector of int)
-0:37        findMSB (global highp 2-component vector of int)
+0:37        findMSB (global lowp 2-component vector of int, operation at highp)
 0:37          'u2' (temp highp 2-component vector of uint)
 0:40      move second child to first child (temp highp 3-component vector of float)
 0:40        'v3' (temp highp 3-component vector of float)
@@ -213,19 +213,19 @@
 0:42          'i2' (temp highp 2-component vector of int)
 0:45      move second child to first child (temp highp uint)
 0:45        'u1' (temp highp uint)
-0:45        PackUnorm4x8 (global highp uint)
+0:45        PackUnorm4x8 (global highp uint, operation at mediump)
 0:45          'v4' (temp mediump 4-component vector of float)
 0:46      move second child to first child (temp highp uint)
 0:46        'u1' (temp highp uint)
-0:46        PackSnorm4x8 (global highp uint)
+0:46        PackSnorm4x8 (global highp uint, operation at mediump)
 0:46          'v4' (temp mediump 4-component vector of float)
-0:47      move second child to first child (temp highp 4-component vector of float)
+0:47      move second child to first child (temp mediump 4-component vector of float)
 0:47        'v4' (temp mediump 4-component vector of float)
-0:47        UnpackUnorm4x8 (global highp 4-component vector of float)
+0:47        UnpackUnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:47          'u1' (temp highp uint)
-0:48      move second child to first child (temp highp 4-component vector of float)
+0:48      move second child to first child (temp mediump 4-component vector of float)
 0:48        'v4' (temp mediump 4-component vector of float)
-0:48        UnpackSnorm4x8 (global highp 4-component vector of float)
+0:48        UnpackSnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:48          'u1' (temp highp uint)
 0:60  Function Definition: foo( (global void)
 0:60    Function Parameters: 
@@ -340,7 +340,7 @@
 0:165          0.100000
 0:165        Convert float to int (temp lowp 2-component vector of int)
 0:165          'inf' (in highp 2-component vector of float)
-0:166      textureGatherOffsets (global lowp 4-component vector of float)
+0:166      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:166        direct index (temp lowp sampler2D)
 0:166          'sArray' (uniform 4-element array of lowp sampler2D)
 0:166          Constant:
@@ -404,7 +404,7 @@
 0:180          0.100000
 0:180        Convert float to int (temp lowp 2-component vector of int)
 0:180          'inf' (in highp 2-component vector of float)
-0:181      textureGatherOffsets (global lowp 4-component vector of float)
+0:181      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:181        direct index (temp lowp sampler2D)
 0:181          'sArray' (uniform 4-element array of lowp sampler2D)
 0:181          Constant:
@@ -421,7 +421,7 @@
 0:181          0 (const int)
 0:181          0 (const int)
 0:181          0 (const int)
-0:182      textureGatherOffsets (global lowp 4-component vector of float)
+0:182      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:182        direct index (temp lowp sampler2D)
 0:182          'sArray' (uniform 4-element array of lowp sampler2D)
 0:182          Constant:
@@ -1056,12 +1056,12 @@
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
-0:19      uMulExtended (global void)
+0:19      uMulExtended (global highp void)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
-0:21      iMulExtended (global void)
+0:21      iMulExtended (global highp void)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
@@ -1110,27 +1110,27 @@
 0:31          'u4' (temp highp 4-component vector of uint)
 0:32      move second child to first child (temp highp int)
 0:32        'i1' (temp highp int)
-0:32        bitCount (global highp int)
+0:32        bitCount (global lowp int, operation at highp)
 0:32          'i1' (temp highp int)
 0:33      move second child to first child (temp highp 3-component vector of int)
 0:33        'i3' (temp highp 3-component vector of int)
-0:33        bitCount (global highp 3-component vector of int)
+0:33        bitCount (global lowp 3-component vector of int, operation at highp)
 0:33          'u3' (temp highp 3-component vector of uint)
 0:34      move second child to first child (temp highp 2-component vector of int)
 0:34        'i2' (temp highp 2-component vector of int)
-0:34        findLSB (global highp 2-component vector of int)
+0:34        findLSB (global lowp 2-component vector of int, operation at highp)
 0:34          'i2' (temp highp 2-component vector of int)
 0:35      move second child to first child (temp highp 4-component vector of int)
 0:35        'i4' (temp highp 4-component vector of int)
-0:35        findLSB (global highp 4-component vector of int)
+0:35        findLSB (global lowp 4-component vector of int, operation at highp)
 0:35          'u4' (temp highp 4-component vector of uint)
 0:36      move second child to first child (temp highp int)
 0:36        'i1' (temp highp int)
-0:36        findMSB (global highp int)
+0:36        findMSB (global lowp int, operation at highp)
 0:36          'i1' (temp highp int)
 0:37      move second child to first child (temp highp 2-component vector of int)
 0:37        'i2' (temp highp 2-component vector of int)
-0:37        findMSB (global highp 2-component vector of int)
+0:37        findMSB (global lowp 2-component vector of int, operation at highp)
 0:37          'u2' (temp highp 2-component vector of uint)
 0:40      move second child to first child (temp highp 3-component vector of float)
 0:40        'v3' (temp highp 3-component vector of float)
@@ -1144,19 +1144,19 @@
 0:42          'i2' (temp highp 2-component vector of int)
 0:45      move second child to first child (temp highp uint)
 0:45        'u1' (temp highp uint)
-0:45        PackUnorm4x8 (global highp uint)
+0:45        PackUnorm4x8 (global highp uint, operation at mediump)
 0:45          'v4' (temp mediump 4-component vector of float)
 0:46      move second child to first child (temp highp uint)
 0:46        'u1' (temp highp uint)
-0:46        PackSnorm4x8 (global highp uint)
+0:46        PackSnorm4x8 (global highp uint, operation at mediump)
 0:46          'v4' (temp mediump 4-component vector of float)
-0:47      move second child to first child (temp highp 4-component vector of float)
+0:47      move second child to first child (temp mediump 4-component vector of float)
 0:47        'v4' (temp mediump 4-component vector of float)
-0:47        UnpackUnorm4x8 (global highp 4-component vector of float)
+0:47        UnpackUnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:47          'u1' (temp highp uint)
-0:48      move second child to first child (temp highp 4-component vector of float)
+0:48      move second child to first child (temp mediump 4-component vector of float)
 0:48        'v4' (temp mediump 4-component vector of float)
-0:48        UnpackSnorm4x8 (global highp 4-component vector of float)
+0:48        UnpackSnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:48          'u1' (temp highp uint)
 0:60  Function Definition: foo( (global void)
 0:60    Function Parameters: 
@@ -1271,7 +1271,7 @@
 0:165          0.100000
 0:165        Convert float to int (temp lowp 2-component vector of int)
 0:165          'inf' (in highp 2-component vector of float)
-0:166      textureGatherOffsets (global lowp 4-component vector of float)
+0:166      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:166        direct index (temp lowp sampler2D)
 0:166          'sArray' (uniform 4-element array of lowp sampler2D)
 0:166          Constant:
@@ -1335,7 +1335,7 @@
 0:180          0.100000
 0:180        Convert float to int (temp lowp 2-component vector of int)
 0:180          'inf' (in highp 2-component vector of float)
-0:181      textureGatherOffsets (global lowp 4-component vector of float)
+0:181      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:181        direct index (temp lowp sampler2D)
 0:181          'sArray' (uniform 4-element array of lowp sampler2D)
 0:181          Constant:
@@ -1352,7 +1352,7 @@
 0:181          0 (const int)
 0:181          0 (const int)
 0:181          0 (const int)
-0:182      textureGatherOffsets (global lowp 4-component vector of float)
+0:182      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:182        direct index (temp lowp sampler2D)
 0:182          'sArray' (uniform 4-element array of lowp sampler2D)
 0:182          Constant:
diff --git a/Test/baseResults/310AofA.vert.out b/Test/baseResults/310AofA.vert.out
index 40c4321..83f105c 100644
--- a/Test/baseResults/310AofA.vert.out
+++ b/Test/baseResults/310AofA.vert.out
@@ -310,7 +310,7 @@
 0:96          1 (const int)
 0:98      Constant:
 0:98        7 (const int)
-0:99      array length (temp highp 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})
@@ -622,7 +622,7 @@
 0:96          1 (const int)
 0:98      Constant:
 0:98        7 (const int)
-0:99      array length (temp highp 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})
diff --git a/Test/baseResults/440.vert.out b/Test/baseResults/440.vert.out
index d4cbb0b..2e1f5fe 100644
--- a/Test/baseResults/440.vert.out
+++ b/Test/baseResults/440.vert.out
@@ -23,74 +23,75 @@
 ERROR: 0:67: 'component' : type overflows the available 4 components 
 ERROR: 0:71: 'location' : overlapping use of location 55
 ERROR: 0:75: 'location' : overlapping use of location 57
-ERROR: 0:92: 'xfb layout qualifier' : can only be used on an output 
-ERROR: 0:98: 'xfb_offset' : cannot declare a default, use a full declaration 
-ERROR: 0:108: 'xfb_buffer' : member cannot contradict block (or what block inherited from global) 
-ERROR: 0:113: 'xfb_buffer' : member cannot contradict block (or what block inherited from global) 
-ERROR: 0:113: 'xfb_offset' : overlapping offsets at offset 32 in buffer 3
-ERROR: 0:114: 'xfb_offset' : overlapping offsets at offset 0 in buffer 2
-ERROR: 0:116: 'xfb_offset' : overlapping offsets at offset 24 in buffer 2
-ERROR: 0:119: 'xfb_stride' : all stride settings must match for xfb buffer 15
-ERROR: 0:123: 'xfb_offset' : overlapping offsets at offset 4 in buffer 1
-ERROR: 0:125: 'xfb_stride' : all stride settings must match for xfb buffer 3
-ERROR: 0:126: 'xfb_stride' : all stride settings must match for xfb buffer 3
-ERROR: 0:130: 'xfb_stride' : all stride settings must match for xfb buffer 3
+ERROR: 0:78: 'location' : overlapping use of location 59
+ERROR: 0:95: 'xfb layout qualifier' : can only be used on an output 
+ERROR: 0:101: 'xfb_offset' : cannot declare a default, use a full declaration 
+ERROR: 0:111: 'xfb_buffer' : member cannot contradict block (or what block inherited from global) 
+ERROR: 0:116: 'xfb_buffer' : member cannot contradict block (or what block inherited from global) 
+ERROR: 0:116: 'xfb_offset' : overlapping offsets at offset 32 in buffer 3
+ERROR: 0:117: 'xfb_offset' : overlapping offsets at offset 0 in buffer 2
+ERROR: 0:119: 'xfb_offset' : overlapping offsets at offset 24 in buffer 2
+ERROR: 0:122: 'xfb_stride' : all stride settings must match for xfb buffer 15
+ERROR: 0:126: 'xfb_offset' : overlapping offsets at offset 4 in buffer 1
 ERROR: 0:128: 'xfb_stride' : all stride settings must match for xfb buffer 3
-ERROR: 0:149: 'xfb_offset' : overlapping offsets at offset 64 in buffer 0
-ERROR: 0:154: 'xfb_buffer' : buffer is too large: gl_MaxTransformFeedbackBuffers is 4
-ERROR: 0:155: 'xfb_offset' : must be a multiple of size of first component 
-ERROR: 0:156: 'xfb_offset' : type contains double; xfb_offset must be a multiple of 8 
+ERROR: 0:129: 'xfb_stride' : all stride settings must match for xfb buffer 3
+ERROR: 0:133: 'xfb_stride' : all stride settings must match for xfb buffer 3
+ERROR: 0:131: 'xfb_stride' : all stride settings must match for xfb buffer 3
+ERROR: 0:152: 'xfb_offset' : overlapping offsets at offset 64 in buffer 0
+ERROR: 0:157: 'xfb_buffer' : buffer is too large: gl_MaxTransformFeedbackBuffers is 4
 ERROR: 0:158: 'xfb_offset' : must be a multiple of size of first component 
 ERROR: 0:159: 'xfb_offset' : type contains double; xfb_offset must be a multiple of 8 
-ERROR: 0:163: 'xfb_buffer' : buffer is too large: gl_MaxTransformFeedbackBuffers is 4
+ERROR: 0:161: 'xfb_offset' : must be a multiple of size of first component 
+ERROR: 0:162: 'xfb_offset' : type contains double; xfb_offset must be a multiple of 8 
 ERROR: 0:166: 'xfb_buffer' : buffer is too large: gl_MaxTransformFeedbackBuffers is 4
-ERROR: 0:166: 'xfb_stride' : 1/4 stride is too large: gl_MaxTransformFeedbackInterleavedComponents is 64
-ERROR: 0:168: 'xfb_buffer' : buffer is too large: gl_MaxTransformFeedbackBuffers is 4
-ERROR: 0:176: 'gl_BaseVertexARB' : required extension not requested: GL_ARB_shader_draw_parameters
-ERROR: 0:176: 'gl_BaseInstanceARB' : required extension not requested: GL_ARB_shader_draw_parameters
-ERROR: 0:176: 'gl_DrawIDARB' : required extension not requested: GL_ARB_shader_draw_parameters
-ERROR: 0:184: 'assign' :  l-value required "gl_BaseVertexARB" (can't modify shader input)
-ERROR: 0:185: 'assign' :  l-value required "gl_BaseInstanceARB" (can't modify shader input)
-ERROR: 0:186: 'assign' :  l-value required "gl_DrawIDARB" (can't modify shader input)
-ERROR: 0:187: 'glBaseInstanceARB' : undeclared identifier 
-ERROR: 53 compilation errors.  No code generated.
+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.
 
 
 Shader version: 440
 Requested GL_ARB_shader_draw_parameters
 in xfb mode
 ERROR: node is still EOpNull!
-0:174  Function Definition: drawParamsBad( (global int)
-0:174    Function Parameters: 
-0:176    Sequence
-0:176      Branch: Return with expression
-0:176        add (temp int)
-0:176          add (temp int)
-0:176            'gl_BaseVertexARB' (in int BaseVertex)
-0:176            'gl_BaseInstanceARB' (in int BaseInstance)
-0:176          'gl_DrawIDARB' (in int DrawId)
-0:181  Function Definition: drawParams( (global int)
-0:181    Function Parameters: 
-0:183    Sequence
-0:183      Branch: Return with expression
-0:183        add (temp int)
-0:183          add (temp int)
-0:183            'gl_BaseVertexARB' (in int BaseVertex)
-0:183            'gl_BaseInstanceARB' (in int BaseInstance)
-0:183          'gl_DrawIDARB' (in int DrawId)
-0:184      move second child to first child (temp int)
-0:184        'gl_BaseVertexARB' (in int BaseVertex)
-0:184        Constant:
-0:184          3 (const int)
-0:185      move second child to first child (temp int)
-0:185        'gl_BaseInstanceARB' (in int BaseInstance)
-0:185        Constant:
-0:185          3 (const int)
-0:186      move second child to first child (temp int)
-0:186        'gl_DrawIDARB' (in int DrawId)
-0:186        Constant:
-0:186          3 (const int)
-0:187      'glBaseInstanceARB' (temp float)
+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:?   Linker Objects
 0:?     'a' (layout(location=2 component=2 ) in 2-component vector of float)
 0:?     'b' (layout(location=2 component=1 ) in float)
@@ -133,6 +134,9 @@
 0:?     'sf2o' (layout(location=56 component=3 ) smooth out float)
 0:?     'dv3o' (layout(location=57 component=2 ) smooth out 2-component vector of float)
 0:?     'sf4o' (layout(location=57 component=3 ) smooth out float)
+0:?     'dv3o2' (layout(location=58 ) flat out 3-component vector of double)
+0:?     'dfo3' (layout(location=59 component=2 ) flat out double)
+0:?     'dfo4' (layout(location=59 component=0 ) flat out double)
 0:?     'bbinst1' (out block{out 4-component vector of float bbv})
 0:?     'bbinst2' (out block{layout(xfb_buffer=0 xfb_offset=64 ) out 4-component vector of float bbv})
 0:?     'bbinst3' (out block{layout(xfb_buffer=3 xfb_offset=16 ) out 4-component vector of float bbv})
@@ -170,37 +174,37 @@
 Requested GL_ARB_shader_draw_parameters
 in xfb mode
 ERROR: node is still EOpNull!
-0:174  Function Definition: drawParamsBad( (global int)
-0:174    Function Parameters: 
-0:176    Sequence
-0:176      Branch: Return with expression
-0:176        add (temp int)
-0:176          add (temp int)
-0:176            'gl_BaseVertexARB' (in int BaseVertex)
-0:176            'gl_BaseInstanceARB' (in int BaseInstance)
-0:176          'gl_DrawIDARB' (in int DrawId)
-0:181  Function Definition: drawParams( (global int)
-0:181    Function Parameters: 
-0:183    Sequence
-0:183      Branch: Return with expression
-0:183        add (temp int)
-0:183          add (temp int)
-0:183            'gl_BaseVertexARB' (in int BaseVertex)
-0:183            'gl_BaseInstanceARB' (in int BaseInstance)
-0:183          'gl_DrawIDARB' (in int DrawId)
-0:184      move second child to first child (temp int)
-0:184        'gl_BaseVertexARB' (in int BaseVertex)
-0:184        Constant:
-0:184          3 (const int)
-0:185      move second child to first child (temp int)
-0:185        'gl_BaseInstanceARB' (in int BaseInstance)
-0:185        Constant:
-0:185          3 (const int)
-0:186      move second child to first child (temp int)
-0:186        'gl_DrawIDARB' (in int DrawId)
-0:186        Constant:
-0:186          3 (const int)
-0:187      'glBaseInstanceARB' (temp float)
+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:?   Linker Objects
 0:?     'a' (layout(location=2 component=2 ) in 2-component vector of float)
 0:?     'b' (layout(location=2 component=1 ) in float)
@@ -243,6 +247,9 @@
 0:?     'sf2o' (layout(location=56 component=3 ) smooth out float)
 0:?     'dv3o' (layout(location=57 component=2 ) smooth out 2-component vector of float)
 0:?     'sf4o' (layout(location=57 component=3 ) smooth out float)
+0:?     'dv3o2' (layout(location=58 ) flat out 3-component vector of double)
+0:?     'dfo3' (layout(location=59 component=2 ) flat out double)
+0:?     'dfo4' (layout(location=59 component=0 ) flat out double)
 0:?     'bbinst1' (out block{out 4-component vector of float bbv})
 0:?     'bbinst2' (out block{layout(xfb_buffer=0 xfb_offset=64 ) out 4-component vector of float bbv})
 0:?     'bbinst3' (out block{layout(xfb_buffer=3 xfb_offset=16 ) out 4-component vector of float bbv})
diff --git a/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
new file mode 100644
index 0000000..cad56b6
--- /dev/null
+++ b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
@@ -0,0 +1,884 @@
+hlsl.gatherRGBA.array.dx10.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:72  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28    Function Parameters: 
+0:?     Sequence
+0:33      Sequence
+0:33        move second child to first child (temp 4-component vector of float)
+0:33          'txval00' (temp 4-component vector of float)
+0:33          textureGather (global 4-component vector of float)
+0:33            Construct combined texture-sampler (temp sampler2DArray)
+0:33              'g_tTex2df4a' (uniform texture2DArray)
+0:33              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:33            'c3' (uniform 3-component vector of float)
+0:33            Constant:
+0:33              0 (const int)
+0:34      Sequence
+0:34        move second child to first child (temp 4-component vector of int)
+0:34          'txval01' (temp 4-component vector of int)
+0:34          textureGather (global 4-component vector of int)
+0:34            Construct combined texture-sampler (temp isampler2DArray)
+0:34              'g_tTex2di4a' (uniform itexture2DArray)
+0:34              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:34            'c3' (uniform 3-component vector of float)
+0:34            Constant:
+0:34              0 (const int)
+0:35      Sequence
+0:35        move second child to first child (temp 4-component vector of uint)
+0:35          'txval02' (temp 4-component vector of uint)
+0:35          textureGather (global 4-component vector of uint)
+0:35            Construct combined texture-sampler (temp usampler2DArray)
+0:35              'g_tTex2du4a' (uniform utexture2DArray)
+0:35              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:35            'c3' (uniform 3-component vector of float)
+0:35            Constant:
+0:35              0 (const int)
+0:37      Sequence
+0:37        move second child to first child (temp 4-component vector of float)
+0:37          'txval10' (temp 4-component vector of float)
+0:37          textureGather (global 4-component vector of float)
+0:37            Construct combined texture-sampler (temp sampler2DArray)
+0:37              'g_tTex2df4a' (uniform texture2DArray)
+0:37              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:37            'c3' (uniform 3-component vector of float)
+0:37            Constant:
+0:37              1 (const int)
+0:38      Sequence
+0:38        move second child to first child (temp 4-component vector of int)
+0:38          'txval11' (temp 4-component vector of int)
+0:38          textureGather (global 4-component vector of int)
+0:38            Construct combined texture-sampler (temp isampler2DArray)
+0:38              'g_tTex2di4a' (uniform itexture2DArray)
+0:38              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:38            'c3' (uniform 3-component vector of float)
+0:38            Constant:
+0:38              1 (const int)
+0:39      Sequence
+0:39        move second child to first child (temp 4-component vector of uint)
+0:39          'txval12' (temp 4-component vector of uint)
+0:39          textureGather (global 4-component vector of uint)
+0:39            Construct combined texture-sampler (temp usampler2DArray)
+0:39              'g_tTex2du4a' (uniform utexture2DArray)
+0:39              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:39            'c3' (uniform 3-component vector of float)
+0:39            Constant:
+0:39              1 (const int)
+0:41      Sequence
+0:41        move second child to first child (temp 4-component vector of float)
+0:41          'txval20' (temp 4-component vector of float)
+0:41          textureGather (global 4-component vector of float)
+0:41            Construct combined texture-sampler (temp sampler2DArray)
+0:41              'g_tTex2df4a' (uniform texture2DArray)
+0:41              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:41            'c3' (uniform 3-component vector of float)
+0:41            Constant:
+0:41              2 (const int)
+0:42      Sequence
+0:42        move second child to first child (temp 4-component vector of int)
+0:42          'txval21' (temp 4-component vector of int)
+0:42          textureGather (global 4-component vector of int)
+0:42            Construct combined texture-sampler (temp isampler2DArray)
+0:42              'g_tTex2di4a' (uniform itexture2DArray)
+0:42              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:42            'c3' (uniform 3-component vector of float)
+0:42            Constant:
+0:42              2 (const int)
+0:43      Sequence
+0:43        move second child to first child (temp 4-component vector of uint)
+0:43          'txval22' (temp 4-component vector of uint)
+0:43          textureGather (global 4-component vector of uint)
+0:43            Construct combined texture-sampler (temp usampler2DArray)
+0:43              'g_tTex2du4a' (uniform utexture2DArray)
+0:43              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:43            'c3' (uniform 3-component vector of float)
+0:43            Constant:
+0:43              2 (const int)
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of float)
+0:45          'txval30' (temp 4-component vector of float)
+0:45          textureGather (global 4-component vector of float)
+0:45            Construct combined texture-sampler (temp sampler2DArray)
+0:45              'g_tTex2df4a' (uniform texture2DArray)
+0:45              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:45            'c3' (uniform 3-component vector of float)
+0:45            Constant:
+0:45              3 (const int)
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of int)
+0:46          'txval31' (temp 4-component vector of int)
+0:46          textureGather (global 4-component vector of int)
+0:46            Construct combined texture-sampler (temp isampler2DArray)
+0:46              'g_tTex2di4a' (uniform itexture2DArray)
+0:46              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:46            'c3' (uniform 3-component vector of float)
+0:46            Constant:
+0:46              3 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of uint)
+0:47          'txval32' (temp 4-component vector of uint)
+0:47          textureGather (global 4-component vector of uint)
+0:47            Construct combined texture-sampler (temp usampler2DArray)
+0:47              'g_tTex2du4a' (uniform utexture2DArray)
+0:47              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:47            'c3' (uniform 3-component vector of float)
+0:47            Constant:
+0:47              3 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of float)
+0:51          'txval40' (temp 4-component vector of float)
+0:51          textureGather (global 4-component vector of float)
+0:51            Construct combined texture-sampler (temp samplerCubeArray)
+0:51              'g_tTexcdf4a' (uniform textureCubeArray)
+0:51              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:51            'c4' (uniform 4-component vector of float)
+0:51            Constant:
+0:51              0 (const int)
+0:52      Sequence
+0:52        move second child to first child (temp 4-component vector of int)
+0:52          'txval41' (temp 4-component vector of int)
+0:52          textureGather (global 4-component vector of int)
+0:52            Construct combined texture-sampler (temp isamplerCubeArray)
+0:52              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:52              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:52            'c4' (uniform 4-component vector of float)
+0:52            Constant:
+0:52              0 (const int)
+0:53      Sequence
+0:53        move second child to first child (temp 4-component vector of uint)
+0:53          'txval42' (temp 4-component vector of uint)
+0:53          textureGather (global 4-component vector of uint)
+0:53            Construct combined texture-sampler (temp usamplerCubeArray)
+0:53              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:53              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:53            'c4' (uniform 4-component vector of float)
+0:53            Constant:
+0:53              0 (const int)
+0:55      Sequence
+0:55        move second child to first child (temp 4-component vector of float)
+0:55          'txval50' (temp 4-component vector of float)
+0:55          textureGather (global 4-component vector of float)
+0:55            Construct combined texture-sampler (temp samplerCubeArray)
+0:55              'g_tTexcdf4a' (uniform textureCubeArray)
+0:55              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:55            'c4' (uniform 4-component vector of float)
+0:55            Constant:
+0:55              1 (const int)
+0:56      Sequence
+0:56        move second child to first child (temp 4-component vector of int)
+0:56          'txval51' (temp 4-component vector of int)
+0:56          textureGather (global 4-component vector of int)
+0:56            Construct combined texture-sampler (temp isamplerCubeArray)
+0:56              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:56              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:56            'c4' (uniform 4-component vector of float)
+0:56            Constant:
+0:56              1 (const int)
+0:57      Sequence
+0:57        move second child to first child (temp 4-component vector of uint)
+0:57          'txval52' (temp 4-component vector of uint)
+0:57          textureGather (global 4-component vector of uint)
+0:57            Construct combined texture-sampler (temp usamplerCubeArray)
+0:57              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:57              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:57            'c4' (uniform 4-component vector of float)
+0:57            Constant:
+0:57              1 (const int)
+0:59      Sequence
+0:59        move second child to first child (temp 4-component vector of float)
+0:59          'txval60' (temp 4-component vector of float)
+0:59          textureGather (global 4-component vector of float)
+0:59            Construct combined texture-sampler (temp samplerCubeArray)
+0:59              'g_tTexcdf4a' (uniform textureCubeArray)
+0:59              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:59            'c4' (uniform 4-component vector of float)
+0:59            Constant:
+0:59              2 (const int)
+0:60      Sequence
+0:60        move second child to first child (temp 4-component vector of int)
+0:60          'txval61' (temp 4-component vector of int)
+0:60          textureGather (global 4-component vector of int)
+0:60            Construct combined texture-sampler (temp isamplerCubeArray)
+0:60              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:60              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:60            'c4' (uniform 4-component vector of float)
+0:60            Constant:
+0:60              2 (const int)
+0:61      Sequence
+0:61        move second child to first child (temp 4-component vector of uint)
+0:61          'txval62' (temp 4-component vector of uint)
+0:61          textureGather (global 4-component vector of uint)
+0:61            Construct combined texture-sampler (temp usamplerCubeArray)
+0:61              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:61              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:61            'c4' (uniform 4-component vector of float)
+0:61            Constant:
+0:61              2 (const int)
+0:63      Sequence
+0:63        move second child to first child (temp 4-component vector of float)
+0:63          'txval70' (temp 4-component vector of float)
+0:63          textureGather (global 4-component vector of float)
+0:63            Construct combined texture-sampler (temp samplerCubeArray)
+0:63              'g_tTexcdf4a' (uniform textureCubeArray)
+0:63              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:63            'c4' (uniform 4-component vector of float)
+0:63            Constant:
+0:63              3 (const int)
+0:64      Sequence
+0:64        move second child to first child (temp 4-component vector of int)
+0:64          'txval71' (temp 4-component vector of int)
+0:64          textureGather (global 4-component vector of int)
+0:64            Construct combined texture-sampler (temp isamplerCubeArray)
+0:64              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:64              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:64            'c4' (uniform 4-component vector of float)
+0:64            Constant:
+0:64              3 (const int)
+0:65      Sequence
+0:65        move second child to first child (temp 4-component vector of uint)
+0:65          'txval72' (temp 4-component vector of uint)
+0:65          textureGather (global 4-component vector of uint)
+0:65            Construct combined texture-sampler (temp usamplerCubeArray)
+0:65              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:65              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:65            'c4' (uniform 4-component vector of float)
+0:65            Constant:
+0:65              3 (const int)
+0:67      move second child to first child (temp 4-component vector of float)
+0:67        Color: direct index for structure (temp 4-component vector of float)
+0:67          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:67          Constant:
+0:67            0 (const int)
+0:67        Constant:
+0:67          1.000000
+0:67          1.000000
+0:67          1.000000
+0:67          1.000000
+0:68      move second child to first child (temp float)
+0:68        Depth: direct index for structure (temp float FragDepth)
+0:68          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:68          Constant:
+0:68            1 (const int)
+0:68        Constant:
+0:68          1.000000
+0:70      Branch: Return with expression
+0:70        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=0 ) 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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:72  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28    Function Parameters: 
+0:?     Sequence
+0:33      Sequence
+0:33        move second child to first child (temp 4-component vector of float)
+0:33          'txval00' (temp 4-component vector of float)
+0:33          textureGather (global 4-component vector of float)
+0:33            Construct combined texture-sampler (temp sampler2DArray)
+0:33              'g_tTex2df4a' (uniform texture2DArray)
+0:33              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:33            'c3' (uniform 3-component vector of float)
+0:33            Constant:
+0:33              0 (const int)
+0:34      Sequence
+0:34        move second child to first child (temp 4-component vector of int)
+0:34          'txval01' (temp 4-component vector of int)
+0:34          textureGather (global 4-component vector of int)
+0:34            Construct combined texture-sampler (temp isampler2DArray)
+0:34              'g_tTex2di4a' (uniform itexture2DArray)
+0:34              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:34            'c3' (uniform 3-component vector of float)
+0:34            Constant:
+0:34              0 (const int)
+0:35      Sequence
+0:35        move second child to first child (temp 4-component vector of uint)
+0:35          'txval02' (temp 4-component vector of uint)
+0:35          textureGather (global 4-component vector of uint)
+0:35            Construct combined texture-sampler (temp usampler2DArray)
+0:35              'g_tTex2du4a' (uniform utexture2DArray)
+0:35              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:35            'c3' (uniform 3-component vector of float)
+0:35            Constant:
+0:35              0 (const int)
+0:37      Sequence
+0:37        move second child to first child (temp 4-component vector of float)
+0:37          'txval10' (temp 4-component vector of float)
+0:37          textureGather (global 4-component vector of float)
+0:37            Construct combined texture-sampler (temp sampler2DArray)
+0:37              'g_tTex2df4a' (uniform texture2DArray)
+0:37              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:37            'c3' (uniform 3-component vector of float)
+0:37            Constant:
+0:37              1 (const int)
+0:38      Sequence
+0:38        move second child to first child (temp 4-component vector of int)
+0:38          'txval11' (temp 4-component vector of int)
+0:38          textureGather (global 4-component vector of int)
+0:38            Construct combined texture-sampler (temp isampler2DArray)
+0:38              'g_tTex2di4a' (uniform itexture2DArray)
+0:38              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:38            'c3' (uniform 3-component vector of float)
+0:38            Constant:
+0:38              1 (const int)
+0:39      Sequence
+0:39        move second child to first child (temp 4-component vector of uint)
+0:39          'txval12' (temp 4-component vector of uint)
+0:39          textureGather (global 4-component vector of uint)
+0:39            Construct combined texture-sampler (temp usampler2DArray)
+0:39              'g_tTex2du4a' (uniform utexture2DArray)
+0:39              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:39            'c3' (uniform 3-component vector of float)
+0:39            Constant:
+0:39              1 (const int)
+0:41      Sequence
+0:41        move second child to first child (temp 4-component vector of float)
+0:41          'txval20' (temp 4-component vector of float)
+0:41          textureGather (global 4-component vector of float)
+0:41            Construct combined texture-sampler (temp sampler2DArray)
+0:41              'g_tTex2df4a' (uniform texture2DArray)
+0:41              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:41            'c3' (uniform 3-component vector of float)
+0:41            Constant:
+0:41              2 (const int)
+0:42      Sequence
+0:42        move second child to first child (temp 4-component vector of int)
+0:42          'txval21' (temp 4-component vector of int)
+0:42          textureGather (global 4-component vector of int)
+0:42            Construct combined texture-sampler (temp isampler2DArray)
+0:42              'g_tTex2di4a' (uniform itexture2DArray)
+0:42              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:42            'c3' (uniform 3-component vector of float)
+0:42            Constant:
+0:42              2 (const int)
+0:43      Sequence
+0:43        move second child to first child (temp 4-component vector of uint)
+0:43          'txval22' (temp 4-component vector of uint)
+0:43          textureGather (global 4-component vector of uint)
+0:43            Construct combined texture-sampler (temp usampler2DArray)
+0:43              'g_tTex2du4a' (uniform utexture2DArray)
+0:43              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:43            'c3' (uniform 3-component vector of float)
+0:43            Constant:
+0:43              2 (const int)
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of float)
+0:45          'txval30' (temp 4-component vector of float)
+0:45          textureGather (global 4-component vector of float)
+0:45            Construct combined texture-sampler (temp sampler2DArray)
+0:45              'g_tTex2df4a' (uniform texture2DArray)
+0:45              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:45            'c3' (uniform 3-component vector of float)
+0:45            Constant:
+0:45              3 (const int)
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of int)
+0:46          'txval31' (temp 4-component vector of int)
+0:46          textureGather (global 4-component vector of int)
+0:46            Construct combined texture-sampler (temp isampler2DArray)
+0:46              'g_tTex2di4a' (uniform itexture2DArray)
+0:46              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:46            'c3' (uniform 3-component vector of float)
+0:46            Constant:
+0:46              3 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of uint)
+0:47          'txval32' (temp 4-component vector of uint)
+0:47          textureGather (global 4-component vector of uint)
+0:47            Construct combined texture-sampler (temp usampler2DArray)
+0:47              'g_tTex2du4a' (uniform utexture2DArray)
+0:47              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:47            'c3' (uniform 3-component vector of float)
+0:47            Constant:
+0:47              3 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of float)
+0:51          'txval40' (temp 4-component vector of float)
+0:51          textureGather (global 4-component vector of float)
+0:51            Construct combined texture-sampler (temp samplerCubeArray)
+0:51              'g_tTexcdf4a' (uniform textureCubeArray)
+0:51              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:51            'c4' (uniform 4-component vector of float)
+0:51            Constant:
+0:51              0 (const int)
+0:52      Sequence
+0:52        move second child to first child (temp 4-component vector of int)
+0:52          'txval41' (temp 4-component vector of int)
+0:52          textureGather (global 4-component vector of int)
+0:52            Construct combined texture-sampler (temp isamplerCubeArray)
+0:52              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:52              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:52            'c4' (uniform 4-component vector of float)
+0:52            Constant:
+0:52              0 (const int)
+0:53      Sequence
+0:53        move second child to first child (temp 4-component vector of uint)
+0:53          'txval42' (temp 4-component vector of uint)
+0:53          textureGather (global 4-component vector of uint)
+0:53            Construct combined texture-sampler (temp usamplerCubeArray)
+0:53              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:53              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:53            'c4' (uniform 4-component vector of float)
+0:53            Constant:
+0:53              0 (const int)
+0:55      Sequence
+0:55        move second child to first child (temp 4-component vector of float)
+0:55          'txval50' (temp 4-component vector of float)
+0:55          textureGather (global 4-component vector of float)
+0:55            Construct combined texture-sampler (temp samplerCubeArray)
+0:55              'g_tTexcdf4a' (uniform textureCubeArray)
+0:55              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:55            'c4' (uniform 4-component vector of float)
+0:55            Constant:
+0:55              1 (const int)
+0:56      Sequence
+0:56        move second child to first child (temp 4-component vector of int)
+0:56          'txval51' (temp 4-component vector of int)
+0:56          textureGather (global 4-component vector of int)
+0:56            Construct combined texture-sampler (temp isamplerCubeArray)
+0:56              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:56              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:56            'c4' (uniform 4-component vector of float)
+0:56            Constant:
+0:56              1 (const int)
+0:57      Sequence
+0:57        move second child to first child (temp 4-component vector of uint)
+0:57          'txval52' (temp 4-component vector of uint)
+0:57          textureGather (global 4-component vector of uint)
+0:57            Construct combined texture-sampler (temp usamplerCubeArray)
+0:57              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:57              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:57            'c4' (uniform 4-component vector of float)
+0:57            Constant:
+0:57              1 (const int)
+0:59      Sequence
+0:59        move second child to first child (temp 4-component vector of float)
+0:59          'txval60' (temp 4-component vector of float)
+0:59          textureGather (global 4-component vector of float)
+0:59            Construct combined texture-sampler (temp samplerCubeArray)
+0:59              'g_tTexcdf4a' (uniform textureCubeArray)
+0:59              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:59            'c4' (uniform 4-component vector of float)
+0:59            Constant:
+0:59              2 (const int)
+0:60      Sequence
+0:60        move second child to first child (temp 4-component vector of int)
+0:60          'txval61' (temp 4-component vector of int)
+0:60          textureGather (global 4-component vector of int)
+0:60            Construct combined texture-sampler (temp isamplerCubeArray)
+0:60              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:60              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:60            'c4' (uniform 4-component vector of float)
+0:60            Constant:
+0:60              2 (const int)
+0:61      Sequence
+0:61        move second child to first child (temp 4-component vector of uint)
+0:61          'txval62' (temp 4-component vector of uint)
+0:61          textureGather (global 4-component vector of uint)
+0:61            Construct combined texture-sampler (temp usamplerCubeArray)
+0:61              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:61              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:61            'c4' (uniform 4-component vector of float)
+0:61            Constant:
+0:61              2 (const int)
+0:63      Sequence
+0:63        move second child to first child (temp 4-component vector of float)
+0:63          'txval70' (temp 4-component vector of float)
+0:63          textureGather (global 4-component vector of float)
+0:63            Construct combined texture-sampler (temp samplerCubeArray)
+0:63              'g_tTexcdf4a' (uniform textureCubeArray)
+0:63              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:63            'c4' (uniform 4-component vector of float)
+0:63            Constant:
+0:63              3 (const int)
+0:64      Sequence
+0:64        move second child to first child (temp 4-component vector of int)
+0:64          'txval71' (temp 4-component vector of int)
+0:64          textureGather (global 4-component vector of int)
+0:64            Construct combined texture-sampler (temp isamplerCubeArray)
+0:64              'g_tTexcdi4a' (uniform itextureCubeArray)
+0:64              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:64            'c4' (uniform 4-component vector of float)
+0:64            Constant:
+0:64              3 (const int)
+0:65      Sequence
+0:65        move second child to first child (temp 4-component vector of uint)
+0:65          'txval72' (temp 4-component vector of uint)
+0:65          textureGather (global 4-component vector of uint)
+0:65            Construct combined texture-sampler (temp usamplerCubeArray)
+0:65              'g_tTexcdu4a' (uniform utextureCubeArray)
+0:65              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:65            'c4' (uniform 4-component vector of float)
+0:65            Constant:
+0:65              3 (const int)
+0:67      move second child to first child (temp 4-component vector of float)
+0:67        Color: direct index for structure (temp 4-component vector of float)
+0:67          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:67          Constant:
+0:67            0 (const int)
+0:67        Constant:
+0:67          1.000000
+0:67          1.000000
+0:67          1.000000
+0:67          1.000000
+0:68      move second child to first child (temp float)
+0:68        Depth: direct index for structure (temp float FragDepth)
+0:68          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:68          Constant:
+0:68            1 (const int)
+0:68        Constant:
+0:68          1.000000
+0:70      Branch: Return with expression
+0:70        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=0 ) 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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 220
+
+                              Capability Shader
+                              Capability Sampled1D
+                              Capability SampledCubeArray
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "main"
+                              Name 9  "txval00"
+                              Name 12  "g_tTex2df4a"
+                              Name 16  "g_sSamp"
+                              Name 22  "c3"
+                              Name 29  "txval01"
+                              Name 32  "g_tTex2di4a"
+                              Name 42  "txval02"
+                              Name 45  "g_tTex2du4a"
+                              Name 52  "txval10"
+                              Name 59  "txval11"
+                              Name 65  "txval12"
+                              Name 71  "txval20"
+                              Name 78  "txval21"
+                              Name 84  "txval22"
+                              Name 90  "txval30"
+                              Name 97  "txval31"
+                              Name 103  "txval32"
+                              Name 109  "txval40"
+                              Name 112  "g_tTexcdf4a"
+                              Name 118  "c4"
+                              Name 121  "txval41"
+                              Name 124  "g_tTexcdi4a"
+                              Name 131  "txval42"
+                              Name 134  "g_tTexcdu4a"
+                              Name 141  "txval50"
+                              Name 147  "txval51"
+                              Name 153  "txval52"
+                              Name 159  "txval60"
+                              Name 165  "txval61"
+                              Name 171  "txval62"
+                              Name 177  "txval70"
+                              Name 183  "txval71"
+                              Name 189  "txval72"
+                              Name 195  "PS_OUTPUT"
+                              MemberName 195(PS_OUTPUT) 0  "Color"
+                              MemberName 195(PS_OUTPUT) 1  "Depth"
+                              Name 197  "psout"
+                              Name 205  "g_sSamp2d"
+                              Name 208  "g_tTex1df4a"
+                              Name 211  "g_tTex1di4a"
+                              Name 214  "g_tTex1du4a"
+                              Name 216  "c1"
+                              Name 219  "c2"
+                              Decorate 12(g_tTex2df4a) DescriptorSet 0
+                              Decorate 16(g_sSamp) DescriptorSet 0
+                              Decorate 16(g_sSamp) Binding 0
+                              Decorate 32(g_tTex2di4a) DescriptorSet 0
+                              Decorate 45(g_tTex2du4a) DescriptorSet 0
+                              Decorate 112(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 124(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 134(g_tTexcdu4a) DescriptorSet 0
+                              MemberDecorate 195(PS_OUTPUT) 1 BuiltIn FragDepth
+                              Decorate 205(g_sSamp2d) DescriptorSet 0
+                              Decorate 208(g_tTex1df4a) DescriptorSet 0
+                              Decorate 208(g_tTex1df4a) Binding 0
+                              Decorate 211(g_tTex1di4a) DescriptorSet 0
+                              Decorate 214(g_tTex1du4a) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypeImage 6(float) 2D array sampled format:Unknown
+              11:             TypePointer UniformConstant 10
+ 12(g_tTex2df4a):     11(ptr) Variable UniformConstant
+              14:             TypeSampler
+              15:             TypePointer UniformConstant 14
+     16(g_sSamp):     15(ptr) Variable UniformConstant
+              18:             TypeSampledImage 10
+              20:             TypeVector 6(float) 3
+              21:             TypePointer UniformConstant 20(fvec3)
+          22(c3):     21(ptr) Variable UniformConstant
+              24:             TypeInt 32 1
+              25:     24(int) Constant 0
+              27:             TypeVector 24(int) 4
+              28:             TypePointer Function 27(ivec4)
+              30:             TypeImage 24(int) 2D array sampled format:Unknown
+              31:             TypePointer UniformConstant 30
+ 32(g_tTex2di4a):     31(ptr) Variable UniformConstant
+              35:             TypeSampledImage 30
+              39:             TypeInt 32 0
+              40:             TypeVector 39(int) 4
+              41:             TypePointer Function 40(ivec4)
+              43:             TypeImage 39(int) 2D array sampled format:Unknown
+              44:             TypePointer UniformConstant 43
+ 45(g_tTex2du4a):     44(ptr) Variable UniformConstant
+              48:             TypeSampledImage 43
+              57:     24(int) Constant 1
+              76:     24(int) Constant 2
+              95:     24(int) Constant 3
+             110:             TypeImage 6(float) Cube array sampled format:Unknown
+             111:             TypePointer UniformConstant 110
+112(g_tTexcdf4a):    111(ptr) Variable UniformConstant
+             115:             TypeSampledImage 110
+             117:             TypePointer UniformConstant 7(fvec4)
+         118(c4):    117(ptr) Variable UniformConstant
+             122:             TypeImage 24(int) Cube array sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+124(g_tTexcdi4a):    123(ptr) Variable UniformConstant
+             127:             TypeSampledImage 122
+             132:             TypeImage 39(int) Cube array sampled format:Unknown
+             133:             TypePointer UniformConstant 132
+134(g_tTexcdu4a):    133(ptr) Variable UniformConstant
+             137:             TypeSampledImage 132
+  195(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
+             196:             TypePointer Function 195(PS_OUTPUT)
+             198:    6(float) Constant 1065353216
+             199:    7(fvec4) ConstantComposite 198 198 198 198
+             201:             TypePointer Function 6(float)
+  205(g_sSamp2d):     15(ptr) Variable UniformConstant
+             206:             TypeImage 6(float) 1D array sampled format:Unknown
+             207:             TypePointer UniformConstant 206
+208(g_tTex1df4a):    207(ptr) Variable UniformConstant
+             209:             TypeImage 24(int) 1D array sampled format:Unknown
+             210:             TypePointer UniformConstant 209
+211(g_tTex1di4a):    210(ptr) Variable UniformConstant
+             212:             TypeImage 39(int) 1D array sampled format:Unknown
+             213:             TypePointer UniformConstant 212
+214(g_tTex1du4a):    213(ptr) Variable UniformConstant
+             215:             TypePointer UniformConstant 6(float)
+         216(c1):    215(ptr) Variable UniformConstant
+             217:             TypeVector 6(float) 2
+             218:             TypePointer UniformConstant 217(fvec2)
+         219(c2):    218(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+      9(txval00):      8(ptr) Variable Function
+     29(txval01):     28(ptr) Variable Function
+     42(txval02):     41(ptr) Variable Function
+     52(txval10):      8(ptr) Variable Function
+     59(txval11):     28(ptr) Variable Function
+     65(txval12):     41(ptr) Variable Function
+     71(txval20):      8(ptr) Variable Function
+     78(txval21):     28(ptr) Variable Function
+     84(txval22):     41(ptr) Variable Function
+     90(txval30):      8(ptr) Variable Function
+     97(txval31):     28(ptr) Variable Function
+    103(txval32):     41(ptr) Variable Function
+    109(txval40):      8(ptr) Variable Function
+    121(txval41):     28(ptr) Variable Function
+    131(txval42):     41(ptr) Variable Function
+    141(txval50):      8(ptr) Variable Function
+    147(txval51):     28(ptr) Variable Function
+    153(txval52):     41(ptr) Variable Function
+    159(txval60):      8(ptr) Variable Function
+    165(txval61):     28(ptr) Variable Function
+    171(txval62):     41(ptr) Variable Function
+    177(txval70):      8(ptr) Variable Function
+    183(txval71):     28(ptr) Variable Function
+    189(txval72):     41(ptr) Variable Function
+      197(psout):    196(ptr) Variable Function
+              13:          10 Load 12(g_tTex2df4a)
+              17:          14 Load 16(g_sSamp)
+              19:          18 SampledImage 13 17
+              23:   20(fvec3) Load 22(c3)
+              26:    7(fvec4) ImageGather 19 23 25
+                              Store 9(txval00) 26
+              33:          30 Load 32(g_tTex2di4a)
+              34:          14 Load 16(g_sSamp)
+              36:          35 SampledImage 33 34
+              37:   20(fvec3) Load 22(c3)
+              38:   27(ivec4) ImageGather 36 37 25
+                              Store 29(txval01) 38
+              46:          43 Load 45(g_tTex2du4a)
+              47:          14 Load 16(g_sSamp)
+              49:          48 SampledImage 46 47
+              50:   20(fvec3) Load 22(c3)
+              51:   40(ivec4) ImageGather 49 50 25
+                              Store 42(txval02) 51
+              53:          10 Load 12(g_tTex2df4a)
+              54:          14 Load 16(g_sSamp)
+              55:          18 SampledImage 53 54
+              56:   20(fvec3) Load 22(c3)
+              58:    7(fvec4) ImageGather 55 56 57
+                              Store 52(txval10) 58
+              60:          30 Load 32(g_tTex2di4a)
+              61:          14 Load 16(g_sSamp)
+              62:          35 SampledImage 60 61
+              63:   20(fvec3) Load 22(c3)
+              64:   27(ivec4) ImageGather 62 63 57
+                              Store 59(txval11) 64
+              66:          43 Load 45(g_tTex2du4a)
+              67:          14 Load 16(g_sSamp)
+              68:          48 SampledImage 66 67
+              69:   20(fvec3) Load 22(c3)
+              70:   40(ivec4) ImageGather 68 69 57
+                              Store 65(txval12) 70
+              72:          10 Load 12(g_tTex2df4a)
+              73:          14 Load 16(g_sSamp)
+              74:          18 SampledImage 72 73
+              75:   20(fvec3) Load 22(c3)
+              77:    7(fvec4) ImageGather 74 75 76
+                              Store 71(txval20) 77
+              79:          30 Load 32(g_tTex2di4a)
+              80:          14 Load 16(g_sSamp)
+              81:          35 SampledImage 79 80
+              82:   20(fvec3) Load 22(c3)
+              83:   27(ivec4) ImageGather 81 82 76
+                              Store 78(txval21) 83
+              85:          43 Load 45(g_tTex2du4a)
+              86:          14 Load 16(g_sSamp)
+              87:          48 SampledImage 85 86
+              88:   20(fvec3) Load 22(c3)
+              89:   40(ivec4) ImageGather 87 88 76
+                              Store 84(txval22) 89
+              91:          10 Load 12(g_tTex2df4a)
+              92:          14 Load 16(g_sSamp)
+              93:          18 SampledImage 91 92
+              94:   20(fvec3) Load 22(c3)
+              96:    7(fvec4) ImageGather 93 94 95
+                              Store 90(txval30) 96
+              98:          30 Load 32(g_tTex2di4a)
+              99:          14 Load 16(g_sSamp)
+             100:          35 SampledImage 98 99
+             101:   20(fvec3) Load 22(c3)
+             102:   27(ivec4) ImageGather 100 101 95
+                              Store 97(txval31) 102
+             104:          43 Load 45(g_tTex2du4a)
+             105:          14 Load 16(g_sSamp)
+             106:          48 SampledImage 104 105
+             107:   20(fvec3) Load 22(c3)
+             108:   40(ivec4) ImageGather 106 107 95
+                              Store 103(txval32) 108
+             113:         110 Load 112(g_tTexcdf4a)
+             114:          14 Load 16(g_sSamp)
+             116:         115 SampledImage 113 114
+             119:    7(fvec4) Load 118(c4)
+             120:    7(fvec4) ImageGather 116 119 25
+                              Store 109(txval40) 120
+             125:         122 Load 124(g_tTexcdi4a)
+             126:          14 Load 16(g_sSamp)
+             128:         127 SampledImage 125 126
+             129:    7(fvec4) Load 118(c4)
+             130:   27(ivec4) ImageGather 128 129 25
+                              Store 121(txval41) 130
+             135:         132 Load 134(g_tTexcdu4a)
+             136:          14 Load 16(g_sSamp)
+             138:         137 SampledImage 135 136
+             139:    7(fvec4) Load 118(c4)
+             140:   40(ivec4) ImageGather 138 139 25
+                              Store 131(txval42) 140
+             142:         110 Load 112(g_tTexcdf4a)
+             143:          14 Load 16(g_sSamp)
+             144:         115 SampledImage 142 143
+             145:    7(fvec4) Load 118(c4)
+             146:    7(fvec4) ImageGather 144 145 57
+                              Store 141(txval50) 146
+             148:         122 Load 124(g_tTexcdi4a)
+             149:          14 Load 16(g_sSamp)
+             150:         127 SampledImage 148 149
+             151:    7(fvec4) Load 118(c4)
+             152:   27(ivec4) ImageGather 150 151 57
+                              Store 147(txval51) 152
+             154:         132 Load 134(g_tTexcdu4a)
+             155:          14 Load 16(g_sSamp)
+             156:         137 SampledImage 154 155
+             157:    7(fvec4) Load 118(c4)
+             158:   40(ivec4) ImageGather 156 157 57
+                              Store 153(txval52) 158
+             160:         110 Load 112(g_tTexcdf4a)
+             161:          14 Load 16(g_sSamp)
+             162:         115 SampledImage 160 161
+             163:    7(fvec4) Load 118(c4)
+             164:    7(fvec4) ImageGather 162 163 76
+                              Store 159(txval60) 164
+             166:         122 Load 124(g_tTexcdi4a)
+             167:          14 Load 16(g_sSamp)
+             168:         127 SampledImage 166 167
+             169:    7(fvec4) Load 118(c4)
+             170:   27(ivec4) ImageGather 168 169 76
+                              Store 165(txval61) 170
+             172:         132 Load 134(g_tTexcdu4a)
+             173:          14 Load 16(g_sSamp)
+             174:         137 SampledImage 172 173
+             175:    7(fvec4) Load 118(c4)
+             176:   40(ivec4) ImageGather 174 175 76
+                              Store 171(txval62) 176
+             178:         110 Load 112(g_tTexcdf4a)
+             179:          14 Load 16(g_sSamp)
+             180:         115 SampledImage 178 179
+             181:    7(fvec4) Load 118(c4)
+             182:    7(fvec4) ImageGather 180 181 95
+                              Store 177(txval70) 182
+             184:         122 Load 124(g_tTexcdi4a)
+             185:          14 Load 16(g_sSamp)
+             186:         127 SampledImage 184 185
+             187:    7(fvec4) Load 118(c4)
+             188:   27(ivec4) ImageGather 186 187 95
+                              Store 183(txval71) 188
+             190:         132 Load 134(g_tTexcdu4a)
+             191:          14 Load 16(g_sSamp)
+             192:         137 SampledImage 190 191
+             193:    7(fvec4) Load 118(c4)
+             194:   40(ivec4) ImageGather 192 193 95
+                              Store 189(txval72) 194
+             200:      8(ptr) AccessChain 197(psout) 25
+                              Store 200 199
+             202:    201(ptr) AccessChain 197(psout) 57
+                              Store 202 198
+             203:195(PS_OUTPUT) Load 197(psout)
+                              ReturnValue 203
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
new file mode 100644
index 0000000..8fd9691
--- /dev/null
+++ b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
@@ -0,0 +1,910 @@
+hlsl.gatherRGBA.basic.dx10.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:78  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34    Function Parameters: 
+0:?     Sequence
+0:39      Sequence
+0:39        move second child to first child (temp 4-component vector of float)
+0:39          'txval00' (temp 4-component vector of float)
+0:39          textureGather (global 4-component vector of float)
+0:39            Construct combined texture-sampler (temp sampler2D)
+0:39              'g_tTex2df4' (uniform texture2D)
+0:39              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:39            'c2' (uniform 2-component vector of float)
+0:39            Constant:
+0:39              0 (const int)
+0:40      Sequence
+0:40        move second child to first child (temp 4-component vector of int)
+0:40          'txval01' (temp 4-component vector of int)
+0:40          textureGather (global 4-component vector of int)
+0:40            Construct combined texture-sampler (temp isampler2D)
+0:40              'g_tTex2di4' (uniform itexture2D)
+0:40              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:40            'c2' (uniform 2-component vector of float)
+0:40            Constant:
+0:40              0 (const int)
+0:41      Sequence
+0:41        move second child to first child (temp 4-component vector of uint)
+0:41          'txval02' (temp 4-component vector of uint)
+0:41          textureGather (global 4-component vector of uint)
+0:41            Construct combined texture-sampler (temp usampler2D)
+0:41              'g_tTex2du4' (uniform utexture2D)
+0:41              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:41            'c2' (uniform 2-component vector of float)
+0:41            Constant:
+0:41              0 (const int)
+0:43      Sequence
+0:43        move second child to first child (temp 4-component vector of float)
+0:43          'txval10' (temp 4-component vector of float)
+0:43          textureGather (global 4-component vector of float)
+0:43            Construct combined texture-sampler (temp sampler2D)
+0:43              'g_tTex2df4' (uniform texture2D)
+0:43              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:43            'c2' (uniform 2-component vector of float)
+0:43            Constant:
+0:43              1 (const int)
+0:44      Sequence
+0:44        move second child to first child (temp 4-component vector of int)
+0:44          'txval11' (temp 4-component vector of int)
+0:44          textureGather (global 4-component vector of int)
+0:44            Construct combined texture-sampler (temp isampler2D)
+0:44              'g_tTex2di4' (uniform itexture2D)
+0:44              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:44            'c2' (uniform 2-component vector of float)
+0:44            Constant:
+0:44              1 (const int)
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of uint)
+0:45          'txval12' (temp 4-component vector of uint)
+0:45          textureGather (global 4-component vector of uint)
+0:45            Construct combined texture-sampler (temp usampler2D)
+0:45              'g_tTex2du4' (uniform utexture2D)
+0:45              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:45            'c2' (uniform 2-component vector of float)
+0:45            Constant:
+0:45              1 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of float)
+0:47          'txval20' (temp 4-component vector of float)
+0:47          textureGather (global 4-component vector of float)
+0:47            Construct combined texture-sampler (temp sampler2D)
+0:47              'g_tTex2df4' (uniform texture2D)
+0:47              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:47            'c2' (uniform 2-component vector of float)
+0:47            Constant:
+0:47              2 (const int)
+0:48      Sequence
+0:48        move second child to first child (temp 4-component vector of int)
+0:48          'txval21' (temp 4-component vector of int)
+0:48          textureGather (global 4-component vector of int)
+0:48            Construct combined texture-sampler (temp isampler2D)
+0:48              'g_tTex2di4' (uniform itexture2D)
+0:48              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:48            'c2' (uniform 2-component vector of float)
+0:48            Constant:
+0:48              2 (const int)
+0:49      Sequence
+0:49        move second child to first child (temp 4-component vector of uint)
+0:49          'txval22' (temp 4-component vector of uint)
+0:49          textureGather (global 4-component vector of uint)
+0:49            Construct combined texture-sampler (temp usampler2D)
+0:49              'g_tTex2du4' (uniform utexture2D)
+0:49              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:49            'c2' (uniform 2-component vector of float)
+0:49            Constant:
+0:49              2 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of float)
+0:51          'txval30' (temp 4-component vector of float)
+0:51          textureGather (global 4-component vector of float)
+0:51            Construct combined texture-sampler (temp sampler2D)
+0:51              'g_tTex2df4' (uniform texture2D)
+0:51              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:51            'c2' (uniform 2-component vector of float)
+0:51            Constant:
+0:51              3 (const int)
+0:52      Sequence
+0:52        move second child to first child (temp 4-component vector of int)
+0:52          'txval31' (temp 4-component vector of int)
+0:52          textureGather (global 4-component vector of int)
+0:52            Construct combined texture-sampler (temp isampler2D)
+0:52              'g_tTex2di4' (uniform itexture2D)
+0:52              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:52            'c2' (uniform 2-component vector of float)
+0:52            Constant:
+0:52              3 (const int)
+0:53      Sequence
+0:53        move second child to first child (temp 4-component vector of uint)
+0:53          'txval32' (temp 4-component vector of uint)
+0:53          textureGather (global 4-component vector of uint)
+0:53            Construct combined texture-sampler (temp usampler2D)
+0:53              'g_tTex2du4' (uniform utexture2D)
+0:53              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:53            'c2' (uniform 2-component vector of float)
+0:53            Constant:
+0:53              3 (const int)
+0:57      Sequence
+0:57        move second child to first child (temp 4-component vector of float)
+0:57          'txval40' (temp 4-component vector of float)
+0:57          textureGather (global 4-component vector of float)
+0:57            Construct combined texture-sampler (temp samplerCube)
+0:57              'g_tTexcdf4' (uniform textureCube)
+0:57              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:57            'c3' (uniform 3-component vector of float)
+0:57            Constant:
+0:57              0 (const int)
+0:58      Sequence
+0:58        move second child to first child (temp 4-component vector of int)
+0:58          'txval41' (temp 4-component vector of int)
+0:58          textureGather (global 4-component vector of int)
+0:58            Construct combined texture-sampler (temp isamplerCube)
+0:58              'g_tTexcdi4' (uniform itextureCube)
+0:58              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:58            'c3' (uniform 3-component vector of float)
+0:58            Constant:
+0:58              0 (const int)
+0:59      Sequence
+0:59        move second child to first child (temp 4-component vector of uint)
+0:59          'txval42' (temp 4-component vector of uint)
+0:59          textureGather (global 4-component vector of uint)
+0:59            Construct combined texture-sampler (temp usamplerCube)
+0:59              'g_tTexcdu4' (uniform utextureCube)
+0:59              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:59            'c3' (uniform 3-component vector of float)
+0:59            Constant:
+0:59              0 (const int)
+0:61      Sequence
+0:61        move second child to first child (temp 4-component vector of float)
+0:61          'txval50' (temp 4-component vector of float)
+0:61          textureGather (global 4-component vector of float)
+0:61            Construct combined texture-sampler (temp samplerCube)
+0:61              'g_tTexcdf4' (uniform textureCube)
+0:61              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:61            'c3' (uniform 3-component vector of float)
+0:61            Constant:
+0:61              1 (const int)
+0:62      Sequence
+0:62        move second child to first child (temp 4-component vector of int)
+0:62          'txval51' (temp 4-component vector of int)
+0:62          textureGather (global 4-component vector of int)
+0:62            Construct combined texture-sampler (temp isamplerCube)
+0:62              'g_tTexcdi4' (uniform itextureCube)
+0:62              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:62            'c3' (uniform 3-component vector of float)
+0:62            Constant:
+0:62              1 (const int)
+0:63      Sequence
+0:63        move second child to first child (temp 4-component vector of uint)
+0:63          'txval52' (temp 4-component vector of uint)
+0:63          textureGather (global 4-component vector of uint)
+0:63            Construct combined texture-sampler (temp usamplerCube)
+0:63              'g_tTexcdu4' (uniform utextureCube)
+0:63              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:63            'c3' (uniform 3-component vector of float)
+0:63            Constant:
+0:63              1 (const int)
+0:65      Sequence
+0:65        move second child to first child (temp 4-component vector of float)
+0:65          'txval60' (temp 4-component vector of float)
+0:65          textureGather (global 4-component vector of float)
+0:65            Construct combined texture-sampler (temp samplerCube)
+0:65              'g_tTexcdf4' (uniform textureCube)
+0:65              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:65            'c3' (uniform 3-component vector of float)
+0:65            Constant:
+0:65              2 (const int)
+0:66      Sequence
+0:66        move second child to first child (temp 4-component vector of int)
+0:66          'txval61' (temp 4-component vector of int)
+0:66          textureGather (global 4-component vector of int)
+0:66            Construct combined texture-sampler (temp isamplerCube)
+0:66              'g_tTexcdi4' (uniform itextureCube)
+0:66              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:66            'c3' (uniform 3-component vector of float)
+0:66            Constant:
+0:66              2 (const int)
+0:67      Sequence
+0:67        move second child to first child (temp 4-component vector of uint)
+0:67          'txval62' (temp 4-component vector of uint)
+0:67          textureGather (global 4-component vector of uint)
+0:67            Construct combined texture-sampler (temp usamplerCube)
+0:67              'g_tTexcdu4' (uniform utextureCube)
+0:67              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:67            'c3' (uniform 3-component vector of float)
+0:67            Constant:
+0:67              2 (const int)
+0:69      Sequence
+0:69        move second child to first child (temp 4-component vector of float)
+0:69          'txval70' (temp 4-component vector of float)
+0:69          textureGather (global 4-component vector of float)
+0:69            Construct combined texture-sampler (temp samplerCube)
+0:69              'g_tTexcdf4' (uniform textureCube)
+0:69              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:69            'c3' (uniform 3-component vector of float)
+0:69            Constant:
+0:69              3 (const int)
+0:70      Sequence
+0:70        move second child to first child (temp 4-component vector of int)
+0:70          'txval71' (temp 4-component vector of int)
+0:70          textureGather (global 4-component vector of int)
+0:70            Construct combined texture-sampler (temp isamplerCube)
+0:70              'g_tTexcdi4' (uniform itextureCube)
+0:70              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:70            'c3' (uniform 3-component vector of float)
+0:70            Constant:
+0:70              3 (const int)
+0:71      Sequence
+0:71        move second child to first child (temp 4-component vector of uint)
+0:71          'txval72' (temp 4-component vector of uint)
+0:71          textureGather (global 4-component vector of uint)
+0:71            Construct combined texture-sampler (temp usamplerCube)
+0:71              'g_tTexcdu4' (uniform utextureCube)
+0:71              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:71            'c3' (uniform 3-component vector of float)
+0:71            Constant:
+0:71              3 (const int)
+0:73      move second child to first child (temp 4-component vector of float)
+0:73        Color: direct index for structure (temp 4-component vector of float)
+0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:73          Constant:
+0:73            0 (const int)
+0:73        Constant:
+0:73          1.000000
+0:73          1.000000
+0:73          1.000000
+0:73          1.000000
+0:74      move second child to first child (temp float)
+0:74        Depth: direct index for structure (temp float FragDepth)
+0:74          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:74          Constant:
+0:74            1 (const int)
+0:74        Constant:
+0:74          1.000000
+0:76      Branch: Return with expression
+0:76        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
+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_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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:78  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34    Function Parameters: 
+0:?     Sequence
+0:39      Sequence
+0:39        move second child to first child (temp 4-component vector of float)
+0:39          'txval00' (temp 4-component vector of float)
+0:39          textureGather (global 4-component vector of float)
+0:39            Construct combined texture-sampler (temp sampler2D)
+0:39              'g_tTex2df4' (uniform texture2D)
+0:39              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:39            'c2' (uniform 2-component vector of float)
+0:39            Constant:
+0:39              0 (const int)
+0:40      Sequence
+0:40        move second child to first child (temp 4-component vector of int)
+0:40          'txval01' (temp 4-component vector of int)
+0:40          textureGather (global 4-component vector of int)
+0:40            Construct combined texture-sampler (temp isampler2D)
+0:40              'g_tTex2di4' (uniform itexture2D)
+0:40              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:40            'c2' (uniform 2-component vector of float)
+0:40            Constant:
+0:40              0 (const int)
+0:41      Sequence
+0:41        move second child to first child (temp 4-component vector of uint)
+0:41          'txval02' (temp 4-component vector of uint)
+0:41          textureGather (global 4-component vector of uint)
+0:41            Construct combined texture-sampler (temp usampler2D)
+0:41              'g_tTex2du4' (uniform utexture2D)
+0:41              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:41            'c2' (uniform 2-component vector of float)
+0:41            Constant:
+0:41              0 (const int)
+0:43      Sequence
+0:43        move second child to first child (temp 4-component vector of float)
+0:43          'txval10' (temp 4-component vector of float)
+0:43          textureGather (global 4-component vector of float)
+0:43            Construct combined texture-sampler (temp sampler2D)
+0:43              'g_tTex2df4' (uniform texture2D)
+0:43              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:43            'c2' (uniform 2-component vector of float)
+0:43            Constant:
+0:43              1 (const int)
+0:44      Sequence
+0:44        move second child to first child (temp 4-component vector of int)
+0:44          'txval11' (temp 4-component vector of int)
+0:44          textureGather (global 4-component vector of int)
+0:44            Construct combined texture-sampler (temp isampler2D)
+0:44              'g_tTex2di4' (uniform itexture2D)
+0:44              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:44            'c2' (uniform 2-component vector of float)
+0:44            Constant:
+0:44              1 (const int)
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of uint)
+0:45          'txval12' (temp 4-component vector of uint)
+0:45          textureGather (global 4-component vector of uint)
+0:45            Construct combined texture-sampler (temp usampler2D)
+0:45              'g_tTex2du4' (uniform utexture2D)
+0:45              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:45            'c2' (uniform 2-component vector of float)
+0:45            Constant:
+0:45              1 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of float)
+0:47          'txval20' (temp 4-component vector of float)
+0:47          textureGather (global 4-component vector of float)
+0:47            Construct combined texture-sampler (temp sampler2D)
+0:47              'g_tTex2df4' (uniform texture2D)
+0:47              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:47            'c2' (uniform 2-component vector of float)
+0:47            Constant:
+0:47              2 (const int)
+0:48      Sequence
+0:48        move second child to first child (temp 4-component vector of int)
+0:48          'txval21' (temp 4-component vector of int)
+0:48          textureGather (global 4-component vector of int)
+0:48            Construct combined texture-sampler (temp isampler2D)
+0:48              'g_tTex2di4' (uniform itexture2D)
+0:48              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:48            'c2' (uniform 2-component vector of float)
+0:48            Constant:
+0:48              2 (const int)
+0:49      Sequence
+0:49        move second child to first child (temp 4-component vector of uint)
+0:49          'txval22' (temp 4-component vector of uint)
+0:49          textureGather (global 4-component vector of uint)
+0:49            Construct combined texture-sampler (temp usampler2D)
+0:49              'g_tTex2du4' (uniform utexture2D)
+0:49              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:49            'c2' (uniform 2-component vector of float)
+0:49            Constant:
+0:49              2 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of float)
+0:51          'txval30' (temp 4-component vector of float)
+0:51          textureGather (global 4-component vector of float)
+0:51            Construct combined texture-sampler (temp sampler2D)
+0:51              'g_tTex2df4' (uniform texture2D)
+0:51              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:51            'c2' (uniform 2-component vector of float)
+0:51            Constant:
+0:51              3 (const int)
+0:52      Sequence
+0:52        move second child to first child (temp 4-component vector of int)
+0:52          'txval31' (temp 4-component vector of int)
+0:52          textureGather (global 4-component vector of int)
+0:52            Construct combined texture-sampler (temp isampler2D)
+0:52              'g_tTex2di4' (uniform itexture2D)
+0:52              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:52            'c2' (uniform 2-component vector of float)
+0:52            Constant:
+0:52              3 (const int)
+0:53      Sequence
+0:53        move second child to first child (temp 4-component vector of uint)
+0:53          'txval32' (temp 4-component vector of uint)
+0:53          textureGather (global 4-component vector of uint)
+0:53            Construct combined texture-sampler (temp usampler2D)
+0:53              'g_tTex2du4' (uniform utexture2D)
+0:53              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:53            'c2' (uniform 2-component vector of float)
+0:53            Constant:
+0:53              3 (const int)
+0:57      Sequence
+0:57        move second child to first child (temp 4-component vector of float)
+0:57          'txval40' (temp 4-component vector of float)
+0:57          textureGather (global 4-component vector of float)
+0:57            Construct combined texture-sampler (temp samplerCube)
+0:57              'g_tTexcdf4' (uniform textureCube)
+0:57              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:57            'c3' (uniform 3-component vector of float)
+0:57            Constant:
+0:57              0 (const int)
+0:58      Sequence
+0:58        move second child to first child (temp 4-component vector of int)
+0:58          'txval41' (temp 4-component vector of int)
+0:58          textureGather (global 4-component vector of int)
+0:58            Construct combined texture-sampler (temp isamplerCube)
+0:58              'g_tTexcdi4' (uniform itextureCube)
+0:58              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:58            'c3' (uniform 3-component vector of float)
+0:58            Constant:
+0:58              0 (const int)
+0:59      Sequence
+0:59        move second child to first child (temp 4-component vector of uint)
+0:59          'txval42' (temp 4-component vector of uint)
+0:59          textureGather (global 4-component vector of uint)
+0:59            Construct combined texture-sampler (temp usamplerCube)
+0:59              'g_tTexcdu4' (uniform utextureCube)
+0:59              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:59            'c3' (uniform 3-component vector of float)
+0:59            Constant:
+0:59              0 (const int)
+0:61      Sequence
+0:61        move second child to first child (temp 4-component vector of float)
+0:61          'txval50' (temp 4-component vector of float)
+0:61          textureGather (global 4-component vector of float)
+0:61            Construct combined texture-sampler (temp samplerCube)
+0:61              'g_tTexcdf4' (uniform textureCube)
+0:61              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:61            'c3' (uniform 3-component vector of float)
+0:61            Constant:
+0:61              1 (const int)
+0:62      Sequence
+0:62        move second child to first child (temp 4-component vector of int)
+0:62          'txval51' (temp 4-component vector of int)
+0:62          textureGather (global 4-component vector of int)
+0:62            Construct combined texture-sampler (temp isamplerCube)
+0:62              'g_tTexcdi4' (uniform itextureCube)
+0:62              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:62            'c3' (uniform 3-component vector of float)
+0:62            Constant:
+0:62              1 (const int)
+0:63      Sequence
+0:63        move second child to first child (temp 4-component vector of uint)
+0:63          'txval52' (temp 4-component vector of uint)
+0:63          textureGather (global 4-component vector of uint)
+0:63            Construct combined texture-sampler (temp usamplerCube)
+0:63              'g_tTexcdu4' (uniform utextureCube)
+0:63              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:63            'c3' (uniform 3-component vector of float)
+0:63            Constant:
+0:63              1 (const int)
+0:65      Sequence
+0:65        move second child to first child (temp 4-component vector of float)
+0:65          'txval60' (temp 4-component vector of float)
+0:65          textureGather (global 4-component vector of float)
+0:65            Construct combined texture-sampler (temp samplerCube)
+0:65              'g_tTexcdf4' (uniform textureCube)
+0:65              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:65            'c3' (uniform 3-component vector of float)
+0:65            Constant:
+0:65              2 (const int)
+0:66      Sequence
+0:66        move second child to first child (temp 4-component vector of int)
+0:66          'txval61' (temp 4-component vector of int)
+0:66          textureGather (global 4-component vector of int)
+0:66            Construct combined texture-sampler (temp isamplerCube)
+0:66              'g_tTexcdi4' (uniform itextureCube)
+0:66              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:66            'c3' (uniform 3-component vector of float)
+0:66            Constant:
+0:66              2 (const int)
+0:67      Sequence
+0:67        move second child to first child (temp 4-component vector of uint)
+0:67          'txval62' (temp 4-component vector of uint)
+0:67          textureGather (global 4-component vector of uint)
+0:67            Construct combined texture-sampler (temp usamplerCube)
+0:67              'g_tTexcdu4' (uniform utextureCube)
+0:67              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:67            'c3' (uniform 3-component vector of float)
+0:67            Constant:
+0:67              2 (const int)
+0:69      Sequence
+0:69        move second child to first child (temp 4-component vector of float)
+0:69          'txval70' (temp 4-component vector of float)
+0:69          textureGather (global 4-component vector of float)
+0:69            Construct combined texture-sampler (temp samplerCube)
+0:69              'g_tTexcdf4' (uniform textureCube)
+0:69              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:69            'c3' (uniform 3-component vector of float)
+0:69            Constant:
+0:69              3 (const int)
+0:70      Sequence
+0:70        move second child to first child (temp 4-component vector of int)
+0:70          'txval71' (temp 4-component vector of int)
+0:70          textureGather (global 4-component vector of int)
+0:70            Construct combined texture-sampler (temp isamplerCube)
+0:70              'g_tTexcdi4' (uniform itextureCube)
+0:70              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:70            'c3' (uniform 3-component vector of float)
+0:70            Constant:
+0:70              3 (const int)
+0:71      Sequence
+0:71        move second child to first child (temp 4-component vector of uint)
+0:71          'txval72' (temp 4-component vector of uint)
+0:71          textureGather (global 4-component vector of uint)
+0:71            Construct combined texture-sampler (temp usamplerCube)
+0:71              'g_tTexcdu4' (uniform utextureCube)
+0:71              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:71            'c3' (uniform 3-component vector of float)
+0:71            Constant:
+0:71              3 (const int)
+0:73      move second child to first child (temp 4-component vector of float)
+0:73        Color: direct index for structure (temp 4-component vector of float)
+0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:73          Constant:
+0:73            0 (const int)
+0:73        Constant:
+0:73          1.000000
+0:73          1.000000
+0:73          1.000000
+0:73          1.000000
+0:74      move second child to first child (temp float)
+0:74        Depth: direct index for structure (temp float FragDepth)
+0:74          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:74          Constant:
+0:74            1 (const int)
+0:74        Constant:
+0:74          1.000000
+0:76      Branch: Return with expression
+0:76        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
+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_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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 230
+
+                              Capability Shader
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "main"
+                              Name 9  "txval00"
+                              Name 12  "g_tTex2df4"
+                              Name 16  "g_sSamp"
+                              Name 22  "c2"
+                              Name 29  "txval01"
+                              Name 32  "g_tTex2di4"
+                              Name 42  "txval02"
+                              Name 45  "g_tTex2du4"
+                              Name 52  "txval10"
+                              Name 59  "txval11"
+                              Name 65  "txval12"
+                              Name 71  "txval20"
+                              Name 78  "txval21"
+                              Name 84  "txval22"
+                              Name 90  "txval30"
+                              Name 97  "txval31"
+                              Name 103  "txval32"
+                              Name 109  "txval40"
+                              Name 112  "g_tTexcdf4"
+                              Name 119  "c3"
+                              Name 122  "txval41"
+                              Name 125  "g_tTexcdi4"
+                              Name 132  "txval42"
+                              Name 135  "g_tTexcdu4"
+                              Name 142  "txval50"
+                              Name 148  "txval51"
+                              Name 154  "txval52"
+                              Name 160  "txval60"
+                              Name 166  "txval61"
+                              Name 172  "txval62"
+                              Name 178  "txval70"
+                              Name 184  "txval71"
+                              Name 190  "txval72"
+                              Name 196  "PS_OUTPUT"
+                              MemberName 196(PS_OUTPUT) 0  "Color"
+                              MemberName 196(PS_OUTPUT) 1  "Depth"
+                              Name 198  "psout"
+                              Name 206  "g_sSamp2d"
+                              Name 209  "g_tTex1df4a"
+                              Name 210  "g_tTex1df4"
+                              Name 213  "g_tTex1di4"
+                              Name 216  "g_tTex1du4"
+                              Name 219  "g_tTex3df4"
+                              Name 222  "g_tTex3di4"
+                              Name 225  "g_tTex3du4"
+                              Name 227  "c1"
+                              Name 229  "c4"
+                              Decorate 12(g_tTex2df4) DescriptorSet 0
+                              Decorate 16(g_sSamp) DescriptorSet 0
+                              Decorate 16(g_sSamp) Binding 0
+                              Decorate 32(g_tTex2di4) DescriptorSet 0
+                              Decorate 45(g_tTex2du4) DescriptorSet 0
+                              Decorate 112(g_tTexcdf4) DescriptorSet 0
+                              Decorate 125(g_tTexcdi4) DescriptorSet 0
+                              Decorate 135(g_tTexcdu4) DescriptorSet 0
+                              MemberDecorate 196(PS_OUTPUT) 1 BuiltIn FragDepth
+                              Decorate 206(g_sSamp2d) DescriptorSet 0
+                              Decorate 209(g_tTex1df4a) DescriptorSet 0
+                              Decorate 209(g_tTex1df4a) Binding 1
+                              Decorate 210(g_tTex1df4) DescriptorSet 0
+                              Decorate 210(g_tTex1df4) Binding 0
+                              Decorate 213(g_tTex1di4) DescriptorSet 0
+                              Decorate 216(g_tTex1du4) DescriptorSet 0
+                              Decorate 219(g_tTex3df4) DescriptorSet 0
+                              Decorate 222(g_tTex3di4) DescriptorSet 0
+                              Decorate 225(g_tTex3du4) DescriptorSet 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(g_tTex2df4):     11(ptr) Variable UniformConstant
+              14:             TypeSampler
+              15:             TypePointer UniformConstant 14
+     16(g_sSamp):     15(ptr) Variable UniformConstant
+              18:             TypeSampledImage 10
+              20:             TypeVector 6(float) 2
+              21:             TypePointer UniformConstant 20(fvec2)
+          22(c2):     21(ptr) Variable UniformConstant
+              24:             TypeInt 32 1
+              25:     24(int) Constant 0
+              27:             TypeVector 24(int) 4
+              28:             TypePointer Function 27(ivec4)
+              30:             TypeImage 24(int) 2D sampled format:Unknown
+              31:             TypePointer UniformConstant 30
+  32(g_tTex2di4):     31(ptr) Variable UniformConstant
+              35:             TypeSampledImage 30
+              39:             TypeInt 32 0
+              40:             TypeVector 39(int) 4
+              41:             TypePointer Function 40(ivec4)
+              43:             TypeImage 39(int) 2D sampled format:Unknown
+              44:             TypePointer UniformConstant 43
+  45(g_tTex2du4):     44(ptr) Variable UniformConstant
+              48:             TypeSampledImage 43
+              57:     24(int) Constant 1
+              76:     24(int) Constant 2
+              95:     24(int) Constant 3
+             110:             TypeImage 6(float) Cube sampled format:Unknown
+             111:             TypePointer UniformConstant 110
+ 112(g_tTexcdf4):    111(ptr) Variable UniformConstant
+             115:             TypeSampledImage 110
+             117:             TypeVector 6(float) 3
+             118:             TypePointer UniformConstant 117(fvec3)
+         119(c3):    118(ptr) Variable UniformConstant
+             123:             TypeImage 24(int) Cube sampled format:Unknown
+             124:             TypePointer UniformConstant 123
+ 125(g_tTexcdi4):    124(ptr) Variable UniformConstant
+             128:             TypeSampledImage 123
+             133:             TypeImage 39(int) Cube sampled format:Unknown
+             134:             TypePointer UniformConstant 133
+ 135(g_tTexcdu4):    134(ptr) Variable UniformConstant
+             138:             TypeSampledImage 133
+  196(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
+             197:             TypePointer Function 196(PS_OUTPUT)
+             199:    6(float) Constant 1065353216
+             200:    7(fvec4) ConstantComposite 199 199 199 199
+             202:             TypePointer Function 6(float)
+  206(g_sSamp2d):     15(ptr) Variable UniformConstant
+             207:             TypeImage 6(float) 1D sampled format:Unknown
+             208:             TypePointer UniformConstant 207
+209(g_tTex1df4a):    208(ptr) Variable UniformConstant
+ 210(g_tTex1df4):    208(ptr) Variable UniformConstant
+             211:             TypeImage 24(int) 1D sampled format:Unknown
+             212:             TypePointer UniformConstant 211
+ 213(g_tTex1di4):    212(ptr) Variable UniformConstant
+             214:             TypeImage 39(int) 1D sampled format:Unknown
+             215:             TypePointer UniformConstant 214
+ 216(g_tTex1du4):    215(ptr) Variable UniformConstant
+             217:             TypeImage 6(float) 3D sampled format:Unknown
+             218:             TypePointer UniformConstant 217
+ 219(g_tTex3df4):    218(ptr) Variable UniformConstant
+             220:             TypeImage 24(int) 3D sampled format:Unknown
+             221:             TypePointer UniformConstant 220
+ 222(g_tTex3di4):    221(ptr) Variable UniformConstant
+             223:             TypeImage 39(int) 3D sampled format:Unknown
+             224:             TypePointer UniformConstant 223
+ 225(g_tTex3du4):    224(ptr) Variable UniformConstant
+             226:             TypePointer UniformConstant 6(float)
+         227(c1):    226(ptr) Variable UniformConstant
+             228:             TypePointer UniformConstant 7(fvec4)
+         229(c4):    228(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+      9(txval00):      8(ptr) Variable Function
+     29(txval01):     28(ptr) Variable Function
+     42(txval02):     41(ptr) Variable Function
+     52(txval10):      8(ptr) Variable Function
+     59(txval11):     28(ptr) Variable Function
+     65(txval12):     41(ptr) Variable Function
+     71(txval20):      8(ptr) Variable Function
+     78(txval21):     28(ptr) Variable Function
+     84(txval22):     41(ptr) Variable Function
+     90(txval30):      8(ptr) Variable Function
+     97(txval31):     28(ptr) Variable Function
+    103(txval32):     41(ptr) Variable Function
+    109(txval40):      8(ptr) Variable Function
+    122(txval41):     28(ptr) Variable Function
+    132(txval42):     41(ptr) Variable Function
+    142(txval50):      8(ptr) Variable Function
+    148(txval51):     28(ptr) Variable Function
+    154(txval52):     41(ptr) Variable Function
+    160(txval60):      8(ptr) Variable Function
+    166(txval61):     28(ptr) Variable Function
+    172(txval62):     41(ptr) Variable Function
+    178(txval70):      8(ptr) Variable Function
+    184(txval71):     28(ptr) Variable Function
+    190(txval72):     41(ptr) Variable Function
+      198(psout):    197(ptr) Variable Function
+              13:          10 Load 12(g_tTex2df4)
+              17:          14 Load 16(g_sSamp)
+              19:          18 SampledImage 13 17
+              23:   20(fvec2) Load 22(c2)
+              26:    7(fvec4) ImageGather 19 23 25
+                              Store 9(txval00) 26
+              33:          30 Load 32(g_tTex2di4)
+              34:          14 Load 16(g_sSamp)
+              36:          35 SampledImage 33 34
+              37:   20(fvec2) Load 22(c2)
+              38:   27(ivec4) ImageGather 36 37 25
+                              Store 29(txval01) 38
+              46:          43 Load 45(g_tTex2du4)
+              47:          14 Load 16(g_sSamp)
+              49:          48 SampledImage 46 47
+              50:   20(fvec2) Load 22(c2)
+              51:   40(ivec4) ImageGather 49 50 25
+                              Store 42(txval02) 51
+              53:          10 Load 12(g_tTex2df4)
+              54:          14 Load 16(g_sSamp)
+              55:          18 SampledImage 53 54
+              56:   20(fvec2) Load 22(c2)
+              58:    7(fvec4) ImageGather 55 56 57
+                              Store 52(txval10) 58
+              60:          30 Load 32(g_tTex2di4)
+              61:          14 Load 16(g_sSamp)
+              62:          35 SampledImage 60 61
+              63:   20(fvec2) Load 22(c2)
+              64:   27(ivec4) ImageGather 62 63 57
+                              Store 59(txval11) 64
+              66:          43 Load 45(g_tTex2du4)
+              67:          14 Load 16(g_sSamp)
+              68:          48 SampledImage 66 67
+              69:   20(fvec2) Load 22(c2)
+              70:   40(ivec4) ImageGather 68 69 57
+                              Store 65(txval12) 70
+              72:          10 Load 12(g_tTex2df4)
+              73:          14 Load 16(g_sSamp)
+              74:          18 SampledImage 72 73
+              75:   20(fvec2) Load 22(c2)
+              77:    7(fvec4) ImageGather 74 75 76
+                              Store 71(txval20) 77
+              79:          30 Load 32(g_tTex2di4)
+              80:          14 Load 16(g_sSamp)
+              81:          35 SampledImage 79 80
+              82:   20(fvec2) Load 22(c2)
+              83:   27(ivec4) ImageGather 81 82 76
+                              Store 78(txval21) 83
+              85:          43 Load 45(g_tTex2du4)
+              86:          14 Load 16(g_sSamp)
+              87:          48 SampledImage 85 86
+              88:   20(fvec2) Load 22(c2)
+              89:   40(ivec4) ImageGather 87 88 76
+                              Store 84(txval22) 89
+              91:          10 Load 12(g_tTex2df4)
+              92:          14 Load 16(g_sSamp)
+              93:          18 SampledImage 91 92
+              94:   20(fvec2) Load 22(c2)
+              96:    7(fvec4) ImageGather 93 94 95
+                              Store 90(txval30) 96
+              98:          30 Load 32(g_tTex2di4)
+              99:          14 Load 16(g_sSamp)
+             100:          35 SampledImage 98 99
+             101:   20(fvec2) Load 22(c2)
+             102:   27(ivec4) ImageGather 100 101 95
+                              Store 97(txval31) 102
+             104:          43 Load 45(g_tTex2du4)
+             105:          14 Load 16(g_sSamp)
+             106:          48 SampledImage 104 105
+             107:   20(fvec2) Load 22(c2)
+             108:   40(ivec4) ImageGather 106 107 95
+                              Store 103(txval32) 108
+             113:         110 Load 112(g_tTexcdf4)
+             114:          14 Load 16(g_sSamp)
+             116:         115 SampledImage 113 114
+             120:  117(fvec3) Load 119(c3)
+             121:    7(fvec4) ImageGather 116 120 25
+                              Store 109(txval40) 121
+             126:         123 Load 125(g_tTexcdi4)
+             127:          14 Load 16(g_sSamp)
+             129:         128 SampledImage 126 127
+             130:  117(fvec3) Load 119(c3)
+             131:   27(ivec4) ImageGather 129 130 25
+                              Store 122(txval41) 131
+             136:         133 Load 135(g_tTexcdu4)
+             137:          14 Load 16(g_sSamp)
+             139:         138 SampledImage 136 137
+             140:  117(fvec3) Load 119(c3)
+             141:   40(ivec4) ImageGather 139 140 25
+                              Store 132(txval42) 141
+             143:         110 Load 112(g_tTexcdf4)
+             144:          14 Load 16(g_sSamp)
+             145:         115 SampledImage 143 144
+             146:  117(fvec3) Load 119(c3)
+             147:    7(fvec4) ImageGather 145 146 57
+                              Store 142(txval50) 147
+             149:         123 Load 125(g_tTexcdi4)
+             150:          14 Load 16(g_sSamp)
+             151:         128 SampledImage 149 150
+             152:  117(fvec3) Load 119(c3)
+             153:   27(ivec4) ImageGather 151 152 57
+                              Store 148(txval51) 153
+             155:         133 Load 135(g_tTexcdu4)
+             156:          14 Load 16(g_sSamp)
+             157:         138 SampledImage 155 156
+             158:  117(fvec3) Load 119(c3)
+             159:   40(ivec4) ImageGather 157 158 57
+                              Store 154(txval52) 159
+             161:         110 Load 112(g_tTexcdf4)
+             162:          14 Load 16(g_sSamp)
+             163:         115 SampledImage 161 162
+             164:  117(fvec3) Load 119(c3)
+             165:    7(fvec4) ImageGather 163 164 76
+                              Store 160(txval60) 165
+             167:         123 Load 125(g_tTexcdi4)
+             168:          14 Load 16(g_sSamp)
+             169:         128 SampledImage 167 168
+             170:  117(fvec3) Load 119(c3)
+             171:   27(ivec4) ImageGather 169 170 76
+                              Store 166(txval61) 171
+             173:         133 Load 135(g_tTexcdu4)
+             174:          14 Load 16(g_sSamp)
+             175:         138 SampledImage 173 174
+             176:  117(fvec3) Load 119(c3)
+             177:   40(ivec4) ImageGather 175 176 76
+                              Store 172(txval62) 177
+             179:         110 Load 112(g_tTexcdf4)
+             180:          14 Load 16(g_sSamp)
+             181:         115 SampledImage 179 180
+             182:  117(fvec3) Load 119(c3)
+             183:    7(fvec4) ImageGather 181 182 95
+                              Store 178(txval70) 183
+             185:         123 Load 125(g_tTexcdi4)
+             186:          14 Load 16(g_sSamp)
+             187:         128 SampledImage 185 186
+             188:  117(fvec3) Load 119(c3)
+             189:   27(ivec4) ImageGather 187 188 95
+                              Store 184(txval71) 189
+             191:         133 Load 135(g_tTexcdu4)
+             192:          14 Load 16(g_sSamp)
+             193:         138 SampledImage 191 192
+             194:  117(fvec3) Load 119(c3)
+             195:   40(ivec4) ImageGather 193 194 95
+                              Store 190(txval72) 195
+             201:      8(ptr) AccessChain 198(psout) 25
+                              Store 201 200
+             203:    202(ptr) AccessChain 198(psout) 57
+                              Store 203 199
+             204:196(PS_OUTPUT) Load 198(psout)
+                              ReturnValue 204
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
new file mode 100644
index 0000000..ea0d94a
--- /dev/null
+++ b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
@@ -0,0 +1,1148 @@
+hlsl.gatherRGBA.offset.dx10.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:117  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39    Function Parameters: 
+0:?     Sequence
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of float)
+0:46          'txval001' (temp 4-component vector of float)
+0:46          textureGatherOffset (global 4-component vector of float)
+0:46            Construct combined texture-sampler (temp sampler2D)
+0:46              'g_tTex2df4' (uniform texture2D)
+0:46              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:46            'c2' (uniform 2-component vector of float)
+0:46            'o2' (uniform 2-component vector of int)
+0:46            Constant:
+0:46              0 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of int)
+0:47          'txval011' (temp 4-component vector of int)
+0:47          textureGatherOffset (global 4-component vector of int)
+0:47            Construct combined texture-sampler (temp isampler2D)
+0:47              'g_tTex2di4' (uniform itexture2D)
+0:47              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:47            'c2' (uniform 2-component vector of float)
+0:47            'o2' (uniform 2-component vector of int)
+0:47            Constant:
+0:47              0 (const int)
+0:48      Sequence
+0:48        move second child to first child (temp 4-component vector of uint)
+0:48          'txval021' (temp 4-component vector of uint)
+0:48          textureGatherOffset (global 4-component vector of uint)
+0:48            Construct combined texture-sampler (temp usampler2D)
+0:48              'g_tTex2du4' (uniform utexture2D)
+0:48              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:48            'c2' (uniform 2-component vector of float)
+0:48            'o2' (uniform 2-component vector of int)
+0:48            Constant:
+0:48              0 (const int)
+0:50      Sequence
+0:50        move second child to first child (temp 4-component vector of float)
+0:50          'txval004' (temp 4-component vector of float)
+0:50          textureGatherOffsets (global 4-component vector of float)
+0:50            Construct combined texture-sampler (temp sampler2D)
+0:50              'g_tTex2df4' (uniform texture2D)
+0:50              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:50            'c2' (uniform 2-component vector of float)
+0:50            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of int)
+0:51          'txval014' (temp 4-component vector of int)
+0:51          textureGatherOffsets (global 4-component vector of int)
+0:51            Construct combined texture-sampler (temp isampler2D)
+0:51              'g_tTex2di4' (uniform itexture2D)
+0:51              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:51            'c2' (uniform 2-component vector of float)
+0:51            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51            Constant:
+0:51              0 (const int)
+0:52      Sequence
+0:52        move second child to first child (temp 4-component vector of uint)
+0:52          'txval024' (temp 4-component vector of uint)
+0:52          textureGatherOffsets (global 4-component vector of uint)
+0:52            Construct combined texture-sampler (temp usampler2D)
+0:52              'g_tTex2du4' (uniform utexture2D)
+0:52              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:52            'c2' (uniform 2-component vector of float)
+0:52            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52            Constant:
+0:52              0 (const int)
+0:62      Sequence
+0:62        move second child to first child (temp 4-component vector of float)
+0:62          'txval101' (temp 4-component vector of float)
+0:62          textureGatherOffset (global 4-component vector of float)
+0:62            Construct combined texture-sampler (temp sampler2D)
+0:62              'g_tTex2df4' (uniform texture2D)
+0:62              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:62            'c2' (uniform 2-component vector of float)
+0:62            'o2' (uniform 2-component vector of int)
+0:62            Constant:
+0:62              1 (const int)
+0:63      Sequence
+0:63        move second child to first child (temp 4-component vector of int)
+0:63          'txval111' (temp 4-component vector of int)
+0:63          textureGatherOffset (global 4-component vector of int)
+0:63            Construct combined texture-sampler (temp isampler2D)
+0:63              'g_tTex2di4' (uniform itexture2D)
+0:63              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:63            'c2' (uniform 2-component vector of float)
+0:63            'o2' (uniform 2-component vector of int)
+0:63            Constant:
+0:63              1 (const int)
+0:64      Sequence
+0:64        move second child to first child (temp 4-component vector of uint)
+0:64          'txval121' (temp 4-component vector of uint)
+0:64          textureGatherOffset (global 4-component vector of uint)
+0:64            Construct combined texture-sampler (temp usampler2D)
+0:64              'g_tTex2du4' (uniform utexture2D)
+0:64              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:64            'c2' (uniform 2-component vector of float)
+0:64            'o2' (uniform 2-component vector of int)
+0:64            Constant:
+0:64              1 (const int)
+0:66      Sequence
+0:66        move second child to first child (temp 4-component vector of float)
+0:66          'txval104' (temp 4-component vector of float)
+0:66          textureGatherOffsets (global 4-component vector of float)
+0:66            Construct combined texture-sampler (temp sampler2D)
+0:66              'g_tTex2df4' (uniform texture2D)
+0:66              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:66            'c2' (uniform 2-component vector of float)
+0:66            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66            Constant:
+0:66              1 (const int)
+0:67      Sequence
+0:67        move second child to first child (temp 4-component vector of int)
+0:67          'txval114' (temp 4-component vector of int)
+0:67          textureGatherOffsets (global 4-component vector of int)
+0:67            Construct combined texture-sampler (temp isampler2D)
+0:67              'g_tTex2di4' (uniform itexture2D)
+0:67              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:67            'c2' (uniform 2-component vector of float)
+0:67            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67            Constant:
+0:67              1 (const int)
+0:68      Sequence
+0:68        move second child to first child (temp 4-component vector of uint)
+0:68          'txval124' (temp 4-component vector of uint)
+0:68          textureGatherOffsets (global 4-component vector of uint)
+0:68            Construct combined texture-sampler (temp usampler2D)
+0:68              'g_tTex2du4' (uniform utexture2D)
+0:68              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:68            'c2' (uniform 2-component vector of float)
+0:68            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68            Constant:
+0:68              1 (const int)
+0:78      Sequence
+0:78        move second child to first child (temp 4-component vector of float)
+0:78          'txval201' (temp 4-component vector of float)
+0:78          textureGatherOffset (global 4-component vector of float)
+0:78            Construct combined texture-sampler (temp sampler2D)
+0:78              'g_tTex2df4' (uniform texture2D)
+0:78              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:78            'c2' (uniform 2-component vector of float)
+0:78            'o2' (uniform 2-component vector of int)
+0:78            Constant:
+0:78              2 (const int)
+0:79      Sequence
+0:79        move second child to first child (temp 4-component vector of int)
+0:79          'txval211' (temp 4-component vector of int)
+0:79          textureGatherOffset (global 4-component vector of int)
+0:79            Construct combined texture-sampler (temp isampler2D)
+0:79              'g_tTex2di4' (uniform itexture2D)
+0:79              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:79            'c2' (uniform 2-component vector of float)
+0:79            'o2' (uniform 2-component vector of int)
+0:79            Constant:
+0:79              2 (const int)
+0:80      Sequence
+0:80        move second child to first child (temp 4-component vector of uint)
+0:80          'txval221' (temp 4-component vector of uint)
+0:80          textureGatherOffset (global 4-component vector of uint)
+0:80            Construct combined texture-sampler (temp usampler2D)
+0:80              'g_tTex2du4' (uniform utexture2D)
+0:80              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:80            'c2' (uniform 2-component vector of float)
+0:80            'o2' (uniform 2-component vector of int)
+0:80            Constant:
+0:80              2 (const int)
+0:82      Sequence
+0:82        move second child to first child (temp 4-component vector of float)
+0:82          'txval204' (temp 4-component vector of float)
+0:82          textureGatherOffsets (global 4-component vector of float)
+0:82            Construct combined texture-sampler (temp sampler2D)
+0:82              'g_tTex2df4' (uniform texture2D)
+0:82              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:82            'c2' (uniform 2-component vector of float)
+0:82            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82            Constant:
+0:82              2 (const int)
+0:83      Sequence
+0:83        move second child to first child (temp 4-component vector of int)
+0:83          'txval214' (temp 4-component vector of int)
+0:83          textureGatherOffsets (global 4-component vector of int)
+0:83            Construct combined texture-sampler (temp isampler2D)
+0:83              'g_tTex2di4' (uniform itexture2D)
+0:83              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:83            'c2' (uniform 2-component vector of float)
+0:83            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83            Constant:
+0:83              2 (const int)
+0:84      Sequence
+0:84        move second child to first child (temp 4-component vector of uint)
+0:84          'txval224' (temp 4-component vector of uint)
+0:84          textureGatherOffsets (global 4-component vector of uint)
+0:84            Construct combined texture-sampler (temp usampler2D)
+0:84              'g_tTex2du4' (uniform utexture2D)
+0:84              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:84            'c2' (uniform 2-component vector of float)
+0:84            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84            Constant:
+0:84              2 (const int)
+0:94      Sequence
+0:94        move second child to first child (temp 4-component vector of float)
+0:94          'txval301' (temp 4-component vector of float)
+0:94          textureGatherOffset (global 4-component vector of float)
+0:94            Construct combined texture-sampler (temp sampler2D)
+0:94              'g_tTex2df4' (uniform texture2D)
+0:94              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:94            'c2' (uniform 2-component vector of float)
+0:94            'o2' (uniform 2-component vector of int)
+0:94            Constant:
+0:94              3 (const int)
+0:95      Sequence
+0:95        move second child to first child (temp 4-component vector of int)
+0:95          'txval311' (temp 4-component vector of int)
+0:95          textureGatherOffset (global 4-component vector of int)
+0:95            Construct combined texture-sampler (temp isampler2D)
+0:95              'g_tTex2di4' (uniform itexture2D)
+0:95              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:95            'c2' (uniform 2-component vector of float)
+0:95            'o2' (uniform 2-component vector of int)
+0:95            Constant:
+0:95              3 (const int)
+0:96      Sequence
+0:96        move second child to first child (temp 4-component vector of uint)
+0:96          'txval321' (temp 4-component vector of uint)
+0:96          textureGatherOffset (global 4-component vector of uint)
+0:96            Construct combined texture-sampler (temp usampler2D)
+0:96              'g_tTex2du4' (uniform utexture2D)
+0:96              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:96            'c2' (uniform 2-component vector of float)
+0:96            'o2' (uniform 2-component vector of int)
+0:96            Constant:
+0:96              3 (const int)
+0:98      Sequence
+0:98        move second child to first child (temp 4-component vector of float)
+0:98          'txval304' (temp 4-component vector of float)
+0:98          textureGatherOffsets (global 4-component vector of float)
+0:98            Construct combined texture-sampler (temp sampler2D)
+0:98              'g_tTex2df4' (uniform texture2D)
+0:98              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:98            'c2' (uniform 2-component vector of float)
+0:98            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98            Constant:
+0:98              3 (const int)
+0:99      Sequence
+0:99        move second child to first child (temp 4-component vector of int)
+0:99          'txval314' (temp 4-component vector of int)
+0:99          textureGatherOffsets (global 4-component vector of int)
+0:99            Construct combined texture-sampler (temp isampler2D)
+0:99              'g_tTex2di4' (uniform itexture2D)
+0:99              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:99            'c2' (uniform 2-component vector of float)
+0:99            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99            Constant:
+0:99              3 (const int)
+0:100      Sequence
+0:100        move second child to first child (temp 4-component vector of uint)
+0:100          'txval324' (temp 4-component vector of uint)
+0:100          textureGatherOffsets (global 4-component vector of uint)
+0:100            Construct combined texture-sampler (temp usampler2D)
+0:100              'g_tTex2du4' (uniform utexture2D)
+0:100              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:100            'c2' (uniform 2-component vector of float)
+0:100            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100            Constant:
+0:100              3 (const int)
+0:112      move second child to first child (temp 4-component vector of float)
+0:112        Color: direct index for structure (temp 4-component vector of float)
+0:112          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:112          Constant:
+0:112            0 (const int)
+0:112        Constant:
+0:112          1.000000
+0:112          1.000000
+0:112          1.000000
+0:112          1.000000
+0:113      move second child to first child (temp float)
+0:113        Depth: direct index for structure (temp float FragDepth)
+0:113          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:113          Constant:
+0:113            1 (const int)
+0:113        Constant:
+0:113          1.000000
+0:115      Branch: Return with expression
+0:115        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
+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_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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+0:?     'o1' (uniform int)
+0:?     'o2' (uniform 2-component vector of int)
+0:?     'o3' (uniform 3-component vector of int)
+0:?     'o4' (uniform 4-component vector of int)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:117  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39    Function Parameters: 
+0:?     Sequence
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of float)
+0:46          'txval001' (temp 4-component vector of float)
+0:46          textureGatherOffset (global 4-component vector of float)
+0:46            Construct combined texture-sampler (temp sampler2D)
+0:46              'g_tTex2df4' (uniform texture2D)
+0:46              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:46            'c2' (uniform 2-component vector of float)
+0:46            'o2' (uniform 2-component vector of int)
+0:46            Constant:
+0:46              0 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of int)
+0:47          'txval011' (temp 4-component vector of int)
+0:47          textureGatherOffset (global 4-component vector of int)
+0:47            Construct combined texture-sampler (temp isampler2D)
+0:47              'g_tTex2di4' (uniform itexture2D)
+0:47              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:47            'c2' (uniform 2-component vector of float)
+0:47            'o2' (uniform 2-component vector of int)
+0:47            Constant:
+0:47              0 (const int)
+0:48      Sequence
+0:48        move second child to first child (temp 4-component vector of uint)
+0:48          'txval021' (temp 4-component vector of uint)
+0:48          textureGatherOffset (global 4-component vector of uint)
+0:48            Construct combined texture-sampler (temp usampler2D)
+0:48              'g_tTex2du4' (uniform utexture2D)
+0:48              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:48            'c2' (uniform 2-component vector of float)
+0:48            'o2' (uniform 2-component vector of int)
+0:48            Constant:
+0:48              0 (const int)
+0:50      Sequence
+0:50        move second child to first child (temp 4-component vector of float)
+0:50          'txval004' (temp 4-component vector of float)
+0:50          textureGatherOffsets (global 4-component vector of float)
+0:50            Construct combined texture-sampler (temp sampler2D)
+0:50              'g_tTex2df4' (uniform texture2D)
+0:50              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:50            'c2' (uniform 2-component vector of float)
+0:50            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50              'o2' (uniform 2-component vector of int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of int)
+0:51          'txval014' (temp 4-component vector of int)
+0:51          textureGatherOffsets (global 4-component vector of int)
+0:51            Construct combined texture-sampler (temp isampler2D)
+0:51              'g_tTex2di4' (uniform itexture2D)
+0:51              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:51            'c2' (uniform 2-component vector of float)
+0:51            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51              'o2' (uniform 2-component vector of int)
+0:51            Constant:
+0:51              0 (const int)
+0:52      Sequence
+0:52        move second child to first child (temp 4-component vector of uint)
+0:52          'txval024' (temp 4-component vector of uint)
+0:52          textureGatherOffsets (global 4-component vector of uint)
+0:52            Construct combined texture-sampler (temp usampler2D)
+0:52              'g_tTex2du4' (uniform utexture2D)
+0:52              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:52            'c2' (uniform 2-component vector of float)
+0:52            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52              'o2' (uniform 2-component vector of int)
+0:52            Constant:
+0:52              0 (const int)
+0:62      Sequence
+0:62        move second child to first child (temp 4-component vector of float)
+0:62          'txval101' (temp 4-component vector of float)
+0:62          textureGatherOffset (global 4-component vector of float)
+0:62            Construct combined texture-sampler (temp sampler2D)
+0:62              'g_tTex2df4' (uniform texture2D)
+0:62              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:62            'c2' (uniform 2-component vector of float)
+0:62            'o2' (uniform 2-component vector of int)
+0:62            Constant:
+0:62              1 (const int)
+0:63      Sequence
+0:63        move second child to first child (temp 4-component vector of int)
+0:63          'txval111' (temp 4-component vector of int)
+0:63          textureGatherOffset (global 4-component vector of int)
+0:63            Construct combined texture-sampler (temp isampler2D)
+0:63              'g_tTex2di4' (uniform itexture2D)
+0:63              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:63            'c2' (uniform 2-component vector of float)
+0:63            'o2' (uniform 2-component vector of int)
+0:63            Constant:
+0:63              1 (const int)
+0:64      Sequence
+0:64        move second child to first child (temp 4-component vector of uint)
+0:64          'txval121' (temp 4-component vector of uint)
+0:64          textureGatherOffset (global 4-component vector of uint)
+0:64            Construct combined texture-sampler (temp usampler2D)
+0:64              'g_tTex2du4' (uniform utexture2D)
+0:64              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:64            'c2' (uniform 2-component vector of float)
+0:64            'o2' (uniform 2-component vector of int)
+0:64            Constant:
+0:64              1 (const int)
+0:66      Sequence
+0:66        move second child to first child (temp 4-component vector of float)
+0:66          'txval104' (temp 4-component vector of float)
+0:66          textureGatherOffsets (global 4-component vector of float)
+0:66            Construct combined texture-sampler (temp sampler2D)
+0:66              'g_tTex2df4' (uniform texture2D)
+0:66              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:66            'c2' (uniform 2-component vector of float)
+0:66            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66              'o2' (uniform 2-component vector of int)
+0:66            Constant:
+0:66              1 (const int)
+0:67      Sequence
+0:67        move second child to first child (temp 4-component vector of int)
+0:67          'txval114' (temp 4-component vector of int)
+0:67          textureGatherOffsets (global 4-component vector of int)
+0:67            Construct combined texture-sampler (temp isampler2D)
+0:67              'g_tTex2di4' (uniform itexture2D)
+0:67              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:67            'c2' (uniform 2-component vector of float)
+0:67            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67              'o2' (uniform 2-component vector of int)
+0:67            Constant:
+0:67              1 (const int)
+0:68      Sequence
+0:68        move second child to first child (temp 4-component vector of uint)
+0:68          'txval124' (temp 4-component vector of uint)
+0:68          textureGatherOffsets (global 4-component vector of uint)
+0:68            Construct combined texture-sampler (temp usampler2D)
+0:68              'g_tTex2du4' (uniform utexture2D)
+0:68              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:68            'c2' (uniform 2-component vector of float)
+0:68            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68              'o2' (uniform 2-component vector of int)
+0:68            Constant:
+0:68              1 (const int)
+0:78      Sequence
+0:78        move second child to first child (temp 4-component vector of float)
+0:78          'txval201' (temp 4-component vector of float)
+0:78          textureGatherOffset (global 4-component vector of float)
+0:78            Construct combined texture-sampler (temp sampler2D)
+0:78              'g_tTex2df4' (uniform texture2D)
+0:78              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:78            'c2' (uniform 2-component vector of float)
+0:78            'o2' (uniform 2-component vector of int)
+0:78            Constant:
+0:78              2 (const int)
+0:79      Sequence
+0:79        move second child to first child (temp 4-component vector of int)
+0:79          'txval211' (temp 4-component vector of int)
+0:79          textureGatherOffset (global 4-component vector of int)
+0:79            Construct combined texture-sampler (temp isampler2D)
+0:79              'g_tTex2di4' (uniform itexture2D)
+0:79              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:79            'c2' (uniform 2-component vector of float)
+0:79            'o2' (uniform 2-component vector of int)
+0:79            Constant:
+0:79              2 (const int)
+0:80      Sequence
+0:80        move second child to first child (temp 4-component vector of uint)
+0:80          'txval221' (temp 4-component vector of uint)
+0:80          textureGatherOffset (global 4-component vector of uint)
+0:80            Construct combined texture-sampler (temp usampler2D)
+0:80              'g_tTex2du4' (uniform utexture2D)
+0:80              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:80            'c2' (uniform 2-component vector of float)
+0:80            'o2' (uniform 2-component vector of int)
+0:80            Constant:
+0:80              2 (const int)
+0:82      Sequence
+0:82        move second child to first child (temp 4-component vector of float)
+0:82          'txval204' (temp 4-component vector of float)
+0:82          textureGatherOffsets (global 4-component vector of float)
+0:82            Construct combined texture-sampler (temp sampler2D)
+0:82              'g_tTex2df4' (uniform texture2D)
+0:82              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:82            'c2' (uniform 2-component vector of float)
+0:82            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82              'o2' (uniform 2-component vector of int)
+0:82            Constant:
+0:82              2 (const int)
+0:83      Sequence
+0:83        move second child to first child (temp 4-component vector of int)
+0:83          'txval214' (temp 4-component vector of int)
+0:83          textureGatherOffsets (global 4-component vector of int)
+0:83            Construct combined texture-sampler (temp isampler2D)
+0:83              'g_tTex2di4' (uniform itexture2D)
+0:83              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:83            'c2' (uniform 2-component vector of float)
+0:83            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83              'o2' (uniform 2-component vector of int)
+0:83            Constant:
+0:83              2 (const int)
+0:84      Sequence
+0:84        move second child to first child (temp 4-component vector of uint)
+0:84          'txval224' (temp 4-component vector of uint)
+0:84          textureGatherOffsets (global 4-component vector of uint)
+0:84            Construct combined texture-sampler (temp usampler2D)
+0:84              'g_tTex2du4' (uniform utexture2D)
+0:84              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:84            'c2' (uniform 2-component vector of float)
+0:84            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84              'o2' (uniform 2-component vector of int)
+0:84            Constant:
+0:84              2 (const int)
+0:94      Sequence
+0:94        move second child to first child (temp 4-component vector of float)
+0:94          'txval301' (temp 4-component vector of float)
+0:94          textureGatherOffset (global 4-component vector of float)
+0:94            Construct combined texture-sampler (temp sampler2D)
+0:94              'g_tTex2df4' (uniform texture2D)
+0:94              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:94            'c2' (uniform 2-component vector of float)
+0:94            'o2' (uniform 2-component vector of int)
+0:94            Constant:
+0:94              3 (const int)
+0:95      Sequence
+0:95        move second child to first child (temp 4-component vector of int)
+0:95          'txval311' (temp 4-component vector of int)
+0:95          textureGatherOffset (global 4-component vector of int)
+0:95            Construct combined texture-sampler (temp isampler2D)
+0:95              'g_tTex2di4' (uniform itexture2D)
+0:95              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:95            'c2' (uniform 2-component vector of float)
+0:95            'o2' (uniform 2-component vector of int)
+0:95            Constant:
+0:95              3 (const int)
+0:96      Sequence
+0:96        move second child to first child (temp 4-component vector of uint)
+0:96          'txval321' (temp 4-component vector of uint)
+0:96          textureGatherOffset (global 4-component vector of uint)
+0:96            Construct combined texture-sampler (temp usampler2D)
+0:96              'g_tTex2du4' (uniform utexture2D)
+0:96              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:96            'c2' (uniform 2-component vector of float)
+0:96            'o2' (uniform 2-component vector of int)
+0:96            Constant:
+0:96              3 (const int)
+0:98      Sequence
+0:98        move second child to first child (temp 4-component vector of float)
+0:98          'txval304' (temp 4-component vector of float)
+0:98          textureGatherOffsets (global 4-component vector of float)
+0:98            Construct combined texture-sampler (temp sampler2D)
+0:98              'g_tTex2df4' (uniform texture2D)
+0:98              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:98            'c2' (uniform 2-component vector of float)
+0:98            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98              'o2' (uniform 2-component vector of int)
+0:98            Constant:
+0:98              3 (const int)
+0:99      Sequence
+0:99        move second child to first child (temp 4-component vector of int)
+0:99          'txval314' (temp 4-component vector of int)
+0:99          textureGatherOffsets (global 4-component vector of int)
+0:99            Construct combined texture-sampler (temp isampler2D)
+0:99              'g_tTex2di4' (uniform itexture2D)
+0:99              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:99            'c2' (uniform 2-component vector of float)
+0:99            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99              'o2' (uniform 2-component vector of int)
+0:99            Constant:
+0:99              3 (const int)
+0:100      Sequence
+0:100        move second child to first child (temp 4-component vector of uint)
+0:100          'txval324' (temp 4-component vector of uint)
+0:100          textureGatherOffsets (global 4-component vector of uint)
+0:100            Construct combined texture-sampler (temp usampler2D)
+0:100              'g_tTex2du4' (uniform utexture2D)
+0:100              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:100            'c2' (uniform 2-component vector of float)
+0:100            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100              'o2' (uniform 2-component vector of int)
+0:100            Constant:
+0:100              3 (const int)
+0:112      move second child to first child (temp 4-component vector of float)
+0:112        Color: direct index for structure (temp 4-component vector of float)
+0:112          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:112          Constant:
+0:112            0 (const int)
+0:112        Constant:
+0:112          1.000000
+0:112          1.000000
+0:112          1.000000
+0:112          1.000000
+0:113      move second child to first child (temp float)
+0:113        Depth: direct index for structure (temp float FragDepth)
+0:113          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:113          Constant:
+0:113            1 (const int)
+0:113        Constant:
+0:113          1.000000
+0:115      Branch: Return with expression
+0:115        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
+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_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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+0:?     'o1' (uniform int)
+0:?     'o2' (uniform 2-component vector of int)
+0:?     'o3' (uniform 3-component vector of int)
+0:?     'o4' (uniform 4-component vector of int)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 311
+
+                              Capability Shader
+                              Capability ImageGatherExtended
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "main"
+                              Name 9  "txval001"
+                              Name 12  "g_tTex2df4"
+                              Name 16  "g_sSamp"
+                              Name 22  "c2"
+                              Name 27  "o2"
+                              Name 33  "txval011"
+                              Name 36  "g_tTex2di4"
+                              Name 47  "txval021"
+                              Name 50  "g_tTex2du4"
+                              Name 58  "txval004"
+                              Name 71  "txval014"
+                              Name 82  "txval024"
+                              Name 93  "txval101"
+                              Name 101  "txval111"
+                              Name 108  "txval121"
+                              Name 115  "txval104"
+                              Name 126  "txval114"
+                              Name 137  "txval124"
+                              Name 148  "txval201"
+                              Name 156  "txval211"
+                              Name 163  "txval221"
+                              Name 170  "txval204"
+                              Name 181  "txval214"
+                              Name 192  "txval224"
+                              Name 203  "txval301"
+                              Name 211  "txval311"
+                              Name 218  "txval321"
+                              Name 225  "txval304"
+                              Name 236  "txval314"
+                              Name 247  "txval324"
+                              Name 258  "PS_OUTPUT"
+                              MemberName 258(PS_OUTPUT) 0  "Color"
+                              MemberName 258(PS_OUTPUT) 1  "Depth"
+                              Name 260  "psout"
+                              Name 268  "g_sSamp2d"
+                              Name 271  "g_tTex1df4a"
+                              Name 272  "g_tTex1df4"
+                              Name 275  "g_tTex1di4"
+                              Name 278  "g_tTex1du4"
+                              Name 281  "g_tTex3df4"
+                              Name 284  "g_tTex3di4"
+                              Name 287  "g_tTex3du4"
+                              Name 290  "g_tTexcdf4"
+                              Name 293  "g_tTexcdi4"
+                              Name 296  "g_tTexcdu4"
+                              Name 298  "c1"
+                              Name 301  "c3"
+                              Name 303  "c4"
+                              Name 305  "o1"
+                              Name 308  "o3"
+                              Name 310  "o4"
+                              Decorate 12(g_tTex2df4) DescriptorSet 0
+                              Decorate 16(g_sSamp) DescriptorSet 0
+                              Decorate 16(g_sSamp) Binding 0
+                              Decorate 36(g_tTex2di4) DescriptorSet 0
+                              Decorate 50(g_tTex2du4) DescriptorSet 0
+                              MemberDecorate 258(PS_OUTPUT) 1 BuiltIn FragDepth
+                              Decorate 268(g_sSamp2d) DescriptorSet 0
+                              Decorate 271(g_tTex1df4a) DescriptorSet 0
+                              Decorate 271(g_tTex1df4a) Binding 1
+                              Decorate 272(g_tTex1df4) DescriptorSet 0
+                              Decorate 272(g_tTex1df4) Binding 0
+                              Decorate 275(g_tTex1di4) DescriptorSet 0
+                              Decorate 278(g_tTex1du4) DescriptorSet 0
+                              Decorate 281(g_tTex3df4) DescriptorSet 0
+                              Decorate 284(g_tTex3di4) DescriptorSet 0
+                              Decorate 287(g_tTex3du4) DescriptorSet 0
+                              Decorate 290(g_tTexcdf4) DescriptorSet 0
+                              Decorate 293(g_tTexcdi4) DescriptorSet 0
+                              Decorate 296(g_tTexcdu4) DescriptorSet 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(g_tTex2df4):     11(ptr) Variable UniformConstant
+              14:             TypeSampler
+              15:             TypePointer UniformConstant 14
+     16(g_sSamp):     15(ptr) Variable UniformConstant
+              18:             TypeSampledImage 10
+              20:             TypeVector 6(float) 2
+              21:             TypePointer UniformConstant 20(fvec2)
+          22(c2):     21(ptr) Variable UniformConstant
+              24:             TypeInt 32 1
+              25:             TypeVector 24(int) 2
+              26:             TypePointer UniformConstant 25(ivec2)
+          27(o2):     26(ptr) Variable UniformConstant
+              29:     24(int) Constant 0
+              31:             TypeVector 24(int) 4
+              32:             TypePointer Function 31(ivec4)
+              34:             TypeImage 24(int) 2D sampled format:Unknown
+              35:             TypePointer UniformConstant 34
+  36(g_tTex2di4):     35(ptr) Variable UniformConstant
+              39:             TypeSampledImage 34
+              44:             TypeInt 32 0
+              45:             TypeVector 44(int) 4
+              46:             TypePointer Function 45(ivec4)
+              48:             TypeImage 44(int) 2D sampled format:Unknown
+              49:             TypePointer UniformConstant 48
+  50(g_tTex2du4):     49(ptr) Variable UniformConstant
+              53:             TypeSampledImage 48
+              67:     44(int) Constant 4
+              68:             TypeArray 25(ivec2) 67
+              99:     24(int) Constant 1
+             154:     24(int) Constant 2
+             209:     24(int) Constant 3
+  258(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
+             259:             TypePointer Function 258(PS_OUTPUT)
+             261:    6(float) Constant 1065353216
+             262:    7(fvec4) ConstantComposite 261 261 261 261
+             264:             TypePointer Function 6(float)
+  268(g_sSamp2d):     15(ptr) Variable UniformConstant
+             269:             TypeImage 6(float) 1D sampled format:Unknown
+             270:             TypePointer UniformConstant 269
+271(g_tTex1df4a):    270(ptr) Variable UniformConstant
+ 272(g_tTex1df4):    270(ptr) Variable UniformConstant
+             273:             TypeImage 24(int) 1D sampled format:Unknown
+             274:             TypePointer UniformConstant 273
+ 275(g_tTex1di4):    274(ptr) Variable UniformConstant
+             276:             TypeImage 44(int) 1D sampled format:Unknown
+             277:             TypePointer UniformConstant 276
+ 278(g_tTex1du4):    277(ptr) Variable UniformConstant
+             279:             TypeImage 6(float) 3D sampled format:Unknown
+             280:             TypePointer UniformConstant 279
+ 281(g_tTex3df4):    280(ptr) Variable UniformConstant
+             282:             TypeImage 24(int) 3D sampled format:Unknown
+             283:             TypePointer UniformConstant 282
+ 284(g_tTex3di4):    283(ptr) Variable UniformConstant
+             285:             TypeImage 44(int) 3D sampled format:Unknown
+             286:             TypePointer UniformConstant 285
+ 287(g_tTex3du4):    286(ptr) Variable UniformConstant
+             288:             TypeImage 6(float) Cube sampled format:Unknown
+             289:             TypePointer UniformConstant 288
+ 290(g_tTexcdf4):    289(ptr) Variable UniformConstant
+             291:             TypeImage 24(int) Cube sampled format:Unknown
+             292:             TypePointer UniformConstant 291
+ 293(g_tTexcdi4):    292(ptr) Variable UniformConstant
+             294:             TypeImage 44(int) Cube sampled format:Unknown
+             295:             TypePointer UniformConstant 294
+ 296(g_tTexcdu4):    295(ptr) Variable UniformConstant
+             297:             TypePointer UniformConstant 6(float)
+         298(c1):    297(ptr) Variable UniformConstant
+             299:             TypeVector 6(float) 3
+             300:             TypePointer UniformConstant 299(fvec3)
+         301(c3):    300(ptr) Variable UniformConstant
+             302:             TypePointer UniformConstant 7(fvec4)
+         303(c4):    302(ptr) Variable UniformConstant
+             304:             TypePointer UniformConstant 24(int)
+         305(o1):    304(ptr) Variable UniformConstant
+             306:             TypeVector 24(int) 3
+             307:             TypePointer UniformConstant 306(ivec3)
+         308(o3):    307(ptr) Variable UniformConstant
+             309:             TypePointer UniformConstant 31(ivec4)
+         310(o4):    309(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+     9(txval001):      8(ptr) Variable Function
+    33(txval011):     32(ptr) Variable Function
+    47(txval021):     46(ptr) Variable Function
+    58(txval004):      8(ptr) Variable Function
+    71(txval014):     32(ptr) Variable Function
+    82(txval024):     46(ptr) Variable Function
+    93(txval101):      8(ptr) Variable Function
+   101(txval111):     32(ptr) Variable Function
+   108(txval121):     46(ptr) Variable Function
+   115(txval104):      8(ptr) Variable Function
+   126(txval114):     32(ptr) Variable Function
+   137(txval124):     46(ptr) Variable Function
+   148(txval201):      8(ptr) Variable Function
+   156(txval211):     32(ptr) Variable Function
+   163(txval221):     46(ptr) Variable Function
+   170(txval204):      8(ptr) Variable Function
+   181(txval214):     32(ptr) Variable Function
+   192(txval224):     46(ptr) Variable Function
+   203(txval301):      8(ptr) Variable Function
+   211(txval311):     32(ptr) Variable Function
+   218(txval321):     46(ptr) Variable Function
+   225(txval304):      8(ptr) Variable Function
+   236(txval314):     32(ptr) Variable Function
+   247(txval324):     46(ptr) Variable Function
+      260(psout):    259(ptr) Variable Function
+              13:          10 Load 12(g_tTex2df4)
+              17:          14 Load 16(g_sSamp)
+              19:          18 SampledImage 13 17
+              23:   20(fvec2) Load 22(c2)
+              28:   25(ivec2) Load 27(o2)
+              30:    7(fvec4) ImageGather 19 23 29 Offset 28
+                              Store 9(txval001) 30
+              37:          34 Load 36(g_tTex2di4)
+              38:          14 Load 16(g_sSamp)
+              40:          39 SampledImage 37 38
+              41:   20(fvec2) Load 22(c2)
+              42:   25(ivec2) Load 27(o2)
+              43:   31(ivec4) ImageGather 40 41 29 Offset 42
+                              Store 33(txval011) 43
+              51:          48 Load 50(g_tTex2du4)
+              52:          14 Load 16(g_sSamp)
+              54:          53 SampledImage 51 52
+              55:   20(fvec2) Load 22(c2)
+              56:   25(ivec2) Load 27(o2)
+              57:   45(ivec4) ImageGather 54 55 29 Offset 56
+                              Store 47(txval021) 57
+              59:          10 Load 12(g_tTex2df4)
+              60:          14 Load 16(g_sSamp)
+              61:          18 SampledImage 59 60
+              62:   20(fvec2) Load 22(c2)
+              63:   25(ivec2) Load 27(o2)
+              64:   25(ivec2) Load 27(o2)
+              65:   25(ivec2) Load 27(o2)
+              66:   25(ivec2) Load 27(o2)
+              69:          68 CompositeConstruct 63 64 65 66
+              70:    7(fvec4) ImageGather 61 62 29 ConstOffsets 69
+                              Store 58(txval004) 70
+              72:          34 Load 36(g_tTex2di4)
+              73:          14 Load 16(g_sSamp)
+              74:          39 SampledImage 72 73
+              75:   20(fvec2) Load 22(c2)
+              76:   25(ivec2) Load 27(o2)
+              77:   25(ivec2) Load 27(o2)
+              78:   25(ivec2) Load 27(o2)
+              79:   25(ivec2) Load 27(o2)
+              80:          68 CompositeConstruct 76 77 78 79
+              81:   31(ivec4) ImageGather 74 75 29 ConstOffsets 80
+                              Store 71(txval014) 81
+              83:          48 Load 50(g_tTex2du4)
+              84:          14 Load 16(g_sSamp)
+              85:          53 SampledImage 83 84
+              86:   20(fvec2) Load 22(c2)
+              87:   25(ivec2) Load 27(o2)
+              88:   25(ivec2) Load 27(o2)
+              89:   25(ivec2) Load 27(o2)
+              90:   25(ivec2) Load 27(o2)
+              91:          68 CompositeConstruct 87 88 89 90
+              92:   45(ivec4) ImageGather 85 86 29 ConstOffsets 91
+                              Store 82(txval024) 92
+              94:          10 Load 12(g_tTex2df4)
+              95:          14 Load 16(g_sSamp)
+              96:          18 SampledImage 94 95
+              97:   20(fvec2) Load 22(c2)
+              98:   25(ivec2) Load 27(o2)
+             100:    7(fvec4) ImageGather 96 97 99 Offset 98
+                              Store 93(txval101) 100
+             102:          34 Load 36(g_tTex2di4)
+             103:          14 Load 16(g_sSamp)
+             104:          39 SampledImage 102 103
+             105:   20(fvec2) Load 22(c2)
+             106:   25(ivec2) Load 27(o2)
+             107:   31(ivec4) ImageGather 104 105 99 Offset 106
+                              Store 101(txval111) 107
+             109:          48 Load 50(g_tTex2du4)
+             110:          14 Load 16(g_sSamp)
+             111:          53 SampledImage 109 110
+             112:   20(fvec2) Load 22(c2)
+             113:   25(ivec2) Load 27(o2)
+             114:   45(ivec4) ImageGather 111 112 99 Offset 113
+                              Store 108(txval121) 114
+             116:          10 Load 12(g_tTex2df4)
+             117:          14 Load 16(g_sSamp)
+             118:          18 SampledImage 116 117
+             119:   20(fvec2) Load 22(c2)
+             120:   25(ivec2) Load 27(o2)
+             121:   25(ivec2) Load 27(o2)
+             122:   25(ivec2) Load 27(o2)
+             123:   25(ivec2) Load 27(o2)
+             124:          68 CompositeConstruct 120 121 122 123
+             125:    7(fvec4) ImageGather 118 119 99 ConstOffsets 124
+                              Store 115(txval104) 125
+             127:          34 Load 36(g_tTex2di4)
+             128:          14 Load 16(g_sSamp)
+             129:          39 SampledImage 127 128
+             130:   20(fvec2) Load 22(c2)
+             131:   25(ivec2) Load 27(o2)
+             132:   25(ivec2) Load 27(o2)
+             133:   25(ivec2) Load 27(o2)
+             134:   25(ivec2) Load 27(o2)
+             135:          68 CompositeConstruct 131 132 133 134
+             136:   31(ivec4) ImageGather 129 130 99 ConstOffsets 135
+                              Store 126(txval114) 136
+             138:          48 Load 50(g_tTex2du4)
+             139:          14 Load 16(g_sSamp)
+             140:          53 SampledImage 138 139
+             141:   20(fvec2) Load 22(c2)
+             142:   25(ivec2) Load 27(o2)
+             143:   25(ivec2) Load 27(o2)
+             144:   25(ivec2) Load 27(o2)
+             145:   25(ivec2) Load 27(o2)
+             146:          68 CompositeConstruct 142 143 144 145
+             147:   45(ivec4) ImageGather 140 141 99 ConstOffsets 146
+                              Store 137(txval124) 147
+             149:          10 Load 12(g_tTex2df4)
+             150:          14 Load 16(g_sSamp)
+             151:          18 SampledImage 149 150
+             152:   20(fvec2) Load 22(c2)
+             153:   25(ivec2) Load 27(o2)
+             155:    7(fvec4) ImageGather 151 152 154 Offset 153
+                              Store 148(txval201) 155
+             157:          34 Load 36(g_tTex2di4)
+             158:          14 Load 16(g_sSamp)
+             159:          39 SampledImage 157 158
+             160:   20(fvec2) Load 22(c2)
+             161:   25(ivec2) Load 27(o2)
+             162:   31(ivec4) ImageGather 159 160 154 Offset 161
+                              Store 156(txval211) 162
+             164:          48 Load 50(g_tTex2du4)
+             165:          14 Load 16(g_sSamp)
+             166:          53 SampledImage 164 165
+             167:   20(fvec2) Load 22(c2)
+             168:   25(ivec2) Load 27(o2)
+             169:   45(ivec4) ImageGather 166 167 154 Offset 168
+                              Store 163(txval221) 169
+             171:          10 Load 12(g_tTex2df4)
+             172:          14 Load 16(g_sSamp)
+             173:          18 SampledImage 171 172
+             174:   20(fvec2) Load 22(c2)
+             175:   25(ivec2) Load 27(o2)
+             176:   25(ivec2) Load 27(o2)
+             177:   25(ivec2) Load 27(o2)
+             178:   25(ivec2) Load 27(o2)
+             179:          68 CompositeConstruct 175 176 177 178
+             180:    7(fvec4) ImageGather 173 174 154 ConstOffsets 179
+                              Store 170(txval204) 180
+             182:          34 Load 36(g_tTex2di4)
+             183:          14 Load 16(g_sSamp)
+             184:          39 SampledImage 182 183
+             185:   20(fvec2) Load 22(c2)
+             186:   25(ivec2) Load 27(o2)
+             187:   25(ivec2) Load 27(o2)
+             188:   25(ivec2) Load 27(o2)
+             189:   25(ivec2) Load 27(o2)
+             190:          68 CompositeConstruct 186 187 188 189
+             191:   31(ivec4) ImageGather 184 185 154 ConstOffsets 190
+                              Store 181(txval214) 191
+             193:          48 Load 50(g_tTex2du4)
+             194:          14 Load 16(g_sSamp)
+             195:          53 SampledImage 193 194
+             196:   20(fvec2) Load 22(c2)
+             197:   25(ivec2) Load 27(o2)
+             198:   25(ivec2) Load 27(o2)
+             199:   25(ivec2) Load 27(o2)
+             200:   25(ivec2) Load 27(o2)
+             201:          68 CompositeConstruct 197 198 199 200
+             202:   45(ivec4) ImageGather 195 196 154 ConstOffsets 201
+                              Store 192(txval224) 202
+             204:          10 Load 12(g_tTex2df4)
+             205:          14 Load 16(g_sSamp)
+             206:          18 SampledImage 204 205
+             207:   20(fvec2) Load 22(c2)
+             208:   25(ivec2) Load 27(o2)
+             210:    7(fvec4) ImageGather 206 207 209 Offset 208
+                              Store 203(txval301) 210
+             212:          34 Load 36(g_tTex2di4)
+             213:          14 Load 16(g_sSamp)
+             214:          39 SampledImage 212 213
+             215:   20(fvec2) Load 22(c2)
+             216:   25(ivec2) Load 27(o2)
+             217:   31(ivec4) ImageGather 214 215 209 Offset 216
+                              Store 211(txval311) 217
+             219:          48 Load 50(g_tTex2du4)
+             220:          14 Load 16(g_sSamp)
+             221:          53 SampledImage 219 220
+             222:   20(fvec2) Load 22(c2)
+             223:   25(ivec2) Load 27(o2)
+             224:   45(ivec4) ImageGather 221 222 209 Offset 223
+                              Store 218(txval321) 224
+             226:          10 Load 12(g_tTex2df4)
+             227:          14 Load 16(g_sSamp)
+             228:          18 SampledImage 226 227
+             229:   20(fvec2) Load 22(c2)
+             230:   25(ivec2) Load 27(o2)
+             231:   25(ivec2) Load 27(o2)
+             232:   25(ivec2) Load 27(o2)
+             233:   25(ivec2) Load 27(o2)
+             234:          68 CompositeConstruct 230 231 232 233
+             235:    7(fvec4) ImageGather 228 229 209 ConstOffsets 234
+                              Store 225(txval304) 235
+             237:          34 Load 36(g_tTex2di4)
+             238:          14 Load 16(g_sSamp)
+             239:          39 SampledImage 237 238
+             240:   20(fvec2) Load 22(c2)
+             241:   25(ivec2) Load 27(o2)
+             242:   25(ivec2) Load 27(o2)
+             243:   25(ivec2) Load 27(o2)
+             244:   25(ivec2) Load 27(o2)
+             245:          68 CompositeConstruct 241 242 243 244
+             246:   31(ivec4) ImageGather 239 240 209 ConstOffsets 245
+                              Store 236(txval314) 246
+             248:          48 Load 50(g_tTex2du4)
+             249:          14 Load 16(g_sSamp)
+             250:          53 SampledImage 248 249
+             251:   20(fvec2) Load 22(c2)
+             252:   25(ivec2) Load 27(o2)
+             253:   25(ivec2) Load 27(o2)
+             254:   25(ivec2) Load 27(o2)
+             255:   25(ivec2) Load 27(o2)
+             256:          68 CompositeConstruct 252 253 254 255
+             257:   45(ivec4) ImageGather 250 251 209 ConstOffsets 256
+                              Store 247(txval324) 257
+             263:      8(ptr) AccessChain 260(psout) 29
+                              Store 263 262
+             265:    264(ptr) AccessChain 260(psout) 99
+                              Store 265 261
+             266:258(PS_OUTPUT) Load 260(psout)
+                              ReturnValue 266
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
new file mode 100644
index 0000000..f9c28d0
--- /dev/null
+++ b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
@@ -0,0 +1,1122 @@
+hlsl.gatherRGBA.offsetarray.dx10.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:111  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33    Function Parameters: 
+0:?     Sequence
+0:40      Sequence
+0:40        move second child to first child (temp 4-component vector of float)
+0:40          'txval001' (temp 4-component vector of float)
+0:40          textureGatherOffset (global 4-component vector of float)
+0:40            Construct combined texture-sampler (temp sampler2DArray)
+0:40              'g_tTex2df4a' (uniform texture2DArray)
+0:40              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:40            'c3' (uniform 3-component vector of float)
+0:40            'o2' (uniform 2-component vector of int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      Sequence
+0:41        move second child to first child (temp 4-component vector of int)
+0:41          'txval011' (temp 4-component vector of int)
+0:41          textureGatherOffset (global 4-component vector of int)
+0:41            Construct combined texture-sampler (temp isampler2DArray)
+0:41              'g_tTex2di4a' (uniform itexture2DArray)
+0:41              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:41            'c3' (uniform 3-component vector of float)
+0:41            'o2' (uniform 2-component vector of int)
+0:41            Constant:
+0:41              0 (const int)
+0:42      Sequence
+0:42        move second child to first child (temp 4-component vector of uint)
+0:42          'txval021' (temp 4-component vector of uint)
+0:42          textureGatherOffset (global 4-component vector of uint)
+0:42            Construct combined texture-sampler (temp usampler2DArray)
+0:42              'g_tTex2du4a' (uniform utexture2DArray)
+0:42              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:42            'c3' (uniform 3-component vector of float)
+0:42            'o2' (uniform 2-component vector of int)
+0:42            Constant:
+0:42              0 (const int)
+0:44      Sequence
+0:44        move second child to first child (temp 4-component vector of float)
+0:44          'txval004' (temp 4-component vector of float)
+0:44          textureGatherOffsets (global 4-component vector of float)
+0:44            Construct combined texture-sampler (temp sampler2DArray)
+0:44              'g_tTex2df4a' (uniform texture2DArray)
+0:44              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:44            'c3' (uniform 3-component vector of float)
+0:44            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44            Constant:
+0:44              0 (const int)
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of int)
+0:45          'txval014' (temp 4-component vector of int)
+0:45          textureGatherOffsets (global 4-component vector of int)
+0:45            Construct combined texture-sampler (temp isampler2DArray)
+0:45              'g_tTex2di4a' (uniform itexture2DArray)
+0:45              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:45            'c3' (uniform 3-component vector of float)
+0:45            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of uint)
+0:46          'txval024' (temp 4-component vector of uint)
+0:46          textureGatherOffsets (global 4-component vector of uint)
+0:46            Construct combined texture-sampler (temp usampler2DArray)
+0:46              'g_tTex2du4a' (uniform utexture2DArray)
+0:46              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:46            'c3' (uniform 3-component vector of float)
+0:46            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46            Constant:
+0:46              0 (const int)
+0:56      Sequence
+0:56        move second child to first child (temp 4-component vector of float)
+0:56          'txval101' (temp 4-component vector of float)
+0:56          textureGatherOffset (global 4-component vector of float)
+0:56            Construct combined texture-sampler (temp sampler2DArray)
+0:56              'g_tTex2df4a' (uniform texture2DArray)
+0:56              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:56            'c3' (uniform 3-component vector of float)
+0:56            'o2' (uniform 2-component vector of int)
+0:56            Constant:
+0:56              1 (const int)
+0:57      Sequence
+0:57        move second child to first child (temp 4-component vector of int)
+0:57          'txval111' (temp 4-component vector of int)
+0:57          textureGatherOffset (global 4-component vector of int)
+0:57            Construct combined texture-sampler (temp isampler2DArray)
+0:57              'g_tTex2di4a' (uniform itexture2DArray)
+0:57              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:57            'c3' (uniform 3-component vector of float)
+0:57            'o2' (uniform 2-component vector of int)
+0:57            Constant:
+0:57              1 (const int)
+0:58      Sequence
+0:58        move second child to first child (temp 4-component vector of uint)
+0:58          'txval121' (temp 4-component vector of uint)
+0:58          textureGatherOffset (global 4-component vector of uint)
+0:58            Construct combined texture-sampler (temp usampler2DArray)
+0:58              'g_tTex2du4a' (uniform utexture2DArray)
+0:58              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:58            'c3' (uniform 3-component vector of float)
+0:58            'o2' (uniform 2-component vector of int)
+0:58            Constant:
+0:58              1 (const int)
+0:60      Sequence
+0:60        move second child to first child (temp 4-component vector of float)
+0:60          'txval104' (temp 4-component vector of float)
+0:60          textureGatherOffsets (global 4-component vector of float)
+0:60            Construct combined texture-sampler (temp sampler2DArray)
+0:60              'g_tTex2df4a' (uniform texture2DArray)
+0:60              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:60            'c3' (uniform 3-component vector of float)
+0:60            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60            Constant:
+0:60              1 (const int)
+0:61      Sequence
+0:61        move second child to first child (temp 4-component vector of int)
+0:61          'txval114' (temp 4-component vector of int)
+0:61          textureGatherOffsets (global 4-component vector of int)
+0:61            Construct combined texture-sampler (temp isampler2DArray)
+0:61              'g_tTex2di4a' (uniform itexture2DArray)
+0:61              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:61            'c3' (uniform 3-component vector of float)
+0:61            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61            Constant:
+0:61              1 (const int)
+0:62      Sequence
+0:62        move second child to first child (temp 4-component vector of uint)
+0:62          'txval124' (temp 4-component vector of uint)
+0:62          textureGatherOffsets (global 4-component vector of uint)
+0:62            Construct combined texture-sampler (temp usampler2DArray)
+0:62              'g_tTex2du4a' (uniform utexture2DArray)
+0:62              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:62            'c3' (uniform 3-component vector of float)
+0:62            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62            Constant:
+0:62              1 (const int)
+0:72      Sequence
+0:72        move second child to first child (temp 4-component vector of float)
+0:72          'txval201' (temp 4-component vector of float)
+0:72          textureGatherOffset (global 4-component vector of float)
+0:72            Construct combined texture-sampler (temp sampler2DArray)
+0:72              'g_tTex2df4a' (uniform texture2DArray)
+0:72              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:72            'c3' (uniform 3-component vector of float)
+0:72            'o2' (uniform 2-component vector of int)
+0:72            Constant:
+0:72              2 (const int)
+0:73      Sequence
+0:73        move second child to first child (temp 4-component vector of int)
+0:73          'txval211' (temp 4-component vector of int)
+0:73          textureGatherOffset (global 4-component vector of int)
+0:73            Construct combined texture-sampler (temp isampler2DArray)
+0:73              'g_tTex2di4a' (uniform itexture2DArray)
+0:73              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:73            'c3' (uniform 3-component vector of float)
+0:73            'o2' (uniform 2-component vector of int)
+0:73            Constant:
+0:73              2 (const int)
+0:74      Sequence
+0:74        move second child to first child (temp 4-component vector of uint)
+0:74          'txval221' (temp 4-component vector of uint)
+0:74          textureGatherOffset (global 4-component vector of uint)
+0:74            Construct combined texture-sampler (temp usampler2DArray)
+0:74              'g_tTex2du4a' (uniform utexture2DArray)
+0:74              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:74            'c3' (uniform 3-component vector of float)
+0:74            'o2' (uniform 2-component vector of int)
+0:74            Constant:
+0:74              2 (const int)
+0:76      Sequence
+0:76        move second child to first child (temp 4-component vector of float)
+0:76          'txval204' (temp 4-component vector of float)
+0:76          textureGatherOffsets (global 4-component vector of float)
+0:76            Construct combined texture-sampler (temp sampler2DArray)
+0:76              'g_tTex2df4a' (uniform texture2DArray)
+0:76              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:76            'c3' (uniform 3-component vector of float)
+0:76            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76            Constant:
+0:76              2 (const int)
+0:77      Sequence
+0:77        move second child to first child (temp 4-component vector of int)
+0:77          'txval214' (temp 4-component vector of int)
+0:77          textureGatherOffsets (global 4-component vector of int)
+0:77            Construct combined texture-sampler (temp isampler2DArray)
+0:77              'g_tTex2di4a' (uniform itexture2DArray)
+0:77              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:77            'c3' (uniform 3-component vector of float)
+0:77            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77            Constant:
+0:77              2 (const int)
+0:78      Sequence
+0:78        move second child to first child (temp 4-component vector of uint)
+0:78          'txval224' (temp 4-component vector of uint)
+0:78          textureGatherOffsets (global 4-component vector of uint)
+0:78            Construct combined texture-sampler (temp usampler2DArray)
+0:78              'g_tTex2du4a' (uniform utexture2DArray)
+0:78              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:78            'c3' (uniform 3-component vector of float)
+0:78            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78            Constant:
+0:78              2 (const int)
+0:88      Sequence
+0:88        move second child to first child (temp 4-component vector of float)
+0:88          'txval301' (temp 4-component vector of float)
+0:88          textureGatherOffset (global 4-component vector of float)
+0:88            Construct combined texture-sampler (temp sampler2DArray)
+0:88              'g_tTex2df4a' (uniform texture2DArray)
+0:88              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:88            'c3' (uniform 3-component vector of float)
+0:88            'o2' (uniform 2-component vector of int)
+0:88            Constant:
+0:88              3 (const int)
+0:89      Sequence
+0:89        move second child to first child (temp 4-component vector of int)
+0:89          'txval311' (temp 4-component vector of int)
+0:89          textureGatherOffset (global 4-component vector of int)
+0:89            Construct combined texture-sampler (temp isampler2DArray)
+0:89              'g_tTex2di4a' (uniform itexture2DArray)
+0:89              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:89            'c3' (uniform 3-component vector of float)
+0:89            'o2' (uniform 2-component vector of int)
+0:89            Constant:
+0:89              3 (const int)
+0:90      Sequence
+0:90        move second child to first child (temp 4-component vector of uint)
+0:90          'txval321' (temp 4-component vector of uint)
+0:90          textureGatherOffset (global 4-component vector of uint)
+0:90            Construct combined texture-sampler (temp usampler2DArray)
+0:90              'g_tTex2du4a' (uniform utexture2DArray)
+0:90              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:90            'c3' (uniform 3-component vector of float)
+0:90            'o2' (uniform 2-component vector of int)
+0:90            Constant:
+0:90              3 (const int)
+0:92      Sequence
+0:92        move second child to first child (temp 4-component vector of float)
+0:92          'txval304' (temp 4-component vector of float)
+0:92          textureGatherOffsets (global 4-component vector of float)
+0:92            Construct combined texture-sampler (temp sampler2DArray)
+0:92              'g_tTex2df4a' (uniform texture2DArray)
+0:92              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:92            'c3' (uniform 3-component vector of float)
+0:92            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92            Constant:
+0:92              3 (const int)
+0:93      Sequence
+0:93        move second child to first child (temp 4-component vector of int)
+0:93          'txval314' (temp 4-component vector of int)
+0:93          textureGatherOffsets (global 4-component vector of int)
+0:93            Construct combined texture-sampler (temp isampler2DArray)
+0:93              'g_tTex2di4a' (uniform itexture2DArray)
+0:93              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:93            'c3' (uniform 3-component vector of float)
+0:93            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93            Constant:
+0:93              3 (const int)
+0:94      Sequence
+0:94        move second child to first child (temp 4-component vector of uint)
+0:94          'txval324' (temp 4-component vector of uint)
+0:94          textureGatherOffsets (global 4-component vector of uint)
+0:94            Construct combined texture-sampler (temp usampler2DArray)
+0:94              'g_tTex2du4a' (uniform utexture2DArray)
+0:94              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:94            'c3' (uniform 3-component vector of float)
+0:94            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94            Constant:
+0:94              3 (const int)
+0:106      move second child to first child (temp 4-component vector of float)
+0:106        Color: direct index for structure (temp 4-component vector of float)
+0:106          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:106          Constant:
+0:106            0 (const int)
+0:106        Constant:
+0:106          1.000000
+0:106          1.000000
+0:106          1.000000
+0:106          1.000000
+0:107      move second child to first child (temp float)
+0:107        Depth: direct index for structure (temp float FragDepth)
+0:107          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:107          Constant:
+0:107            1 (const int)
+0:107        Constant:
+0:107          1.000000
+0:109      Branch: Return with expression
+0:109        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=0 ) 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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+0:?     'o1' (uniform int)
+0:?     'o2' (uniform 2-component vector of int)
+0:?     'o3' (uniform 3-component vector of int)
+0:?     'o4' (uniform 4-component vector of int)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:111  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33    Function Parameters: 
+0:?     Sequence
+0:40      Sequence
+0:40        move second child to first child (temp 4-component vector of float)
+0:40          'txval001' (temp 4-component vector of float)
+0:40          textureGatherOffset (global 4-component vector of float)
+0:40            Construct combined texture-sampler (temp sampler2DArray)
+0:40              'g_tTex2df4a' (uniform texture2DArray)
+0:40              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:40            'c3' (uniform 3-component vector of float)
+0:40            'o2' (uniform 2-component vector of int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      Sequence
+0:41        move second child to first child (temp 4-component vector of int)
+0:41          'txval011' (temp 4-component vector of int)
+0:41          textureGatherOffset (global 4-component vector of int)
+0:41            Construct combined texture-sampler (temp isampler2DArray)
+0:41              'g_tTex2di4a' (uniform itexture2DArray)
+0:41              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:41            'c3' (uniform 3-component vector of float)
+0:41            'o2' (uniform 2-component vector of int)
+0:41            Constant:
+0:41              0 (const int)
+0:42      Sequence
+0:42        move second child to first child (temp 4-component vector of uint)
+0:42          'txval021' (temp 4-component vector of uint)
+0:42          textureGatherOffset (global 4-component vector of uint)
+0:42            Construct combined texture-sampler (temp usampler2DArray)
+0:42              'g_tTex2du4a' (uniform utexture2DArray)
+0:42              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:42            'c3' (uniform 3-component vector of float)
+0:42            'o2' (uniform 2-component vector of int)
+0:42            Constant:
+0:42              0 (const int)
+0:44      Sequence
+0:44        move second child to first child (temp 4-component vector of float)
+0:44          'txval004' (temp 4-component vector of float)
+0:44          textureGatherOffsets (global 4-component vector of float)
+0:44            Construct combined texture-sampler (temp sampler2DArray)
+0:44              'g_tTex2df4a' (uniform texture2DArray)
+0:44              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:44            'c3' (uniform 3-component vector of float)
+0:44            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44              'o2' (uniform 2-component vector of int)
+0:44            Constant:
+0:44              0 (const int)
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of int)
+0:45          'txval014' (temp 4-component vector of int)
+0:45          textureGatherOffsets (global 4-component vector of int)
+0:45            Construct combined texture-sampler (temp isampler2DArray)
+0:45              'g_tTex2di4a' (uniform itexture2DArray)
+0:45              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:45            'c3' (uniform 3-component vector of float)
+0:45            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45              'o2' (uniform 2-component vector of int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of uint)
+0:46          'txval024' (temp 4-component vector of uint)
+0:46          textureGatherOffsets (global 4-component vector of uint)
+0:46            Construct combined texture-sampler (temp usampler2DArray)
+0:46              'g_tTex2du4a' (uniform utexture2DArray)
+0:46              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:46            'c3' (uniform 3-component vector of float)
+0:46            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46              'o2' (uniform 2-component vector of int)
+0:46            Constant:
+0:46              0 (const int)
+0:56      Sequence
+0:56        move second child to first child (temp 4-component vector of float)
+0:56          'txval101' (temp 4-component vector of float)
+0:56          textureGatherOffset (global 4-component vector of float)
+0:56            Construct combined texture-sampler (temp sampler2DArray)
+0:56              'g_tTex2df4a' (uniform texture2DArray)
+0:56              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:56            'c3' (uniform 3-component vector of float)
+0:56            'o2' (uniform 2-component vector of int)
+0:56            Constant:
+0:56              1 (const int)
+0:57      Sequence
+0:57        move second child to first child (temp 4-component vector of int)
+0:57          'txval111' (temp 4-component vector of int)
+0:57          textureGatherOffset (global 4-component vector of int)
+0:57            Construct combined texture-sampler (temp isampler2DArray)
+0:57              'g_tTex2di4a' (uniform itexture2DArray)
+0:57              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:57            'c3' (uniform 3-component vector of float)
+0:57            'o2' (uniform 2-component vector of int)
+0:57            Constant:
+0:57              1 (const int)
+0:58      Sequence
+0:58        move second child to first child (temp 4-component vector of uint)
+0:58          'txval121' (temp 4-component vector of uint)
+0:58          textureGatherOffset (global 4-component vector of uint)
+0:58            Construct combined texture-sampler (temp usampler2DArray)
+0:58              'g_tTex2du4a' (uniform utexture2DArray)
+0:58              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:58            'c3' (uniform 3-component vector of float)
+0:58            'o2' (uniform 2-component vector of int)
+0:58            Constant:
+0:58              1 (const int)
+0:60      Sequence
+0:60        move second child to first child (temp 4-component vector of float)
+0:60          'txval104' (temp 4-component vector of float)
+0:60          textureGatherOffsets (global 4-component vector of float)
+0:60            Construct combined texture-sampler (temp sampler2DArray)
+0:60              'g_tTex2df4a' (uniform texture2DArray)
+0:60              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:60            'c3' (uniform 3-component vector of float)
+0:60            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60              'o2' (uniform 2-component vector of int)
+0:60            Constant:
+0:60              1 (const int)
+0:61      Sequence
+0:61        move second child to first child (temp 4-component vector of int)
+0:61          'txval114' (temp 4-component vector of int)
+0:61          textureGatherOffsets (global 4-component vector of int)
+0:61            Construct combined texture-sampler (temp isampler2DArray)
+0:61              'g_tTex2di4a' (uniform itexture2DArray)
+0:61              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:61            'c3' (uniform 3-component vector of float)
+0:61            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61              'o2' (uniform 2-component vector of int)
+0:61            Constant:
+0:61              1 (const int)
+0:62      Sequence
+0:62        move second child to first child (temp 4-component vector of uint)
+0:62          'txval124' (temp 4-component vector of uint)
+0:62          textureGatherOffsets (global 4-component vector of uint)
+0:62            Construct combined texture-sampler (temp usampler2DArray)
+0:62              'g_tTex2du4a' (uniform utexture2DArray)
+0:62              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:62            'c3' (uniform 3-component vector of float)
+0:62            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62              'o2' (uniform 2-component vector of int)
+0:62            Constant:
+0:62              1 (const int)
+0:72      Sequence
+0:72        move second child to first child (temp 4-component vector of float)
+0:72          'txval201' (temp 4-component vector of float)
+0:72          textureGatherOffset (global 4-component vector of float)
+0:72            Construct combined texture-sampler (temp sampler2DArray)
+0:72              'g_tTex2df4a' (uniform texture2DArray)
+0:72              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:72            'c3' (uniform 3-component vector of float)
+0:72            'o2' (uniform 2-component vector of int)
+0:72            Constant:
+0:72              2 (const int)
+0:73      Sequence
+0:73        move second child to first child (temp 4-component vector of int)
+0:73          'txval211' (temp 4-component vector of int)
+0:73          textureGatherOffset (global 4-component vector of int)
+0:73            Construct combined texture-sampler (temp isampler2DArray)
+0:73              'g_tTex2di4a' (uniform itexture2DArray)
+0:73              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:73            'c3' (uniform 3-component vector of float)
+0:73            'o2' (uniform 2-component vector of int)
+0:73            Constant:
+0:73              2 (const int)
+0:74      Sequence
+0:74        move second child to first child (temp 4-component vector of uint)
+0:74          'txval221' (temp 4-component vector of uint)
+0:74          textureGatherOffset (global 4-component vector of uint)
+0:74            Construct combined texture-sampler (temp usampler2DArray)
+0:74              'g_tTex2du4a' (uniform utexture2DArray)
+0:74              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:74            'c3' (uniform 3-component vector of float)
+0:74            'o2' (uniform 2-component vector of int)
+0:74            Constant:
+0:74              2 (const int)
+0:76      Sequence
+0:76        move second child to first child (temp 4-component vector of float)
+0:76          'txval204' (temp 4-component vector of float)
+0:76          textureGatherOffsets (global 4-component vector of float)
+0:76            Construct combined texture-sampler (temp sampler2DArray)
+0:76              'g_tTex2df4a' (uniform texture2DArray)
+0:76              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:76            'c3' (uniform 3-component vector of float)
+0:76            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76              'o2' (uniform 2-component vector of int)
+0:76            Constant:
+0:76              2 (const int)
+0:77      Sequence
+0:77        move second child to first child (temp 4-component vector of int)
+0:77          'txval214' (temp 4-component vector of int)
+0:77          textureGatherOffsets (global 4-component vector of int)
+0:77            Construct combined texture-sampler (temp isampler2DArray)
+0:77              'g_tTex2di4a' (uniform itexture2DArray)
+0:77              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:77            'c3' (uniform 3-component vector of float)
+0:77            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77              'o2' (uniform 2-component vector of int)
+0:77            Constant:
+0:77              2 (const int)
+0:78      Sequence
+0:78        move second child to first child (temp 4-component vector of uint)
+0:78          'txval224' (temp 4-component vector of uint)
+0:78          textureGatherOffsets (global 4-component vector of uint)
+0:78            Construct combined texture-sampler (temp usampler2DArray)
+0:78              'g_tTex2du4a' (uniform utexture2DArray)
+0:78              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:78            'c3' (uniform 3-component vector of float)
+0:78            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78              'o2' (uniform 2-component vector of int)
+0:78            Constant:
+0:78              2 (const int)
+0:88      Sequence
+0:88        move second child to first child (temp 4-component vector of float)
+0:88          'txval301' (temp 4-component vector of float)
+0:88          textureGatherOffset (global 4-component vector of float)
+0:88            Construct combined texture-sampler (temp sampler2DArray)
+0:88              'g_tTex2df4a' (uniform texture2DArray)
+0:88              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:88            'c3' (uniform 3-component vector of float)
+0:88            'o2' (uniform 2-component vector of int)
+0:88            Constant:
+0:88              3 (const int)
+0:89      Sequence
+0:89        move second child to first child (temp 4-component vector of int)
+0:89          'txval311' (temp 4-component vector of int)
+0:89          textureGatherOffset (global 4-component vector of int)
+0:89            Construct combined texture-sampler (temp isampler2DArray)
+0:89              'g_tTex2di4a' (uniform itexture2DArray)
+0:89              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:89            'c3' (uniform 3-component vector of float)
+0:89            'o2' (uniform 2-component vector of int)
+0:89            Constant:
+0:89              3 (const int)
+0:90      Sequence
+0:90        move second child to first child (temp 4-component vector of uint)
+0:90          'txval321' (temp 4-component vector of uint)
+0:90          textureGatherOffset (global 4-component vector of uint)
+0:90            Construct combined texture-sampler (temp usampler2DArray)
+0:90              'g_tTex2du4a' (uniform utexture2DArray)
+0:90              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:90            'c3' (uniform 3-component vector of float)
+0:90            'o2' (uniform 2-component vector of int)
+0:90            Constant:
+0:90              3 (const int)
+0:92      Sequence
+0:92        move second child to first child (temp 4-component vector of float)
+0:92          'txval304' (temp 4-component vector of float)
+0:92          textureGatherOffsets (global 4-component vector of float)
+0:92            Construct combined texture-sampler (temp sampler2DArray)
+0:92              'g_tTex2df4a' (uniform texture2DArray)
+0:92              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:92            'c3' (uniform 3-component vector of float)
+0:92            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92              'o2' (uniform 2-component vector of int)
+0:92            Constant:
+0:92              3 (const int)
+0:93      Sequence
+0:93        move second child to first child (temp 4-component vector of int)
+0:93          'txval314' (temp 4-component vector of int)
+0:93          textureGatherOffsets (global 4-component vector of int)
+0:93            Construct combined texture-sampler (temp isampler2DArray)
+0:93              'g_tTex2di4a' (uniform itexture2DArray)
+0:93              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:93            'c3' (uniform 3-component vector of float)
+0:93            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93              'o2' (uniform 2-component vector of int)
+0:93            Constant:
+0:93              3 (const int)
+0:94      Sequence
+0:94        move second child to first child (temp 4-component vector of uint)
+0:94          'txval324' (temp 4-component vector of uint)
+0:94          textureGatherOffsets (global 4-component vector of uint)
+0:94            Construct combined texture-sampler (temp usampler2DArray)
+0:94              'g_tTex2du4a' (uniform utexture2DArray)
+0:94              'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:94            'c3' (uniform 3-component vector of float)
+0:94            Construct ivec2 (temp 4-element array of 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94              'o2' (uniform 2-component vector of int)
+0:94            Constant:
+0:94              3 (const int)
+0:106      move second child to first child (temp 4-component vector of float)
+0:106        Color: direct index for structure (temp 4-component vector of float)
+0:106          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:106          Constant:
+0:106            0 (const int)
+0:106        Constant:
+0:106          1.000000
+0:106          1.000000
+0:106          1.000000
+0:106          1.000000
+0:107      move second child to first child (temp float)
+0:107        Depth: direct index for structure (temp float FragDepth)
+0:107          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:107          Constant:
+0:107            1 (const int)
+0:107        Constant:
+0:107          1.000000
+0:109      Branch: Return with expression
+0:109        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=0 ) 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:?     'c1' (uniform float)
+0:?     'c2' (uniform 2-component vector of float)
+0:?     'c3' (uniform 3-component vector of float)
+0:?     'c4' (uniform 4-component vector of float)
+0:?     'o1' (uniform int)
+0:?     'o2' (uniform 2-component vector of int)
+0:?     'o3' (uniform 3-component vector of int)
+0:?     'o4' (uniform 4-component vector of int)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 301
+
+                              Capability Shader
+                              Capability ImageGatherExtended
+                              Capability Sampled1D
+                              Capability SampledCubeArray
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "main"
+                              Name 9  "txval001"
+                              Name 12  "g_tTex2df4a"
+                              Name 16  "g_sSamp"
+                              Name 22  "c3"
+                              Name 27  "o2"
+                              Name 33  "txval011"
+                              Name 36  "g_tTex2di4a"
+                              Name 47  "txval021"
+                              Name 50  "g_tTex2du4a"
+                              Name 58  "txval004"
+                              Name 71  "txval014"
+                              Name 82  "txval024"
+                              Name 93  "txval101"
+                              Name 101  "txval111"
+                              Name 108  "txval121"
+                              Name 115  "txval104"
+                              Name 126  "txval114"
+                              Name 137  "txval124"
+                              Name 148  "txval201"
+                              Name 156  "txval211"
+                              Name 163  "txval221"
+                              Name 170  "txval204"
+                              Name 181  "txval214"
+                              Name 192  "txval224"
+                              Name 203  "txval301"
+                              Name 211  "txval311"
+                              Name 218  "txval321"
+                              Name 225  "txval304"
+                              Name 236  "txval314"
+                              Name 247  "txval324"
+                              Name 258  "PS_OUTPUT"
+                              MemberName 258(PS_OUTPUT) 0  "Color"
+                              MemberName 258(PS_OUTPUT) 1  "Depth"
+                              Name 260  "psout"
+                              Name 268  "g_sSamp2d"
+                              Name 271  "g_tTex1df4a"
+                              Name 274  "g_tTex1di4a"
+                              Name 277  "g_tTex1du4a"
+                              Name 280  "g_tTexcdf4a"
+                              Name 283  "g_tTexcdi4a"
+                              Name 286  "g_tTexcdu4a"
+                              Name 288  "c1"
+                              Name 291  "c2"
+                              Name 293  "c4"
+                              Name 295  "o1"
+                              Name 298  "o3"
+                              Name 300  "o4"
+                              Decorate 12(g_tTex2df4a) DescriptorSet 0
+                              Decorate 16(g_sSamp) DescriptorSet 0
+                              Decorate 16(g_sSamp) Binding 0
+                              Decorate 36(g_tTex2di4a) DescriptorSet 0
+                              Decorate 50(g_tTex2du4a) DescriptorSet 0
+                              MemberDecorate 258(PS_OUTPUT) 1 BuiltIn FragDepth
+                              Decorate 268(g_sSamp2d) DescriptorSet 0
+                              Decorate 271(g_tTex1df4a) DescriptorSet 0
+                              Decorate 271(g_tTex1df4a) Binding 0
+                              Decorate 274(g_tTex1di4a) DescriptorSet 0
+                              Decorate 277(g_tTex1du4a) DescriptorSet 0
+                              Decorate 280(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 283(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 286(g_tTexcdu4a) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypeImage 6(float) 2D array sampled format:Unknown
+              11:             TypePointer UniformConstant 10
+ 12(g_tTex2df4a):     11(ptr) Variable UniformConstant
+              14:             TypeSampler
+              15:             TypePointer UniformConstant 14
+     16(g_sSamp):     15(ptr) Variable UniformConstant
+              18:             TypeSampledImage 10
+              20:             TypeVector 6(float) 3
+              21:             TypePointer UniformConstant 20(fvec3)
+          22(c3):     21(ptr) Variable UniformConstant
+              24:             TypeInt 32 1
+              25:             TypeVector 24(int) 2
+              26:             TypePointer UniformConstant 25(ivec2)
+          27(o2):     26(ptr) Variable UniformConstant
+              29:     24(int) Constant 0
+              31:             TypeVector 24(int) 4
+              32:             TypePointer Function 31(ivec4)
+              34:             TypeImage 24(int) 2D array sampled format:Unknown
+              35:             TypePointer UniformConstant 34
+ 36(g_tTex2di4a):     35(ptr) Variable UniformConstant
+              39:             TypeSampledImage 34
+              44:             TypeInt 32 0
+              45:             TypeVector 44(int) 4
+              46:             TypePointer Function 45(ivec4)
+              48:             TypeImage 44(int) 2D array sampled format:Unknown
+              49:             TypePointer UniformConstant 48
+ 50(g_tTex2du4a):     49(ptr) Variable UniformConstant
+              53:             TypeSampledImage 48
+              67:     44(int) Constant 4
+              68:             TypeArray 25(ivec2) 67
+              99:     24(int) Constant 1
+             154:     24(int) Constant 2
+             209:     24(int) Constant 3
+  258(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
+             259:             TypePointer Function 258(PS_OUTPUT)
+             261:    6(float) Constant 1065353216
+             262:    7(fvec4) ConstantComposite 261 261 261 261
+             264:             TypePointer Function 6(float)
+  268(g_sSamp2d):     15(ptr) Variable UniformConstant
+             269:             TypeImage 6(float) 1D array sampled format:Unknown
+             270:             TypePointer UniformConstant 269
+271(g_tTex1df4a):    270(ptr) Variable UniformConstant
+             272:             TypeImage 24(int) 1D array sampled format:Unknown
+             273:             TypePointer UniformConstant 272
+274(g_tTex1di4a):    273(ptr) Variable UniformConstant
+             275:             TypeImage 44(int) 1D array sampled format:Unknown
+             276:             TypePointer UniformConstant 275
+277(g_tTex1du4a):    276(ptr) Variable UniformConstant
+             278:             TypeImage 6(float) Cube array sampled format:Unknown
+             279:             TypePointer UniformConstant 278
+280(g_tTexcdf4a):    279(ptr) Variable UniformConstant
+             281:             TypeImage 24(int) Cube array sampled format:Unknown
+             282:             TypePointer UniformConstant 281
+283(g_tTexcdi4a):    282(ptr) Variable UniformConstant
+             284:             TypeImage 44(int) Cube array sampled format:Unknown
+             285:             TypePointer UniformConstant 284
+286(g_tTexcdu4a):    285(ptr) Variable UniformConstant
+             287:             TypePointer UniformConstant 6(float)
+         288(c1):    287(ptr) Variable UniformConstant
+             289:             TypeVector 6(float) 2
+             290:             TypePointer UniformConstant 289(fvec2)
+         291(c2):    290(ptr) Variable UniformConstant
+             292:             TypePointer UniformConstant 7(fvec4)
+         293(c4):    292(ptr) Variable UniformConstant
+             294:             TypePointer UniformConstant 24(int)
+         295(o1):    294(ptr) Variable UniformConstant
+             296:             TypeVector 24(int) 3
+             297:             TypePointer UniformConstant 296(ivec3)
+         298(o3):    297(ptr) Variable UniformConstant
+             299:             TypePointer UniformConstant 31(ivec4)
+         300(o4):    299(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+     9(txval001):      8(ptr) Variable Function
+    33(txval011):     32(ptr) Variable Function
+    47(txval021):     46(ptr) Variable Function
+    58(txval004):      8(ptr) Variable Function
+    71(txval014):     32(ptr) Variable Function
+    82(txval024):     46(ptr) Variable Function
+    93(txval101):      8(ptr) Variable Function
+   101(txval111):     32(ptr) Variable Function
+   108(txval121):     46(ptr) Variable Function
+   115(txval104):      8(ptr) Variable Function
+   126(txval114):     32(ptr) Variable Function
+   137(txval124):     46(ptr) Variable Function
+   148(txval201):      8(ptr) Variable Function
+   156(txval211):     32(ptr) Variable Function
+   163(txval221):     46(ptr) Variable Function
+   170(txval204):      8(ptr) Variable Function
+   181(txval214):     32(ptr) Variable Function
+   192(txval224):     46(ptr) Variable Function
+   203(txval301):      8(ptr) Variable Function
+   211(txval311):     32(ptr) Variable Function
+   218(txval321):     46(ptr) Variable Function
+   225(txval304):      8(ptr) Variable Function
+   236(txval314):     32(ptr) Variable Function
+   247(txval324):     46(ptr) Variable Function
+      260(psout):    259(ptr) Variable Function
+              13:          10 Load 12(g_tTex2df4a)
+              17:          14 Load 16(g_sSamp)
+              19:          18 SampledImage 13 17
+              23:   20(fvec3) Load 22(c3)
+              28:   25(ivec2) Load 27(o2)
+              30:    7(fvec4) ImageGather 19 23 29 Offset 28
+                              Store 9(txval001) 30
+              37:          34 Load 36(g_tTex2di4a)
+              38:          14 Load 16(g_sSamp)
+              40:          39 SampledImage 37 38
+              41:   20(fvec3) Load 22(c3)
+              42:   25(ivec2) Load 27(o2)
+              43:   31(ivec4) ImageGather 40 41 29 Offset 42
+                              Store 33(txval011) 43
+              51:          48 Load 50(g_tTex2du4a)
+              52:          14 Load 16(g_sSamp)
+              54:          53 SampledImage 51 52
+              55:   20(fvec3) Load 22(c3)
+              56:   25(ivec2) Load 27(o2)
+              57:   45(ivec4) ImageGather 54 55 29 Offset 56
+                              Store 47(txval021) 57
+              59:          10 Load 12(g_tTex2df4a)
+              60:          14 Load 16(g_sSamp)
+              61:          18 SampledImage 59 60
+              62:   20(fvec3) Load 22(c3)
+              63:   25(ivec2) Load 27(o2)
+              64:   25(ivec2) Load 27(o2)
+              65:   25(ivec2) Load 27(o2)
+              66:   25(ivec2) Load 27(o2)
+              69:          68 CompositeConstruct 63 64 65 66
+              70:    7(fvec4) ImageGather 61 62 29 ConstOffsets 69
+                              Store 58(txval004) 70
+              72:          34 Load 36(g_tTex2di4a)
+              73:          14 Load 16(g_sSamp)
+              74:          39 SampledImage 72 73
+              75:   20(fvec3) Load 22(c3)
+              76:   25(ivec2) Load 27(o2)
+              77:   25(ivec2) Load 27(o2)
+              78:   25(ivec2) Load 27(o2)
+              79:   25(ivec2) Load 27(o2)
+              80:          68 CompositeConstruct 76 77 78 79
+              81:   31(ivec4) ImageGather 74 75 29 ConstOffsets 80
+                              Store 71(txval014) 81
+              83:          48 Load 50(g_tTex2du4a)
+              84:          14 Load 16(g_sSamp)
+              85:          53 SampledImage 83 84
+              86:   20(fvec3) Load 22(c3)
+              87:   25(ivec2) Load 27(o2)
+              88:   25(ivec2) Load 27(o2)
+              89:   25(ivec2) Load 27(o2)
+              90:   25(ivec2) Load 27(o2)
+              91:          68 CompositeConstruct 87 88 89 90
+              92:   45(ivec4) ImageGather 85 86 29 ConstOffsets 91
+                              Store 82(txval024) 92
+              94:          10 Load 12(g_tTex2df4a)
+              95:          14 Load 16(g_sSamp)
+              96:          18 SampledImage 94 95
+              97:   20(fvec3) Load 22(c3)
+              98:   25(ivec2) Load 27(o2)
+             100:    7(fvec4) ImageGather 96 97 99 Offset 98
+                              Store 93(txval101) 100
+             102:          34 Load 36(g_tTex2di4a)
+             103:          14 Load 16(g_sSamp)
+             104:          39 SampledImage 102 103
+             105:   20(fvec3) Load 22(c3)
+             106:   25(ivec2) Load 27(o2)
+             107:   31(ivec4) ImageGather 104 105 99 Offset 106
+                              Store 101(txval111) 107
+             109:          48 Load 50(g_tTex2du4a)
+             110:          14 Load 16(g_sSamp)
+             111:          53 SampledImage 109 110
+             112:   20(fvec3) Load 22(c3)
+             113:   25(ivec2) Load 27(o2)
+             114:   45(ivec4) ImageGather 111 112 99 Offset 113
+                              Store 108(txval121) 114
+             116:          10 Load 12(g_tTex2df4a)
+             117:          14 Load 16(g_sSamp)
+             118:          18 SampledImage 116 117
+             119:   20(fvec3) Load 22(c3)
+             120:   25(ivec2) Load 27(o2)
+             121:   25(ivec2) Load 27(o2)
+             122:   25(ivec2) Load 27(o2)
+             123:   25(ivec2) Load 27(o2)
+             124:          68 CompositeConstruct 120 121 122 123
+             125:    7(fvec4) ImageGather 118 119 99 ConstOffsets 124
+                              Store 115(txval104) 125
+             127:          34 Load 36(g_tTex2di4a)
+             128:          14 Load 16(g_sSamp)
+             129:          39 SampledImage 127 128
+             130:   20(fvec3) Load 22(c3)
+             131:   25(ivec2) Load 27(o2)
+             132:   25(ivec2) Load 27(o2)
+             133:   25(ivec2) Load 27(o2)
+             134:   25(ivec2) Load 27(o2)
+             135:          68 CompositeConstruct 131 132 133 134
+             136:   31(ivec4) ImageGather 129 130 99 ConstOffsets 135
+                              Store 126(txval114) 136
+             138:          48 Load 50(g_tTex2du4a)
+             139:          14 Load 16(g_sSamp)
+             140:          53 SampledImage 138 139
+             141:   20(fvec3) Load 22(c3)
+             142:   25(ivec2) Load 27(o2)
+             143:   25(ivec2) Load 27(o2)
+             144:   25(ivec2) Load 27(o2)
+             145:   25(ivec2) Load 27(o2)
+             146:          68 CompositeConstruct 142 143 144 145
+             147:   45(ivec4) ImageGather 140 141 99 ConstOffsets 146
+                              Store 137(txval124) 147
+             149:          10 Load 12(g_tTex2df4a)
+             150:          14 Load 16(g_sSamp)
+             151:          18 SampledImage 149 150
+             152:   20(fvec3) Load 22(c3)
+             153:   25(ivec2) Load 27(o2)
+             155:    7(fvec4) ImageGather 151 152 154 Offset 153
+                              Store 148(txval201) 155
+             157:          34 Load 36(g_tTex2di4a)
+             158:          14 Load 16(g_sSamp)
+             159:          39 SampledImage 157 158
+             160:   20(fvec3) Load 22(c3)
+             161:   25(ivec2) Load 27(o2)
+             162:   31(ivec4) ImageGather 159 160 154 Offset 161
+                              Store 156(txval211) 162
+             164:          48 Load 50(g_tTex2du4a)
+             165:          14 Load 16(g_sSamp)
+             166:          53 SampledImage 164 165
+             167:   20(fvec3) Load 22(c3)
+             168:   25(ivec2) Load 27(o2)
+             169:   45(ivec4) ImageGather 166 167 154 Offset 168
+                              Store 163(txval221) 169
+             171:          10 Load 12(g_tTex2df4a)
+             172:          14 Load 16(g_sSamp)
+             173:          18 SampledImage 171 172
+             174:   20(fvec3) Load 22(c3)
+             175:   25(ivec2) Load 27(o2)
+             176:   25(ivec2) Load 27(o2)
+             177:   25(ivec2) Load 27(o2)
+             178:   25(ivec2) Load 27(o2)
+             179:          68 CompositeConstruct 175 176 177 178
+             180:    7(fvec4) ImageGather 173 174 154 ConstOffsets 179
+                              Store 170(txval204) 180
+             182:          34 Load 36(g_tTex2di4a)
+             183:          14 Load 16(g_sSamp)
+             184:          39 SampledImage 182 183
+             185:   20(fvec3) Load 22(c3)
+             186:   25(ivec2) Load 27(o2)
+             187:   25(ivec2) Load 27(o2)
+             188:   25(ivec2) Load 27(o2)
+             189:   25(ivec2) Load 27(o2)
+             190:          68 CompositeConstruct 186 187 188 189
+             191:   31(ivec4) ImageGather 184 185 154 ConstOffsets 190
+                              Store 181(txval214) 191
+             193:          48 Load 50(g_tTex2du4a)
+             194:          14 Load 16(g_sSamp)
+             195:          53 SampledImage 193 194
+             196:   20(fvec3) Load 22(c3)
+             197:   25(ivec2) Load 27(o2)
+             198:   25(ivec2) Load 27(o2)
+             199:   25(ivec2) Load 27(o2)
+             200:   25(ivec2) Load 27(o2)
+             201:          68 CompositeConstruct 197 198 199 200
+             202:   45(ivec4) ImageGather 195 196 154 ConstOffsets 201
+                              Store 192(txval224) 202
+             204:          10 Load 12(g_tTex2df4a)
+             205:          14 Load 16(g_sSamp)
+             206:          18 SampledImage 204 205
+             207:   20(fvec3) Load 22(c3)
+             208:   25(ivec2) Load 27(o2)
+             210:    7(fvec4) ImageGather 206 207 209 Offset 208
+                              Store 203(txval301) 210
+             212:          34 Load 36(g_tTex2di4a)
+             213:          14 Load 16(g_sSamp)
+             214:          39 SampledImage 212 213
+             215:   20(fvec3) Load 22(c3)
+             216:   25(ivec2) Load 27(o2)
+             217:   31(ivec4) ImageGather 214 215 209 Offset 216
+                              Store 211(txval311) 217
+             219:          48 Load 50(g_tTex2du4a)
+             220:          14 Load 16(g_sSamp)
+             221:          53 SampledImage 219 220
+             222:   20(fvec3) Load 22(c3)
+             223:   25(ivec2) Load 27(o2)
+             224:   45(ivec4) ImageGather 221 222 209 Offset 223
+                              Store 218(txval321) 224
+             226:          10 Load 12(g_tTex2df4a)
+             227:          14 Load 16(g_sSamp)
+             228:          18 SampledImage 226 227
+             229:   20(fvec3) Load 22(c3)
+             230:   25(ivec2) Load 27(o2)
+             231:   25(ivec2) Load 27(o2)
+             232:   25(ivec2) Load 27(o2)
+             233:   25(ivec2) Load 27(o2)
+             234:          68 CompositeConstruct 230 231 232 233
+             235:    7(fvec4) ImageGather 228 229 209 ConstOffsets 234
+                              Store 225(txval304) 235
+             237:          34 Load 36(g_tTex2di4a)
+             238:          14 Load 16(g_sSamp)
+             239:          39 SampledImage 237 238
+             240:   20(fvec3) Load 22(c3)
+             241:   25(ivec2) Load 27(o2)
+             242:   25(ivec2) Load 27(o2)
+             243:   25(ivec2) Load 27(o2)
+             244:   25(ivec2) Load 27(o2)
+             245:          68 CompositeConstruct 241 242 243 244
+             246:   31(ivec4) ImageGather 239 240 209 ConstOffsets 245
+                              Store 236(txval314) 246
+             248:          48 Load 50(g_tTex2du4a)
+             249:          14 Load 16(g_sSamp)
+             250:          53 SampledImage 248 249
+             251:   20(fvec3) Load 22(c3)
+             252:   25(ivec2) Load 27(o2)
+             253:   25(ivec2) Load 27(o2)
+             254:   25(ivec2) Load 27(o2)
+             255:   25(ivec2) Load 27(o2)
+             256:          68 CompositeConstruct 252 253 254 255
+             257:   45(ivec4) ImageGather 250 251 209 ConstOffsets 256
+                              Store 247(txval324) 257
+             263:      8(ptr) AccessChain 260(psout) 29
+                              Store 263 262
+             265:    264(ptr) AccessChain 260(psout) 99
+                              Store 265 261
+             266:258(PS_OUTPUT) Load 260(psout)
+                              ReturnValue 266
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.negative.comp.out b/Test/baseResults/hlsl.intrinsics.negative.comp.out
index 043fa82..9c9a708 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.comp.out
@@ -1,157 +1,7 @@
 hlsl.intrinsics.negative.comp
-ERROR: 0:7: 'asdouble' : no matching overloaded function found 
-ERROR: 0:8: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:9: 'clip' : no matching overloaded function found 
-ERROR: 0:10: 'countbits' : no matching overloaded function found 
-ERROR: 0:11: 'cross' : no matching overloaded function found 
-ERROR: 0:12: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:13: 'ddx' : no matching overloaded function found 
-ERROR: 0:14: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:15: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:16: 'ddy' : no matching overloaded function found 
-ERROR: 0:17: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:18: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:19: 'determinant' : no matching overloaded function found 
-ERROR: 0:20: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:21: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:22: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:23: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:24: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:25: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:27: 'fwidth' : no matching overloaded function found 
-ERROR: 0:28: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:29: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:30: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:31: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:32: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:33: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:34: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:35: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:36: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:37: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:38: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:39: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:40: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:41: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:42: 'length' : no matching overloaded function found 
-ERROR: 0:43: 'msad4' : no matching overloaded function found 
-ERROR: 0:44: 'normalize' : no matching overloaded function found 
-ERROR: 0:45: 'reflect' : no matching overloaded function found 
-ERROR: 0:46: 'refract' : no matching overloaded function found 
-ERROR: 0:47: 'refract' : no matching overloaded function found 
-ERROR: 0:48: 'reversebits' : no matching overloaded function found 
-ERROR: 0:49: 'transpose' : no matching overloaded function found 
-ERROR: 0:60: 'GetRenderTargetSamplePosition' : no matching overloaded function found 
-ERROR: 0:69: 'asdouble' : no matching overloaded function found 
-ERROR: 0:70: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:71: 'countbits' : no matching overloaded function found 
-ERROR: 0:72: 'cross' : no matching overloaded function found 
-ERROR: 0:73: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:74: 'ddx' : no matching overloaded function found 
-ERROR: 0:75: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:76: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:77: 'ddy' : no matching overloaded function found 
-ERROR: 0:78: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:79: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:80: 'determinant' : no matching overloaded function found 
-ERROR: 0:81: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:82: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:83: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:84: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:85: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:86: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:88: 'fwidth' : no matching overloaded function found 
-ERROR: 0:89: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:90: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:91: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:92: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:93: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:94: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:95: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:96: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:97: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:98: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:99: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:100: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:101: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:102: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:103: 'noise' : no matching overloaded function found 
-ERROR: 0:104: 'reversebits' : no matching overloaded function found 
-ERROR: 0:105: 'transpose' : no matching overloaded function found 
-ERROR: 0:116: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:117: 'countbits' : no matching overloaded function found 
-ERROR: 0:118: 'ddx' : no matching overloaded function found 
-ERROR: 0:119: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:120: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:121: 'ddy' : no matching overloaded function found 
-ERROR: 0:122: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:123: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:124: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:125: 'determinant' : no matching overloaded function found 
-ERROR: 0:126: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:127: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:128: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:129: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:130: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:131: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:133: 'fwidth' : no matching overloaded function found 
-ERROR: 0:134: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:135: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:136: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:137: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:138: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:139: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:140: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:141: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:142: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:143: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:144: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:145: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:146: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:147: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:148: 'noise' : no matching overloaded function found 
-ERROR: 0:149: 'reversebits' : no matching overloaded function found 
-ERROR: 0:150: 'transpose' : no matching overloaded function found 
-ERROR: 0:161: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:162: 'countbits' : no matching overloaded function found 
-ERROR: 0:163: 'cross' : no matching overloaded function found 
-ERROR: 0:164: 'determinant' : no matching overloaded function found 
-ERROR: 0:165: 'ddx' : no matching overloaded function found 
-ERROR: 0:166: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:167: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:168: 'ddy' : no matching overloaded function found 
-ERROR: 0:169: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:170: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:171: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:172: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:173: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:174: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:175: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:176: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:178: 'fwidth' : no matching overloaded function found 
-ERROR: 0:179: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:180: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:181: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:182: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:183: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:184: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:185: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:186: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:187: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:188: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:189: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:190: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:191: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:192: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:193: 'noise' : no matching overloaded function found 
-ERROR: 0:194: 'reversebits' : no matching overloaded function found 
-ERROR: 0:195: 'transpose' : no matching overloaded function found 
-ERROR: 147 compilation errors.  No code generated.
-
-
 Shader version: 450
 local_size = (1, 1, 1)
-ERROR: node is still EOpNull!
+0:? Sequence
 0:56  Function Definition: ComputeShaderFunctionS(f1;f1;f1;i1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
@@ -159,90 +9,6 @@
 0:2      'inF2' (in float)
 0:2      'inI0' (in int)
 0:?     Sequence
-0:7      Constant:
-0:7        0.000000
-0:8      Constant:
-0:8        0.000000
-0:9      Constant:
-0:9        0.000000
-0:10      Constant:
-0:10        0.000000
-0:11      Constant:
-0:11        0.000000
-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:17      Constant:
-0:17        0.000000
-0:18      Constant:
-0:18        0.000000
-0:19      Constant:
-0:19        0.000000
-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:27      Constant:
-0:27        0.000000
-0:28      Constant:
-0:28        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: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:40      Constant:
-0:40        0.000000
-0:41      Constant:
-0:41        0.000000
-0:42      Constant:
-0:42        0.000000
-0:43      Constant:
-0:43        0.000000
-0:44      Constant:
-0:44        0.000000
-0:45      Constant:
-0:45        0.000000
-0:46      Constant:
-0:46        0.000000
-0:47      Constant:
-0:47        0.000000
-0:48      Constant:
-0:48        0.000000
-0:49      Constant:
-0:49        0.000000
 0:53      Branch: Return with expression
 0:53        Constant:
 0:53          0.000000
@@ -253,8 +19,6 @@
 0:57      'inF2' (in 1-component vector of float)
 0:57      'inI0' (in 1-component vector of int)
 0:?     Sequence
-0:60      Constant:
-0:60        0.000000
 0:62      Branch: Return with expression
 0:62        Constant:
 0:62          0.000000
@@ -265,78 +29,6 @@
 0:66      'inF2' (in 2-component vector of float)
 0:66      'inI0' (in 2-component vector of int)
 0:?     Sequence
-0:69      Constant:
-0:69        0.000000
-0:70      Constant:
-0:70        0.000000
-0:71      Constant:
-0:71        0.000000
-0:72      Constant:
-0:72        0.000000
-0:73      Constant:
-0:73        0.000000
-0:74      Constant:
-0:74        0.000000
-0:75      Constant:
-0:75        0.000000
-0:76      Constant:
-0:76        0.000000
-0:77      Constant:
-0:77        0.000000
-0:78      Constant:
-0:78        0.000000
-0:79      Constant:
-0:79        0.000000
-0:80      Constant:
-0:80        0.000000
-0:81      Constant:
-0:81        0.000000
-0:82      Constant:
-0:82        0.000000
-0:83      Constant:
-0:83        0.000000
-0:84      Constant:
-0:84        0.000000
-0:85      Constant:
-0:85        0.000000
-0:86      Constant:
-0:86        0.000000
-0:88      Constant:
-0:88        0.000000
-0:89      Constant:
-0:89        0.000000
-0:90      Constant:
-0:90        0.000000
-0:91      Constant:
-0:91        0.000000
-0:92      Constant:
-0:92        0.000000
-0:93      Constant:
-0:93        0.000000
-0:94      Constant:
-0:94        0.000000
-0:95      Constant:
-0:95        0.000000
-0:96      Constant:
-0:96        0.000000
-0:97      Constant:
-0:97        0.000000
-0:98      Constant:
-0:98        0.000000
-0:99      Constant:
-0:99        0.000000
-0:100      Constant:
-0:100        0.000000
-0:101      Constant:
-0:101        0.000000
-0:102      Constant:
-0:102        0.000000
-0:103      Constant:
-0:103        0.000000
-0:104      Constant:
-0:104        0.000000
-0:105      Constant:
-0:105        0.000000
 0:109      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -348,74 +40,6 @@
 0:113      'inF2' (in 3-component vector of float)
 0:113      'inI0' (in 3-component vector of int)
 0:?     Sequence
-0:116      Constant:
-0:116        0.000000
-0:117      Constant:
-0:117        0.000000
-0:118      Constant:
-0:118        0.000000
-0:119      Constant:
-0:119        0.000000
-0:120      Constant:
-0:120        0.000000
-0:121      Constant:
-0:121        0.000000
-0:122      Constant:
-0:122        0.000000
-0:123      Constant:
-0:123        0.000000
-0:124      Constant:
-0:124        0.000000
-0:125      Constant:
-0:125        0.000000
-0:126      Constant:
-0:126        0.000000
-0:127      Constant:
-0:127        0.000000
-0:128      Constant:
-0:128        0.000000
-0:129      Constant:
-0:129        0.000000
-0:130      Constant:
-0:130        0.000000
-0:131      Constant:
-0:131        0.000000
-0:133      Constant:
-0:133        0.000000
-0:134      Constant:
-0:134        0.000000
-0:135      Constant:
-0:135        0.000000
-0:136      Constant:
-0:136        0.000000
-0:137      Constant:
-0:137        0.000000
-0:138      Constant:
-0:138        0.000000
-0:139      Constant:
-0:139        0.000000
-0:140      Constant:
-0:140        0.000000
-0:141      Constant:
-0:141        0.000000
-0:142      Constant:
-0:142        0.000000
-0:143      Constant:
-0:143        0.000000
-0:144      Constant:
-0:144        0.000000
-0:145      Constant:
-0:145        0.000000
-0:146      Constant:
-0:146        0.000000
-0:147      Constant:
-0:147        0.000000
-0:148      Constant:
-0:148        0.000000
-0:149      Constant:
-0:149        0.000000
-0:150      Constant:
-0:150        0.000000
 0:154      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -428,74 +52,6 @@
 0:158      'inF2' (in 4-component vector of float)
 0:158      'inI0' (in 4-component vector of int)
 0:?     Sequence
-0:161      Constant:
-0:161        0.000000
-0:162      Constant:
-0:162        0.000000
-0:163      Constant:
-0:163        0.000000
-0:164      Constant:
-0:164        0.000000
-0:165      Constant:
-0:165        0.000000
-0:166      Constant:
-0:166        0.000000
-0:167      Constant:
-0:167        0.000000
-0:168      Constant:
-0:168        0.000000
-0:169      Constant:
-0:169        0.000000
-0:170      Constant:
-0:170        0.000000
-0:171      Constant:
-0:171        0.000000
-0:172      Constant:
-0:172        0.000000
-0:173      Constant:
-0:173        0.000000
-0:174      Constant:
-0:174        0.000000
-0:175      Constant:
-0:175        0.000000
-0:176      Constant:
-0:176        0.000000
-0:178      Constant:
-0:178        0.000000
-0:179      Constant:
-0:179        0.000000
-0:180      Constant:
-0:180        0.000000
-0:181      Constant:
-0:181        0.000000
-0:182      Constant:
-0:182        0.000000
-0:183      Constant:
-0:183        0.000000
-0:184      Constant:
-0:184        0.000000
-0:185      Constant:
-0:185        0.000000
-0:186      Constant:
-0:186        0.000000
-0:187      Constant:
-0:187        0.000000
-0:188      Constant:
-0:188        0.000000
-0:189      Constant:
-0:189        0.000000
-0:190      Constant:
-0:190        0.000000
-0:191      Constant:
-0:191        0.000000
-0:192      Constant:
-0:192        0.000000
-0:193      Constant:
-0:193        0.000000
-0:194      Constant:
-0:194        0.000000
-0:195      Constant:
-0:195        0.000000
 0:199      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -510,7 +66,7 @@
 
 Shader version: 450
 local_size = (1, 1, 1)
-ERROR: node is still EOpNull!
+0:? Sequence
 0:56  Function Definition: ComputeShaderFunctionS(f1;f1;f1;i1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
@@ -518,90 +74,6 @@
 0:2      'inF2' (in float)
 0:2      'inI0' (in int)
 0:?     Sequence
-0:7      Constant:
-0:7        0.000000
-0:8      Constant:
-0:8        0.000000
-0:9      Constant:
-0:9        0.000000
-0:10      Constant:
-0:10        0.000000
-0:11      Constant:
-0:11        0.000000
-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:17      Constant:
-0:17        0.000000
-0:18      Constant:
-0:18        0.000000
-0:19      Constant:
-0:19        0.000000
-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:27      Constant:
-0:27        0.000000
-0:28      Constant:
-0:28        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: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:40      Constant:
-0:40        0.000000
-0:41      Constant:
-0:41        0.000000
-0:42      Constant:
-0:42        0.000000
-0:43      Constant:
-0:43        0.000000
-0:44      Constant:
-0:44        0.000000
-0:45      Constant:
-0:45        0.000000
-0:46      Constant:
-0:46        0.000000
-0:47      Constant:
-0:47        0.000000
-0:48      Constant:
-0:48        0.000000
-0:49      Constant:
-0:49        0.000000
 0:53      Branch: Return with expression
 0:53        Constant:
 0:53          0.000000
@@ -612,8 +84,6 @@
 0:57      'inF2' (in 1-component vector of float)
 0:57      'inI0' (in 1-component vector of int)
 0:?     Sequence
-0:60      Constant:
-0:60        0.000000
 0:62      Branch: Return with expression
 0:62        Constant:
 0:62          0.000000
@@ -624,78 +94,6 @@
 0:66      'inF2' (in 2-component vector of float)
 0:66      'inI0' (in 2-component vector of int)
 0:?     Sequence
-0:69      Constant:
-0:69        0.000000
-0:70      Constant:
-0:70        0.000000
-0:71      Constant:
-0:71        0.000000
-0:72      Constant:
-0:72        0.000000
-0:73      Constant:
-0:73        0.000000
-0:74      Constant:
-0:74        0.000000
-0:75      Constant:
-0:75        0.000000
-0:76      Constant:
-0:76        0.000000
-0:77      Constant:
-0:77        0.000000
-0:78      Constant:
-0:78        0.000000
-0:79      Constant:
-0:79        0.000000
-0:80      Constant:
-0:80        0.000000
-0:81      Constant:
-0:81        0.000000
-0:82      Constant:
-0:82        0.000000
-0:83      Constant:
-0:83        0.000000
-0:84      Constant:
-0:84        0.000000
-0:85      Constant:
-0:85        0.000000
-0:86      Constant:
-0:86        0.000000
-0:88      Constant:
-0:88        0.000000
-0:89      Constant:
-0:89        0.000000
-0:90      Constant:
-0:90        0.000000
-0:91      Constant:
-0:91        0.000000
-0:92      Constant:
-0:92        0.000000
-0:93      Constant:
-0:93        0.000000
-0:94      Constant:
-0:94        0.000000
-0:95      Constant:
-0:95        0.000000
-0:96      Constant:
-0:96        0.000000
-0:97      Constant:
-0:97        0.000000
-0:98      Constant:
-0:98        0.000000
-0:99      Constant:
-0:99        0.000000
-0:100      Constant:
-0:100        0.000000
-0:101      Constant:
-0:101        0.000000
-0:102      Constant:
-0:102        0.000000
-0:103      Constant:
-0:103        0.000000
-0:104      Constant:
-0:104        0.000000
-0:105      Constant:
-0:105        0.000000
 0:109      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -707,74 +105,6 @@
 0:113      'inF2' (in 3-component vector of float)
 0:113      'inI0' (in 3-component vector of int)
 0:?     Sequence
-0:116      Constant:
-0:116        0.000000
-0:117      Constant:
-0:117        0.000000
-0:118      Constant:
-0:118        0.000000
-0:119      Constant:
-0:119        0.000000
-0:120      Constant:
-0:120        0.000000
-0:121      Constant:
-0:121        0.000000
-0:122      Constant:
-0:122        0.000000
-0:123      Constant:
-0:123        0.000000
-0:124      Constant:
-0:124        0.000000
-0:125      Constant:
-0:125        0.000000
-0:126      Constant:
-0:126        0.000000
-0:127      Constant:
-0:127        0.000000
-0:128      Constant:
-0:128        0.000000
-0:129      Constant:
-0:129        0.000000
-0:130      Constant:
-0:130        0.000000
-0:131      Constant:
-0:131        0.000000
-0:133      Constant:
-0:133        0.000000
-0:134      Constant:
-0:134        0.000000
-0:135      Constant:
-0:135        0.000000
-0:136      Constant:
-0:136        0.000000
-0:137      Constant:
-0:137        0.000000
-0:138      Constant:
-0:138        0.000000
-0:139      Constant:
-0:139        0.000000
-0:140      Constant:
-0:140        0.000000
-0:141      Constant:
-0:141        0.000000
-0:142      Constant:
-0:142        0.000000
-0:143      Constant:
-0:143        0.000000
-0:144      Constant:
-0:144        0.000000
-0:145      Constant:
-0:145        0.000000
-0:146      Constant:
-0:146        0.000000
-0:147      Constant:
-0:147        0.000000
-0:148      Constant:
-0:148        0.000000
-0:149      Constant:
-0:149        0.000000
-0:150      Constant:
-0:150        0.000000
 0:154      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -787,74 +117,6 @@
 0:158      'inF2' (in 4-component vector of float)
 0:158      'inI0' (in 4-component vector of int)
 0:?     Sequence
-0:161      Constant:
-0:161        0.000000
-0:162      Constant:
-0:162        0.000000
-0:163      Constant:
-0:163        0.000000
-0:164      Constant:
-0:164        0.000000
-0:165      Constant:
-0:165        0.000000
-0:166      Constant:
-0:166        0.000000
-0:167      Constant:
-0:167        0.000000
-0:168      Constant:
-0:168        0.000000
-0:169      Constant:
-0:169        0.000000
-0:170      Constant:
-0:170        0.000000
-0:171      Constant:
-0:171        0.000000
-0:172      Constant:
-0:172        0.000000
-0:173      Constant:
-0:173        0.000000
-0:174      Constant:
-0:174        0.000000
-0:175      Constant:
-0:175        0.000000
-0:176      Constant:
-0:176        0.000000
-0:178      Constant:
-0:178        0.000000
-0:179      Constant:
-0:179        0.000000
-0:180      Constant:
-0:180        0.000000
-0:181      Constant:
-0:181        0.000000
-0:182      Constant:
-0:182        0.000000
-0:183      Constant:
-0:183        0.000000
-0:184      Constant:
-0:184        0.000000
-0:185      Constant:
-0:185        0.000000
-0:186      Constant:
-0:186        0.000000
-0:187      Constant:
-0:187        0.000000
-0:188      Constant:
-0:188        0.000000
-0:189      Constant:
-0:189        0.000000
-0:190      Constant:
-0:190        0.000000
-0:191      Constant:
-0:191        0.000000
-0:192      Constant:
-0:192        0.000000
-0:193      Constant:
-0:193        0.000000
-0:194      Constant:
-0:194        0.000000
-0:195      Constant:
-0:195        0.000000
 0:199      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -863,4 +125,96 @@
 0:?           4.000000
 0:?   Linker Objects
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 63
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "ComputeShaderFunction"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source HLSL 450
+                              Name 4  "ComputeShaderFunction"
+                              Name 15  "ComputeShaderFunctionS(f1;f1;f1;i1;"
+                              Name 11  "inF0"
+                              Name 12  "inF1"
+                              Name 13  "inF2"
+                              Name 14  "inI0"
+                              Name 21  "ComputeShaderFunction1(vf1;vf1;vf1;vi1;"
+                              Name 17  "inF0"
+                              Name 18  "inF1"
+                              Name 19  "inF2"
+                              Name 20  "inI0"
+                              Name 32  "ComputeShaderFunction2(vf2;vf2;vf2;vi2;"
+                              Name 28  "inF0"
+                              Name 29  "inF1"
+                              Name 30  "inF2"
+                              Name 31  "inI0"
+                              Name 43  "ComputeShaderFunction3(vf3;vf3;vf3;vi3;"
+                              Name 39  "inF0"
+                              Name 40  "inF1"
+                              Name 41  "inF2"
+                              Name 42  "inI0"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               8:             TypeInt 32 1
+               9:             TypePointer Function 8(int)
+              10:             TypeFunction 6(float) 7(ptr) 7(ptr) 7(ptr) 9(ptr)
+              23:             TypeVector 6(float) 2
+              24:             TypePointer Function 23(fvec2)
+              25:             TypeVector 8(int) 2
+              26:             TypePointer Function 25(ivec2)
+              27:             TypeFunction 23(fvec2) 24(ptr) 24(ptr) 24(ptr) 26(ptr)
+              34:             TypeVector 6(float) 3
+              35:             TypePointer Function 34(fvec3)
+              36:             TypeVector 8(int) 3
+              37:             TypePointer Function 36(ivec3)
+              38:             TypeFunction 34(fvec3) 35(ptr) 35(ptr) 35(ptr) 37(ptr)
+              45:    6(float) Constant 0
+              50:    6(float) Constant 1065353216
+              51:    6(float) Constant 1073741824
+              52:   23(fvec2) ConstantComposite 50 51
+              55:    6(float) Constant 1077936128
+              56:   34(fvec3) ConstantComposite 50 51 55
+              59:             TypeVector 6(float) 4
+              60:    6(float) Constant 1082130432
+              61:   59(fvec4) ConstantComposite 50 51 55 60
+4(ComputeShaderFunction):           2 Function None 3
+               5:             Label
+                              ReturnValue 61
+                              FunctionEnd
+15(ComputeShaderFunctionS(f1;f1;f1;i1;):    6(float) Function None 10
+        11(inF0):      7(ptr) FunctionParameter
+        12(inF1):      7(ptr) FunctionParameter
+        13(inF2):      7(ptr) FunctionParameter
+        14(inI0):      9(ptr) FunctionParameter
+              16:             Label
+                              ReturnValue 45
+                              FunctionEnd
+21(ComputeShaderFunction1(vf1;vf1;vf1;vi1;):    6(float) Function None 10
+        17(inF0):      7(ptr) FunctionParameter
+        18(inF1):      7(ptr) FunctionParameter
+        19(inF2):      7(ptr) FunctionParameter
+        20(inI0):      9(ptr) FunctionParameter
+              22:             Label
+                              ReturnValue 45
+                              FunctionEnd
+32(ComputeShaderFunction2(vf2;vf2;vf2;vi2;):   23(fvec2) Function None 27
+        28(inF0):     24(ptr) FunctionParameter
+        29(inF1):     24(ptr) FunctionParameter
+        30(inF2):     24(ptr) FunctionParameter
+        31(inI0):     26(ptr) FunctionParameter
+              33:             Label
+                              ReturnValue 52
+                              FunctionEnd
+43(ComputeShaderFunction3(vf3;vf3;vf3;vi3;):   34(fvec3) Function None 38
+        39(inF0):     35(ptr) FunctionParameter
+        40(inF1):     35(ptr) FunctionParameter
+        41(inF2):     35(ptr) FunctionParameter
+        42(inI0):     37(ptr) FunctionParameter
+              44:             Label
+                              ReturnValue 56
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.negative.vert.out b/Test/baseResults/hlsl.intrinsics.negative.vert.out
index 0e974a1..b8c4622 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.vert.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.vert.out
@@ -1,235 +1,6 @@
 hlsl.intrinsics.negative.vert
-ERROR: 0:18: 'AllMemoryBarrier' : no matching overloaded function found 
-ERROR: 0:19: 'AllMemoryBarrierWithGroupSync' : no matching overloaded function found 
-ERROR: 0:20: 'asdouble' : no matching overloaded function found 
-ERROR: 0:21: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:22: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:23: 'clip' : no matching overloaded function found 
-ERROR: 0:24: 'countbits' : no matching overloaded function found 
-ERROR: 0:25: 'cross' : no matching overloaded function found 
-ERROR: 0:26: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:27: 'DeviceMemoryBarrier' : no matching overloaded function found 
-ERROR: 0:28: 'DeviceMemoryBarrierWithGroupSync' : no matching overloaded function found 
-ERROR: 0:29: 'ddx' : no matching overloaded function found 
-ERROR: 0:30: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:31: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:32: 'ddy' : no matching overloaded function found 
-ERROR: 0:33: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:34: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:35: 'determinant' : no matching overloaded function found 
-ERROR: 0:36: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:37: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:38: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:39: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:40: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:41: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:43: 'fwidth' : no matching overloaded function found 
-ERROR: 0:44: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:45: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:46: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:47: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:48: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:49: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:50: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:51: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:52: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:53: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:54: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:55: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:56: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:57: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:58: 'GroupMemoryBarrier' : no matching overloaded function found 
-ERROR: 0:59: 'GroupMemoryBarrierWithGroupSync' : no matching overloaded function found 
-ERROR: 0:60: 'length' : no matching overloaded function found 
-ERROR: 0:61: 'msad4' : no matching overloaded function found 
-ERROR: 0:62: 'normalize' : no matching overloaded function found 
-ERROR: 0:63: 'reflect' : no matching overloaded function found 
-ERROR: 0:64: 'refract' : no matching overloaded function found 
-ERROR: 0:65: 'refract' : no matching overloaded function found 
-ERROR: 0:66: 'reversebits' : no matching overloaded function found 
-ERROR: 0:67: 'transpose' : no matching overloaded function found 
-ERROR: 0:78: 'GetRenderTargetSamplePosition' : no matching overloaded function found 
-ERROR: 0:87: 'asdouble' : no matching overloaded function found 
-ERROR: 0:88: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:89: 'countbits' : no matching overloaded function found 
-ERROR: 0:90: 'cross' : no matching overloaded function found 
-ERROR: 0:91: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:92: 'ddx' : no matching overloaded function found 
-ERROR: 0:93: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:94: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:95: 'ddy' : no matching overloaded function found 
-ERROR: 0:96: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:97: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:98: 'determinant' : no matching overloaded function found 
-ERROR: 0:99: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:100: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:101: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:102: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:103: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:104: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:106: 'fwidth' : no matching overloaded function found 
-ERROR: 0:107: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:108: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:109: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:110: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:111: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:112: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:113: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:114: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:115: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:116: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:117: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:118: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:119: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:120: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:121: 'noise' : no matching overloaded function found 
-ERROR: 0:122: 'reversebits' : no matching overloaded function found 
-ERROR: 0:123: 'transpose' : no matching overloaded function found 
-ERROR: 0:134: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:135: 'countbits' : no matching overloaded function found 
-ERROR: 0:136: 'ddx' : no matching overloaded function found 
-ERROR: 0:137: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:138: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:139: 'ddy' : no matching overloaded function found 
-ERROR: 0:140: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:141: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:142: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:143: 'determinant' : no matching overloaded function found 
-ERROR: 0:144: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:145: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:146: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:147: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:148: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:149: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:151: 'fwidth' : no matching overloaded function found 
-ERROR: 0:152: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:153: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:154: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:155: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:156: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:157: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:158: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:159: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:160: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:161: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:162: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:163: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:164: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:165: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:166: 'noise' : no matching overloaded function found 
-ERROR: 0:167: 'reversebits' : no matching overloaded function found 
-ERROR: 0:168: 'transpose' : no matching overloaded function found 
-ERROR: 0:179: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:180: 'countbits' : no matching overloaded function found 
-ERROR: 0:181: 'cross' : no matching overloaded function found 
-ERROR: 0:182: 'determinant' : no matching overloaded function found 
-ERROR: 0:183: 'ddx' : no matching overloaded function found 
-ERROR: 0:184: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:185: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:186: 'ddy' : no matching overloaded function found 
-ERROR: 0:187: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:188: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:189: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:190: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:191: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:192: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:193: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:194: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:196: 'fwidth' : no matching overloaded function found 
-ERROR: 0:197: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:198: 'InterlockedAdd' : no matching overloaded function found 
-ERROR: 0:199: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:200: 'InterlockedAnd' : no matching overloaded function found 
-ERROR: 0:201: 'InterlockedCompareExchange' : no matching overloaded function found 
-ERROR: 0:202: 'InterlockedExchange' : no matching overloaded function found 
-ERROR: 0:203: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:204: 'InterlockedMax' : no matching overloaded function found 
-ERROR: 0:205: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:206: 'InterlockedMin' : no matching overloaded function found 
-ERROR: 0:207: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:208: 'InterlockedOr' : no matching overloaded function found 
-ERROR: 0:209: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:210: 'InterlockedXor' : no matching overloaded function found 
-ERROR: 0:211: 'noise' : no matching overloaded function found 
-ERROR: 0:212: 'reversebits' : no matching overloaded function found 
-ERROR: 0:213: 'transpose' : no matching overloaded function found 
-ERROR: 0:253: 'countbits' : no matching overloaded function found 
-ERROR: 0:253: 'cross' : no matching overloaded function found 
-ERROR: 0:253: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:253: 'ddx' : no matching overloaded function found 
-ERROR: 0:253: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:253: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:253: 'ddy' : no matching overloaded function found 
-ERROR: 0:253: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:253: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:253: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:253: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:253: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:253: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:253: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:253: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:253: 'fwidth' : no matching overloaded function found 
-ERROR: 0:253: 'noise' : no matching overloaded function found 
-ERROR: 0:253: 'reversebits' : no matching overloaded function found 
-ERROR: 0:253: 'length' : no matching overloaded function found 
-ERROR: 0:253: 'noise' : no matching overloaded function found 
-ERROR: 0:253: 'normalize' : no matching overloaded function found 
-ERROR: 0:253: 'reflect' : no matching overloaded function found 
-ERROR: 0:253: 'refract' : no matching overloaded function found 
-ERROR: 0:253: 'reversebits' : no matching overloaded function found 
-ERROR: 0:261: 'countbits' : no matching overloaded function found 
-ERROR: 0:261: 'cross' : no matching overloaded function found 
-ERROR: 0:261: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:261: 'ddx' : no matching overloaded function found 
-ERROR: 0:261: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:261: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:261: 'ddy' : no matching overloaded function found 
-ERROR: 0:261: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:261: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:261: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:261: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:261: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:261: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:261: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:261: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:261: 'fwidth' : no matching overloaded function found 
-ERROR: 0:261: 'noise' : no matching overloaded function found 
-ERROR: 0:261: 'reversebits' : no matching overloaded function found 
-ERROR: 0:261: 'length' : no matching overloaded function found 
-ERROR: 0:261: 'noise' : no matching overloaded function found 
-ERROR: 0:261: 'normalize' : no matching overloaded function found 
-ERROR: 0:261: 'reflect' : no matching overloaded function found 
-ERROR: 0:261: 'refract' : no matching overloaded function found 
-ERROR: 0:261: 'reversebits' : no matching overloaded function found 
-ERROR: 0:269: 'countbits' : no matching overloaded function found 
-ERROR: 0:269: 'cross' : no matching overloaded function found 
-ERROR: 0:269: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
-ERROR: 0:269: 'ddx' : no matching overloaded function found 
-ERROR: 0:269: 'ddx_coarse' : no matching overloaded function found 
-ERROR: 0:269: 'ddx_fine' : no matching overloaded function found 
-ERROR: 0:269: 'ddy' : no matching overloaded function found 
-ERROR: 0:269: 'ddy_coarse' : no matching overloaded function found 
-ERROR: 0:269: 'ddy_fine' : no matching overloaded function found 
-ERROR: 0:269: 'EvaluateAttributeAtCentroid' : no matching overloaded function found 
-ERROR: 0:269: 'EvaluateAttributeAtSample' : no matching overloaded function found 
-ERROR: 0:269: 'EvaluateAttributeSnapped' : no matching overloaded function found 
-ERROR: 0:269: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:269: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:269: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:269: 'fwidth' : no matching overloaded function found 
-ERROR: 0:269: 'noise' : no matching overloaded function found 
-ERROR: 0:269: 'reversebits' : no matching overloaded function found 
-ERROR: 0:269: 'length' : no matching overloaded function found 
-ERROR: 0:269: 'noise' : no matching overloaded function found 
-ERROR: 0:269: 'normalize' : no matching overloaded function found 
-ERROR: 0:269: 'reflect' : no matching overloaded function found 
-ERROR: 0:269: 'refract' : no matching overloaded function found 
-ERROR: 0:269: 'reversebits' : no matching overloaded function found 
-ERROR: 226 compilation errors.  No code generated.
-
-
 Shader version: 450
-ERROR: node is still EOpNull!
+0:? Sequence
 0:74  Function Definition: VertexShaderFunctionS(f1;f1;f1;i1; (global float)
 0:15    Function Parameters: 
 0:15      'inF0' (in float)
@@ -237,104 +8,6 @@
 0:15      'inF2' (in float)
 0:15      'inI0' (in int)
 0:?     Sequence
-0:18      Constant:
-0:18        0.000000
-0:19      Constant:
-0:19        0.000000
-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:28      Constant:
-0:28        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: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:40      Constant:
-0:40        0.000000
-0:41      Constant:
-0:41        0.000000
-0:43      Constant:
-0:43        0.000000
-0:44      Constant:
-0:44        0.000000
-0:45      Constant:
-0:45        0.000000
-0:46      Constant:
-0:46        0.000000
-0:47      Constant:
-0:47        0.000000
-0:48      Constant:
-0:48        0.000000
-0:49      Constant:
-0:49        0.000000
-0:50      Constant:
-0:50        0.000000
-0:51      Constant:
-0:51        0.000000
-0:52      Constant:
-0:52        0.000000
-0:53      Constant:
-0:53        0.000000
-0:54      Constant:
-0:54        0.000000
-0:55      Constant:
-0:55        0.000000
-0:56      Constant:
-0:56        0.000000
-0:57      Constant:
-0:57        0.000000
-0:58      Constant:
-0:58        0.000000
-0:59      Constant:
-0:59        0.000000
-0:60      Constant:
-0:60        0.000000
-0:61      Constant:
-0:61        0.000000
-0:62      Constant:
-0:62        0.000000
-0:63      Constant:
-0:63        0.000000
-0:64      Constant:
-0:64        0.000000
-0:65      Constant:
-0:65        0.000000
-0:66      Constant:
-0:66        0.000000
-0:67      Constant:
-0:67        0.000000
 0:71      Branch: Return with expression
 0:71        Constant:
 0:71          0.000000
@@ -345,8 +18,6 @@
 0:75      'inF2' (in 1-component vector of float)
 0:75      'inI0' (in 1-component vector of int)
 0:?     Sequence
-0:78      Constant:
-0:78        0.000000
 0:80      Branch: Return with expression
 0:80        Constant:
 0:80          0.000000
@@ -357,78 +28,6 @@
 0:84      'inF2' (in 2-component vector of float)
 0:84      'inI0' (in 2-component vector of int)
 0:?     Sequence
-0:87      Constant:
-0:87        0.000000
-0:88      Constant:
-0:88        0.000000
-0:89      Constant:
-0:89        0.000000
-0:90      Constant:
-0:90        0.000000
-0:91      Constant:
-0:91        0.000000
-0:92      Constant:
-0:92        0.000000
-0:93      Constant:
-0:93        0.000000
-0:94      Constant:
-0:94        0.000000
-0:95      Constant:
-0:95        0.000000
-0:96      Constant:
-0:96        0.000000
-0:97      Constant:
-0:97        0.000000
-0:98      Constant:
-0:98        0.000000
-0:99      Constant:
-0:99        0.000000
-0:100      Constant:
-0:100        0.000000
-0:101      Constant:
-0:101        0.000000
-0:102      Constant:
-0:102        0.000000
-0:103      Constant:
-0:103        0.000000
-0:104      Constant:
-0:104        0.000000
-0:106      Constant:
-0:106        0.000000
-0:107      Constant:
-0:107        0.000000
-0:108      Constant:
-0:108        0.000000
-0:109      Constant:
-0:109        0.000000
-0:110      Constant:
-0:110        0.000000
-0:111      Constant:
-0:111        0.000000
-0:112      Constant:
-0:112        0.000000
-0:113      Constant:
-0:113        0.000000
-0:114      Constant:
-0:114        0.000000
-0:115      Constant:
-0:115        0.000000
-0:116      Constant:
-0:116        0.000000
-0:117      Constant:
-0:117        0.000000
-0:118      Constant:
-0:118        0.000000
-0:119      Constant:
-0:119        0.000000
-0:120      Constant:
-0:120        0.000000
-0:121      Constant:
-0:121        0.000000
-0:122      Constant:
-0:122        0.000000
-0:123      Constant:
-0:123        0.000000
 0:127      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -440,275 +39,43 @@
 0:131      'inF2' (in 3-component vector of float)
 0:131      'inI0' (in 3-component vector of int)
 0:?     Sequence
-0:134      Constant:
-0:134        0.000000
-0:135      Constant:
-0:135        0.000000
-0:136      Constant:
-0:136        0.000000
-0:137      Constant:
-0:137        0.000000
-0:138      Constant:
-0:138        0.000000
-0:139      Constant:
-0:139        0.000000
-0:140      Constant:
-0:140        0.000000
-0:141      Constant:
-0:141        0.000000
-0:142      Constant:
-0:142        0.000000
-0:143      Constant:
-0:143        0.000000
-0:144      Constant:
-0:144        0.000000
-0:145      Constant:
-0:145        0.000000
-0:146      Constant:
-0:146        0.000000
-0:147      Constant:
-0:147        0.000000
-0:148      Constant:
-0:148        0.000000
-0:149      Constant:
-0:149        0.000000
-0:151      Constant:
-0:151        0.000000
-0:152      Constant:
-0:152        0.000000
-0:153      Constant:
-0:153        0.000000
-0:154      Constant:
-0:154        0.000000
-0:155      Constant:
-0:155        0.000000
-0:156      Constant:
-0:156        0.000000
-0:157      Constant:
-0:157        0.000000
-0:158      Constant:
-0:158        0.000000
-0:159      Constant:
-0:159        0.000000
-0:160      Constant:
-0:160        0.000000
-0:161      Constant:
-0:161        0.000000
-0:162      Constant:
-0:162        0.000000
-0:163      Constant:
-0:163        0.000000
-0:164      Constant:
-0:164        0.000000
-0:165      Constant:
-0:165        0.000000
-0:166      Constant:
-0:166        0.000000
-0:167      Constant:
-0:167        0.000000
-0:168      Constant:
-0:168        0.000000
 0:172      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:250  Function Definition: VertexShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
+0:225  Function Definition: VertexShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
 0:176    Function Parameters: 
 0:176      'inF0' (in 4-component vector of float)
 0:176      'inF1' (in 4-component vector of float)
 0:176      'inF2' (in 4-component vector of float)
 0:176      'inI0' (in 4-component vector of int)
 0:?     Sequence
-0:179      Constant:
-0:179        0.000000
-0:180      Constant:
-0:180        0.000000
-0:181      Constant:
-0:181        0.000000
-0:182      Constant:
-0:182        0.000000
-0:183      Constant:
-0:183        0.000000
-0:184      Constant:
-0:184        0.000000
-0:185      Constant:
-0:185        0.000000
-0:186      Constant:
-0:186        0.000000
-0:187      Constant:
-0:187        0.000000
-0:188      Constant:
-0:188        0.000000
-0:189      Constant:
-0:189        0.000000
-0:190      Constant:
-0:190        0.000000
-0:191      Constant:
-0:191        0.000000
-0:192      Constant:
-0:192        0.000000
-0:193      Constant:
-0:193        0.000000
-0:194      Constant:
-0:194        0.000000
-0:196      Constant:
-0:196        0.000000
-0:197      Constant:
-0:197        0.000000
-0:198      Constant:
-0:198        0.000000
-0:199      Constant:
-0:199        0.000000
-0:200      Constant:
-0:200        0.000000
-0:201      Constant:
-0:201        0.000000
-0:202      Constant:
-0:202        0.000000
-0:203      Constant:
-0:203        0.000000
-0:204      Constant:
-0:204        0.000000
-0:205      Constant:
-0:205        0.000000
-0:206      Constant:
-0:206        0.000000
-0:207      Constant:
-0:207        0.000000
-0:208      Constant:
-0:208        0.000000
-0:209      Constant:
-0:209        0.000000
-0:210      Constant:
-0:210        0.000000
-0:211      Constant:
-0:211        0.000000
-0:212      Constant:
-0:212        0.000000
-0:213      Constant:
-0:213        0.000000
 0:217      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:258  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
-0:251    Function Parameters: 
-0:251      'inF0' (in 2X2 matrix of float)
-0:251      'inF1' (in 2X2 matrix of float)
-0:251      'inF2' (in 2X2 matrix of float)
+0:233  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:226    Function Parameters: 
+0:226      'inF0' (in 2X2 matrix of float)
+0:226      'inF1' (in 2X2 matrix of float)
+0:226      'inF2' (in 2X2 matrix of float)
 0:?     Sequence
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:255      Branch: Return with expression
+0:230      Branch: Return with expression
 0:?         Constant:
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:266  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
-0:259    Function Parameters: 
-0:259      'inF0' (in 3X3 matrix of float)
-0:259      'inF1' (in 3X3 matrix of float)
-0:259      'inF2' (in 3X3 matrix of float)
+0:241  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:234    Function Parameters: 
+0:234      'inF0' (in 3X3 matrix of float)
+0:234      'inF1' (in 3X3 matrix of float)
+0:234      'inF2' (in 3X3 matrix of float)
 0:?     Sequence
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:263      Branch: Return with expression
+0:238      Branch: Return with expression
 0:?         Constant:
 0:?           3.000000
 0:?           3.000000
@@ -719,61 +86,13 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:273  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
-0:267    Function Parameters: 
-0:267      'inF0' (in 4X4 matrix of float)
-0:267      'inF1' (in 4X4 matrix of float)
-0:267      'inF2' (in 4X4 matrix of float)
+0:248  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:242    Function Parameters: 
+0:242      'inF0' (in 4X4 matrix of float)
+0:242      'inF1' (in 4X4 matrix of float)
+0:242      'inF2' (in 4X4 matrix of float)
 0:?     Sequence
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:271      Branch: Return with expression
+0:246      Branch: Return with expression
 0:?         Constant:
 0:?           4.000000
 0:?           4.000000
@@ -810,7 +129,7 @@
 
 
 Shader version: 450
-ERROR: node is still EOpNull!
+0:? Sequence
 0:74  Function Definition: VertexShaderFunctionS(f1;f1;f1;i1; (global float)
 0:15    Function Parameters: 
 0:15      'inF0' (in float)
@@ -818,104 +137,6 @@
 0:15      'inF2' (in float)
 0:15      'inI0' (in int)
 0:?     Sequence
-0:18      Constant:
-0:18        0.000000
-0:19      Constant:
-0:19        0.000000
-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:28      Constant:
-0:28        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: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:40      Constant:
-0:40        0.000000
-0:41      Constant:
-0:41        0.000000
-0:43      Constant:
-0:43        0.000000
-0:44      Constant:
-0:44        0.000000
-0:45      Constant:
-0:45        0.000000
-0:46      Constant:
-0:46        0.000000
-0:47      Constant:
-0:47        0.000000
-0:48      Constant:
-0:48        0.000000
-0:49      Constant:
-0:49        0.000000
-0:50      Constant:
-0:50        0.000000
-0:51      Constant:
-0:51        0.000000
-0:52      Constant:
-0:52        0.000000
-0:53      Constant:
-0:53        0.000000
-0:54      Constant:
-0:54        0.000000
-0:55      Constant:
-0:55        0.000000
-0:56      Constant:
-0:56        0.000000
-0:57      Constant:
-0:57        0.000000
-0:58      Constant:
-0:58        0.000000
-0:59      Constant:
-0:59        0.000000
-0:60      Constant:
-0:60        0.000000
-0:61      Constant:
-0:61        0.000000
-0:62      Constant:
-0:62        0.000000
-0:63      Constant:
-0:63        0.000000
-0:64      Constant:
-0:64        0.000000
-0:65      Constant:
-0:65        0.000000
-0:66      Constant:
-0:66        0.000000
-0:67      Constant:
-0:67        0.000000
 0:71      Branch: Return with expression
 0:71        Constant:
 0:71          0.000000
@@ -926,8 +147,6 @@
 0:75      'inF2' (in 1-component vector of float)
 0:75      'inI0' (in 1-component vector of int)
 0:?     Sequence
-0:78      Constant:
-0:78        0.000000
 0:80      Branch: Return with expression
 0:80        Constant:
 0:80          0.000000
@@ -938,78 +157,6 @@
 0:84      'inF2' (in 2-component vector of float)
 0:84      'inI0' (in 2-component vector of int)
 0:?     Sequence
-0:87      Constant:
-0:87        0.000000
-0:88      Constant:
-0:88        0.000000
-0:89      Constant:
-0:89        0.000000
-0:90      Constant:
-0:90        0.000000
-0:91      Constant:
-0:91        0.000000
-0:92      Constant:
-0:92        0.000000
-0:93      Constant:
-0:93        0.000000
-0:94      Constant:
-0:94        0.000000
-0:95      Constant:
-0:95        0.000000
-0:96      Constant:
-0:96        0.000000
-0:97      Constant:
-0:97        0.000000
-0:98      Constant:
-0:98        0.000000
-0:99      Constant:
-0:99        0.000000
-0:100      Constant:
-0:100        0.000000
-0:101      Constant:
-0:101        0.000000
-0:102      Constant:
-0:102        0.000000
-0:103      Constant:
-0:103        0.000000
-0:104      Constant:
-0:104        0.000000
-0:106      Constant:
-0:106        0.000000
-0:107      Constant:
-0:107        0.000000
-0:108      Constant:
-0:108        0.000000
-0:109      Constant:
-0:109        0.000000
-0:110      Constant:
-0:110        0.000000
-0:111      Constant:
-0:111        0.000000
-0:112      Constant:
-0:112        0.000000
-0:113      Constant:
-0:113        0.000000
-0:114      Constant:
-0:114        0.000000
-0:115      Constant:
-0:115        0.000000
-0:116      Constant:
-0:116        0.000000
-0:117      Constant:
-0:117        0.000000
-0:118      Constant:
-0:118        0.000000
-0:119      Constant:
-0:119        0.000000
-0:120      Constant:
-0:120        0.000000
-0:121      Constant:
-0:121        0.000000
-0:122      Constant:
-0:122        0.000000
-0:123      Constant:
-0:123        0.000000
 0:127      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
@@ -1021,275 +168,43 @@
 0:131      'inF2' (in 3-component vector of float)
 0:131      'inI0' (in 3-component vector of int)
 0:?     Sequence
-0:134      Constant:
-0:134        0.000000
-0:135      Constant:
-0:135        0.000000
-0:136      Constant:
-0:136        0.000000
-0:137      Constant:
-0:137        0.000000
-0:138      Constant:
-0:138        0.000000
-0:139      Constant:
-0:139        0.000000
-0:140      Constant:
-0:140        0.000000
-0:141      Constant:
-0:141        0.000000
-0:142      Constant:
-0:142        0.000000
-0:143      Constant:
-0:143        0.000000
-0:144      Constant:
-0:144        0.000000
-0:145      Constant:
-0:145        0.000000
-0:146      Constant:
-0:146        0.000000
-0:147      Constant:
-0:147        0.000000
-0:148      Constant:
-0:148        0.000000
-0:149      Constant:
-0:149        0.000000
-0:151      Constant:
-0:151        0.000000
-0:152      Constant:
-0:152        0.000000
-0:153      Constant:
-0:153        0.000000
-0:154      Constant:
-0:154        0.000000
-0:155      Constant:
-0:155        0.000000
-0:156      Constant:
-0:156        0.000000
-0:157      Constant:
-0:157        0.000000
-0:158      Constant:
-0:158        0.000000
-0:159      Constant:
-0:159        0.000000
-0:160      Constant:
-0:160        0.000000
-0:161      Constant:
-0:161        0.000000
-0:162      Constant:
-0:162        0.000000
-0:163      Constant:
-0:163        0.000000
-0:164      Constant:
-0:164        0.000000
-0:165      Constant:
-0:165        0.000000
-0:166      Constant:
-0:166        0.000000
-0:167      Constant:
-0:167        0.000000
-0:168      Constant:
-0:168        0.000000
 0:172      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:250  Function Definition: VertexShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
+0:225  Function Definition: VertexShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
 0:176    Function Parameters: 
 0:176      'inF0' (in 4-component vector of float)
 0:176      'inF1' (in 4-component vector of float)
 0:176      'inF2' (in 4-component vector of float)
 0:176      'inI0' (in 4-component vector of int)
 0:?     Sequence
-0:179      Constant:
-0:179        0.000000
-0:180      Constant:
-0:180        0.000000
-0:181      Constant:
-0:181        0.000000
-0:182      Constant:
-0:182        0.000000
-0:183      Constant:
-0:183        0.000000
-0:184      Constant:
-0:184        0.000000
-0:185      Constant:
-0:185        0.000000
-0:186      Constant:
-0:186        0.000000
-0:187      Constant:
-0:187        0.000000
-0:188      Constant:
-0:188        0.000000
-0:189      Constant:
-0:189        0.000000
-0:190      Constant:
-0:190        0.000000
-0:191      Constant:
-0:191        0.000000
-0:192      Constant:
-0:192        0.000000
-0:193      Constant:
-0:193        0.000000
-0:194      Constant:
-0:194        0.000000
-0:196      Constant:
-0:196        0.000000
-0:197      Constant:
-0:197        0.000000
-0:198      Constant:
-0:198        0.000000
-0:199      Constant:
-0:199        0.000000
-0:200      Constant:
-0:200        0.000000
-0:201      Constant:
-0:201        0.000000
-0:202      Constant:
-0:202        0.000000
-0:203      Constant:
-0:203        0.000000
-0:204      Constant:
-0:204        0.000000
-0:205      Constant:
-0:205        0.000000
-0:206      Constant:
-0:206        0.000000
-0:207      Constant:
-0:207        0.000000
-0:208      Constant:
-0:208        0.000000
-0:209      Constant:
-0:209        0.000000
-0:210      Constant:
-0:210        0.000000
-0:211      Constant:
-0:211        0.000000
-0:212      Constant:
-0:212        0.000000
-0:213      Constant:
-0:213        0.000000
 0:217      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:258  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
-0:251    Function Parameters: 
-0:251      'inF0' (in 2X2 matrix of float)
-0:251      'inF1' (in 2X2 matrix of float)
-0:251      'inF2' (in 2X2 matrix of float)
+0:233  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:226    Function Parameters: 
+0:226      'inF0' (in 2X2 matrix of float)
+0:226      'inF1' (in 2X2 matrix of float)
+0:226      'inF2' (in 2X2 matrix of float)
 0:?     Sequence
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:253      Constant:
-0:253        0.000000
-0:255      Branch: Return with expression
+0:230      Branch: Return with expression
 0:?         Constant:
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:266  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
-0:259    Function Parameters: 
-0:259      'inF0' (in 3X3 matrix of float)
-0:259      'inF1' (in 3X3 matrix of float)
-0:259      'inF2' (in 3X3 matrix of float)
+0:241  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:234    Function Parameters: 
+0:234      'inF0' (in 3X3 matrix of float)
+0:234      'inF1' (in 3X3 matrix of float)
+0:234      'inF2' (in 3X3 matrix of float)
 0:?     Sequence
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:261      Constant:
-0:261        0.000000
-0:263      Branch: Return with expression
+0:238      Branch: Return with expression
 0:?         Constant:
 0:?           3.000000
 0:?           3.000000
@@ -1300,61 +215,13 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:273  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
-0:267    Function Parameters: 
-0:267      'inF0' (in 4X4 matrix of float)
-0:267      'inF1' (in 4X4 matrix of float)
-0:267      'inF2' (in 4X4 matrix of float)
+0:248  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:242    Function Parameters: 
+0:242      'inF0' (in 4X4 matrix of float)
+0:242      'inF1' (in 4X4 matrix of float)
+0:242      'inF2' (in 4X4 matrix of float)
 0:?     Sequence
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:269      Constant:
-0:269        0.000000
-0:271      Branch: Return with expression
+0:246      Branch: Return with expression
 0:?         Constant:
 0:?           4.000000
 0:?           4.000000
@@ -1386,4 +253,175 @@
 0:?     'gs_ub4' (global 4-component vector of uint)
 0:?     'gs_uc4' (global 4-component vector of uint)
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 119
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "VertexShaderFunction"
+                              Source HLSL 450
+                              Name 4  "VertexShaderFunction"
+                              Name 15  "VertexShaderFunctionS(f1;f1;f1;i1;"
+                              Name 11  "inF0"
+                              Name 12  "inF1"
+                              Name 13  "inF2"
+                              Name 14  "inI0"
+                              Name 21  "VertexShaderFunction1(vf1;vf1;vf1;vi1;"
+                              Name 17  "inF0"
+                              Name 18  "inF1"
+                              Name 19  "inF2"
+                              Name 20  "inI0"
+                              Name 32  "VertexShaderFunction2(vf2;vf2;vf2;vi2;"
+                              Name 28  "inF0"
+                              Name 29  "inF1"
+                              Name 30  "inF2"
+                              Name 31  "inI0"
+                              Name 43  "VertexShaderFunction3(vf3;vf3;vf3;vi3;"
+                              Name 39  "inF0"
+                              Name 40  "inF1"
+                              Name 41  "inF2"
+                              Name 42  "inI0"
+                              Name 51  "VertexShaderFunction2x2(mf22;mf22;mf22;"
+                              Name 48  "inF0"
+                              Name 49  "inF1"
+                              Name 50  "inF2"
+                              Name 59  "VertexShaderFunction3x3(mf33;mf33;mf33;"
+                              Name 56  "inF0"
+                              Name 57  "inF1"
+                              Name 58  "inF2"
+                              Name 68  "VertexShaderFunction4x4(mf44;mf44;mf44;"
+                              Name 65  "inF0"
+                              Name 66  "inF1"
+                              Name 67  "inF2"
+                              Name 101  "gs_ua"
+                              Name 102  "gs_ub"
+                              Name 103  "gs_uc"
+                              Name 106  "gs_ua2"
+                              Name 107  "gs_ub2"
+                              Name 108  "gs_uc2"
+                              Name 111  "gs_ua3"
+                              Name 112  "gs_ub3"
+                              Name 113  "gs_uc3"
+                              Name 116  "gs_ua4"
+                              Name 117  "gs_ub4"
+                              Name 118  "gs_uc4"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               8:             TypeInt 32 1
+               9:             TypePointer Function 8(int)
+              10:             TypeFunction 6(float) 7(ptr) 7(ptr) 7(ptr) 9(ptr)
+              23:             TypeVector 6(float) 2
+              24:             TypePointer Function 23(fvec2)
+              25:             TypeVector 8(int) 2
+              26:             TypePointer Function 25(ivec2)
+              27:             TypeFunction 23(fvec2) 24(ptr) 24(ptr) 24(ptr) 26(ptr)
+              34:             TypeVector 6(float) 3
+              35:             TypePointer Function 34(fvec3)
+              36:             TypeVector 8(int) 3
+              37:             TypePointer Function 36(ivec3)
+              38:             TypeFunction 34(fvec3) 35(ptr) 35(ptr) 35(ptr) 37(ptr)
+              45:             TypeMatrix 23(fvec2) 2
+              46:             TypePointer Function 45
+              47:             TypeFunction 45 46(ptr) 46(ptr) 46(ptr)
+              53:             TypeMatrix 34(fvec3) 3
+              54:             TypePointer Function 53
+              55:             TypeFunction 53 54(ptr) 54(ptr) 54(ptr)
+              61:             TypeVector 6(float) 4
+              62:             TypeMatrix 61(fvec4) 4
+              63:             TypePointer Function 62
+              64:             TypeFunction 62 63(ptr) 63(ptr) 63(ptr)
+              70:    6(float) Constant 0
+              75:    6(float) Constant 1065353216
+              76:    6(float) Constant 1073741824
+              77:   23(fvec2) ConstantComposite 75 76
+              80:    6(float) Constant 1077936128
+              81:   34(fvec3) ConstantComposite 75 76 80
+              84:    6(float) Constant 1082130432
+              85:   61(fvec4) ConstantComposite 75 76 80 84
+              87:   23(fvec2) ConstantComposite 76 76
+              88:          45 ConstantComposite 87 87
+              91:   34(fvec3) ConstantComposite 80 80 80
+              92:          53 ConstantComposite 91 91 91
+              95:   61(fvec4) ConstantComposite 84 84 84 84
+              96:          62 ConstantComposite 95 95 95 95
+              99:             TypeInt 32 0
+             100:             TypePointer Private 99(int)
+      101(gs_ua):    100(ptr) Variable Private
+      102(gs_ub):    100(ptr) Variable Private
+      103(gs_uc):    100(ptr) Variable Private
+             104:             TypeVector 99(int) 2
+             105:             TypePointer Private 104(ivec2)
+     106(gs_ua2):    105(ptr) Variable Private
+     107(gs_ub2):    105(ptr) Variable Private
+     108(gs_uc2):    105(ptr) Variable Private
+             109:             TypeVector 99(int) 3
+             110:             TypePointer Private 109(ivec3)
+     111(gs_ua3):    110(ptr) Variable Private
+     112(gs_ub3):    110(ptr) Variable Private
+     113(gs_uc3):    110(ptr) Variable Private
+             114:             TypeVector 99(int) 4
+             115:             TypePointer Private 114(ivec4)
+     116(gs_ua4):    115(ptr) Variable Private
+     117(gs_ub4):    115(ptr) Variable Private
+     118(gs_uc4):    115(ptr) Variable Private
+4(VertexShaderFunction):           2 Function None 3
+               5:             Label
+                              ReturnValue 85
+                              FunctionEnd
+15(VertexShaderFunctionS(f1;f1;f1;i1;):    6(float) Function None 10
+        11(inF0):      7(ptr) FunctionParameter
+        12(inF1):      7(ptr) FunctionParameter
+        13(inF2):      7(ptr) FunctionParameter
+        14(inI0):      9(ptr) FunctionParameter
+              16:             Label
+                              ReturnValue 70
+                              FunctionEnd
+21(VertexShaderFunction1(vf1;vf1;vf1;vi1;):    6(float) Function None 10
+        17(inF0):      7(ptr) FunctionParameter
+        18(inF1):      7(ptr) FunctionParameter
+        19(inF2):      7(ptr) FunctionParameter
+        20(inI0):      9(ptr) FunctionParameter
+              22:             Label
+                              ReturnValue 70
+                              FunctionEnd
+32(VertexShaderFunction2(vf2;vf2;vf2;vi2;):   23(fvec2) Function None 27
+        28(inF0):     24(ptr) FunctionParameter
+        29(inF1):     24(ptr) FunctionParameter
+        30(inF2):     24(ptr) FunctionParameter
+        31(inI0):     26(ptr) FunctionParameter
+              33:             Label
+                              ReturnValue 77
+                              FunctionEnd
+43(VertexShaderFunction3(vf3;vf3;vf3;vi3;):   34(fvec3) Function None 38
+        39(inF0):     35(ptr) FunctionParameter
+        40(inF1):     35(ptr) FunctionParameter
+        41(inF2):     35(ptr) FunctionParameter
+        42(inI0):     37(ptr) FunctionParameter
+              44:             Label
+                              ReturnValue 81
+                              FunctionEnd
+51(VertexShaderFunction2x2(mf22;mf22;mf22;):          45 Function None 47
+        48(inF0):     46(ptr) FunctionParameter
+        49(inF1):     46(ptr) FunctionParameter
+        50(inF2):     46(ptr) FunctionParameter
+              52:             Label
+                              ReturnValue 88
+                              FunctionEnd
+59(VertexShaderFunction3x3(mf33;mf33;mf33;):          53 Function None 55
+        56(inF0):     54(ptr) FunctionParameter
+        57(inF1):     54(ptr) FunctionParameter
+        58(inF2):     54(ptr) FunctionParameter
+              60:             Label
+                              ReturnValue 92
+                              FunctionEnd
+68(VertexShaderFunction4x4(mf44;mf44;mf44;):          62 Function None 64
+        65(inF0):     63(ptr) FunctionParameter
+        66(inF1):     63(ptr) FunctionParameter
+        67(inF2):     63(ptr) FunctionParameter
+              69:             Label
+                              ReturnValue 96
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.promotions.frag.out b/Test/baseResults/hlsl.promotions.frag.out
new file mode 100644
index 0000000..c92b61f
--- /dev/null
+++ b/Test/baseResults/hlsl.promotions.frag.out
@@ -0,0 +1,1688 @@
+hlsl.promotions.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:20  Function Definition: Fn_F3(vf3; (global void)
+0:19    Function Parameters: 
+0:19      'x' (in 3-component vector of float)
+0:21  Function Definition: Fn_I3(vi3; (global void)
+0:20    Function Parameters: 
+0:20      'x' (in 3-component vector of int)
+0:22  Function Definition: Fn_U3(vu3; (global void)
+0:21    Function Parameters: 
+0:21      'x' (in 3-component vector of uint)
+0:23  Function Definition: Fn_B3(vb3; (global void)
+0:22    Function Parameters: 
+0:22      'x' (in 3-component vector of bool)
+0:26  Function Definition: Fn_D3(vd3; (global void)
+0:23    Function Parameters: 
+0:23      'x' (in 3-component vector of double)
+0:27  Function Definition: Fn_R_F3I(vf3; (global 3-component vector of float)
+0:26    Function Parameters: 
+0:26      'p' (out 3-component vector of float)
+0:?     Sequence
+0:26      move second child to first child (temp 3-component vector of float)
+0:26        'p' (out 3-component vector of float)
+0:26        Convert int to float (temp 3-component vector of float)
+0:26          'i3' (uniform 3-component vector of int)
+0:26      Branch: Return with expression
+0:26        Convert int to float (temp 3-component vector of float)
+0:26          'i3' (uniform 3-component vector of int)
+0:28  Function Definition: Fn_R_F3U(vf3; (global 3-component vector of float)
+0:27    Function Parameters: 
+0:27      'p' (out 3-component vector of float)
+0:?     Sequence
+0:27      move second child to first child (temp 3-component vector of float)
+0:27        'p' (out 3-component vector of float)
+0:27        Convert uint to float (temp 3-component vector of float)
+0:27          'u3' (uniform 3-component vector of uint)
+0:27      Branch: Return with expression
+0:27        Convert uint to float (temp 3-component vector of float)
+0:27          'u3' (uniform 3-component vector of uint)
+0:29  Function Definition: Fn_R_F3B(vf3; (global 3-component vector of float)
+0:28    Function Parameters: 
+0:28      'p' (out 3-component vector of float)
+0:?     Sequence
+0:28      move second child to first child (temp 3-component vector of float)
+0:28        'p' (out 3-component vector of float)
+0:28        Convert bool to float (temp 3-component vector of float)
+0:28          'b3' (uniform 3-component vector of bool)
+0:28      Branch: Return with expression
+0:28        Convert bool to float (temp 3-component vector of float)
+0:28          'b3' (uniform 3-component vector of bool)
+0:31  Function Definition: Fn_R_F3D(vf3; (global 3-component vector of float)
+0:29    Function Parameters: 
+0:29      'p' (out 3-component vector of float)
+0:?     Sequence
+0:29      move second child to first child (temp 3-component vector of float)
+0:29        'p' (out 3-component vector of float)
+0:29        Convert double to float (temp 3-component vector of float)
+0:29          'd3' (uniform 3-component vector of double)
+0:29      Branch: Return with expression
+0:29        Convert double to float (temp 3-component vector of float)
+0:29          'd3' (uniform 3-component vector of double)
+0:32  Function Definition: Fn_R_I3U(vi3; (global 3-component vector of int)
+0:31    Function Parameters: 
+0:31      'p' (out 3-component vector of int)
+0:?     Sequence
+0:31      move second child to first child (temp 3-component vector of int)
+0:31        'p' (out 3-component vector of int)
+0:31        Convert uint to int (temp 3-component vector of int)
+0:31          'u3' (uniform 3-component vector of uint)
+0:31      Branch: Return with expression
+0:31        Convert uint to int (temp 3-component vector of int)
+0:31          'u3' (uniform 3-component vector of uint)
+0:33  Function Definition: Fn_R_I3B(vi3; (global 3-component vector of int)
+0:32    Function Parameters: 
+0:32      'p' (out 3-component vector of int)
+0:?     Sequence
+0:32      move second child to first child (temp 3-component vector of int)
+0:32        'p' (out 3-component vector of int)
+0:32        Convert bool to int (temp 3-component vector of int)
+0:32          'b3' (uniform 3-component vector of bool)
+0:32      Branch: Return with expression
+0:32        Convert bool to int (temp 3-component vector of int)
+0:32          'b3' (uniform 3-component vector of bool)
+0:34  Function Definition: Fn_R_I3F(vi3; (global 3-component vector of int)
+0:33    Function Parameters: 
+0:33      'p' (out 3-component vector of int)
+0:?     Sequence
+0:33      move second child to first child (temp 3-component vector of int)
+0:33        'p' (out 3-component vector of int)
+0:33        Convert float to int (temp 3-component vector of int)
+0:33          'f3' (uniform 3-component vector of float)
+0:33      Branch: Return with expression
+0:33        Convert float to int (temp 3-component vector of int)
+0:33          'f3' (uniform 3-component vector of float)
+0:36  Function Definition: Fn_R_I3D(vi3; (global 3-component vector of int)
+0:34    Function Parameters: 
+0:34      'p' (out 3-component vector of int)
+0:?     Sequence
+0:34      move second child to first child (temp 3-component vector of int)
+0:34        'p' (out 3-component vector of int)
+0:34        Convert double to int (temp 3-component vector of int)
+0:34          'd3' (uniform 3-component vector of double)
+0:34      Branch: Return with expression
+0:34        Convert double to int (temp 3-component vector of int)
+0:34          'd3' (uniform 3-component vector of double)
+0:37  Function Definition: Fn_R_U3I(vu3; (global 3-component vector of uint)
+0:36    Function Parameters: 
+0:36      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:36      move second child to first child (temp 3-component vector of uint)
+0:36        'p' (out 3-component vector of uint)
+0:36        Convert int to uint (temp 3-component vector of uint)
+0:36          'i3' (uniform 3-component vector of int)
+0:36      Branch: Return with expression
+0:36        Convert int to uint (temp 3-component vector of uint)
+0:36          'i3' (uniform 3-component vector of int)
+0:38  Function Definition: Fn_R_U3F(vu3; (global 3-component vector of uint)
+0:37    Function Parameters: 
+0:37      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:37      move second child to first child (temp 3-component vector of uint)
+0:37        'p' (out 3-component vector of uint)
+0:37        Convert float to uint (temp 3-component vector of uint)
+0:37          'f3' (uniform 3-component vector of float)
+0:37      Branch: Return with expression
+0:37        Convert float to uint (temp 3-component vector of uint)
+0:37          'f3' (uniform 3-component vector of float)
+0:39  Function Definition: Fn_R_U3B(vu3; (global 3-component vector of uint)
+0:38    Function Parameters: 
+0:38      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:38      move second child to first child (temp 3-component vector of uint)
+0:38        'p' (out 3-component vector of uint)
+0:38        Convert bool to uint (temp 3-component vector of uint)
+0:38          'b3' (uniform 3-component vector of bool)
+0:38      Branch: Return with expression
+0:38        Convert bool to uint (temp 3-component vector of uint)
+0:38          'b3' (uniform 3-component vector of bool)
+0:41  Function Definition: Fn_R_U3D(vu3; (global 3-component vector of uint)
+0:39    Function Parameters: 
+0:39      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:39      move second child to first child (temp 3-component vector of uint)
+0:39        'p' (out 3-component vector of uint)
+0:39        Convert double to uint (temp 3-component vector of uint)
+0:39          'd3' (uniform 3-component vector of double)
+0:39      Branch: Return with expression
+0:39        Convert double to uint (temp 3-component vector of uint)
+0:39          'd3' (uniform 3-component vector of double)
+0:42  Function Definition: Fn_R_B3I(vb3; (global 3-component vector of bool)
+0:41    Function Parameters: 
+0:41      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:41      move second child to first child (temp 3-component vector of bool)
+0:41        'p' (out 3-component vector of bool)
+0:41        Convert int to bool (temp 3-component vector of bool)
+0:41          'i3' (uniform 3-component vector of int)
+0:41      Branch: Return with expression
+0:41        Convert int to bool (temp 3-component vector of bool)
+0:41          'i3' (uniform 3-component vector of int)
+0:43  Function Definition: Fn_R_B3U(vb3; (global 3-component vector of bool)
+0:42    Function Parameters: 
+0:42      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:42      move second child to first child (temp 3-component vector of bool)
+0:42        'p' (out 3-component vector of bool)
+0:42        Convert uint to bool (temp 3-component vector of bool)
+0:42          'u3' (uniform 3-component vector of uint)
+0:42      Branch: Return with expression
+0:42        Convert uint to bool (temp 3-component vector of bool)
+0:42          'u3' (uniform 3-component vector of uint)
+0:44  Function Definition: Fn_R_B3F(vb3; (global 3-component vector of bool)
+0:43    Function Parameters: 
+0:43      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:43      move second child to first child (temp 3-component vector of bool)
+0:43        'p' (out 3-component vector of bool)
+0:43        Convert float to bool (temp 3-component vector of bool)
+0:43          'f3' (uniform 3-component vector of float)
+0:43      Branch: Return with expression
+0:43        Convert float to bool (temp 3-component vector of bool)
+0:43          'f3' (uniform 3-component vector of float)
+0:46  Function Definition: Fn_R_B3D(vb3; (global 3-component vector of bool)
+0:44    Function Parameters: 
+0:44      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:44      move second child to first child (temp 3-component vector of bool)
+0:44        'p' (out 3-component vector of bool)
+0:44        Convert double to bool (temp 3-component vector of bool)
+0:44          'd3' (uniform 3-component vector of double)
+0:44      Branch: Return with expression
+0:44        Convert double to bool (temp 3-component vector of bool)
+0:44          'd3' (uniform 3-component vector of double)
+0:47  Function Definition: Fn_R_D3I(vd3; (global 3-component vector of double)
+0:46    Function Parameters: 
+0:46      'p' (out 3-component vector of double)
+0:?     Sequence
+0:46      move second child to first child (temp 3-component vector of double)
+0:46        'p' (out 3-component vector of double)
+0:46        Convert int to double (temp 3-component vector of double)
+0:46          'i3' (uniform 3-component vector of int)
+0:46      Branch: Return with expression
+0:46        Convert int to double (temp 3-component vector of double)
+0:46          'i3' (uniform 3-component vector of int)
+0:48  Function Definition: Fn_R_D3U(vd3; (global 3-component vector of double)
+0:47    Function Parameters: 
+0:47      'p' (out 3-component vector of double)
+0:?     Sequence
+0:47      move second child to first child (temp 3-component vector of double)
+0:47        'p' (out 3-component vector of double)
+0:47        Convert uint to double (temp 3-component vector of double)
+0:47          'u3' (uniform 3-component vector of uint)
+0:47      Branch: Return with expression
+0:47        Convert uint to double (temp 3-component vector of double)
+0:47          'u3' (uniform 3-component vector of uint)
+0:49  Function Definition: Fn_R_D3B(vd3; (global 3-component vector of double)
+0:48    Function Parameters: 
+0:48      'p' (out 3-component vector of double)
+0:?     Sequence
+0:48      move second child to first child (temp 3-component vector of double)
+0:48        'p' (out 3-component vector of double)
+0:48        Convert bool to double (temp 3-component vector of double)
+0:48          'b3' (uniform 3-component vector of bool)
+0:48      Branch: Return with expression
+0:48        Convert bool to double (temp 3-component vector of double)
+0:48          'b3' (uniform 3-component vector of bool)
+0:51  Function Definition: Fn_R_D3F(vd3; (global 3-component vector of double)
+0:49    Function Parameters: 
+0:49      'p' (out 3-component vector of double)
+0:?     Sequence
+0:49      move second child to first child (temp 3-component vector of double)
+0:49        'p' (out 3-component vector of double)
+0:49        Convert float to double (temp 3-component vector of double)
+0:49          'f3' (uniform 3-component vector of float)
+0:49      Branch: Return with expression
+0:49        Convert float to double (temp 3-component vector of double)
+0:49          'f3' (uniform 3-component vector of float)
+0:202  Function Definition: main( (global structure{temp 4-component vector of float Color})
+0:52    Function Parameters: 
+0:?     Sequence
+0:54      Sequence
+0:54        move second child to first child (temp 3-component vector of float)
+0:54          'r00' (temp 3-component vector of float)
+0:54          Convert int to float (temp 3-component vector of float)
+0:54            'i3' (uniform 3-component vector of int)
+0:55      Sequence
+0:55        move second child to first child (temp 3-component vector of float)
+0:55          'r01' (temp 3-component vector of float)
+0:55          Convert bool to float (temp 3-component vector of float)
+0:55            'b3' (uniform 3-component vector of bool)
+0:56      Sequence
+0:56        move second child to first child (temp 3-component vector of float)
+0:56          'r02' (temp 3-component vector of float)
+0:56          Convert uint to float (temp 3-component vector of float)
+0:56            'u3' (uniform 3-component vector of uint)
+0:57      Sequence
+0:57        move second child to first child (temp 3-component vector of float)
+0:57          'r03' (temp 3-component vector of float)
+0:57          Convert double to float (temp 3-component vector of float)
+0:57            'd3' (uniform 3-component vector of double)
+0:59      Sequence
+0:59        move second child to first child (temp 3-component vector of int)
+0:59          'r10' (temp 3-component vector of int)
+0:59          Convert bool to int (temp 3-component vector of int)
+0:59            'b3' (uniform 3-component vector of bool)
+0:60      Sequence
+0:60        move second child to first child (temp 3-component vector of int)
+0:60          'r11' (temp 3-component vector of int)
+0:60          Convert uint to int (temp 3-component vector of int)
+0:60            'u3' (uniform 3-component vector of uint)
+0:61      Sequence
+0:61        move second child to first child (temp 3-component vector of int)
+0:61          'r12' (temp 3-component vector of int)
+0:61          Convert float to int (temp 3-component vector of int)
+0:61            'f3' (uniform 3-component vector of float)
+0:62      Sequence
+0:62        move second child to first child (temp 3-component vector of int)
+0:62          'r13' (temp 3-component vector of int)
+0:62          Convert double to int (temp 3-component vector of int)
+0:62            'd3' (uniform 3-component vector of double)
+0:64      Sequence
+0:64        move second child to first child (temp 3-component vector of uint)
+0:64          'r20' (temp 3-component vector of uint)
+0:64          Convert bool to uint (temp 3-component vector of uint)
+0:64            'b3' (uniform 3-component vector of bool)
+0:65      Sequence
+0:65        move second child to first child (temp 3-component vector of uint)
+0:65          'r21' (temp 3-component vector of uint)
+0:65          Convert int to uint (temp 3-component vector of uint)
+0:65            'i3' (uniform 3-component vector of int)
+0:66      Sequence
+0:66        move second child to first child (temp 3-component vector of uint)
+0:66          'r22' (temp 3-component vector of uint)
+0:66          Convert float to uint (temp 3-component vector of uint)
+0:66            'f3' (uniform 3-component vector of float)
+0:67      Sequence
+0:67        move second child to first child (temp 3-component vector of uint)
+0:67          'r23' (temp 3-component vector of uint)
+0:67          Convert double to uint (temp 3-component vector of uint)
+0:67            'd3' (uniform 3-component vector of double)
+0:69      Sequence
+0:69        move second child to first child (temp 3-component vector of bool)
+0:69          'r30' (temp 3-component vector of bool)
+0:69          Convert int to bool (temp 3-component vector of bool)
+0:69            'i3' (uniform 3-component vector of int)
+0:70      Sequence
+0:70        move second child to first child (temp 3-component vector of bool)
+0:70          'r31' (temp 3-component vector of bool)
+0:70          Convert uint to bool (temp 3-component vector of bool)
+0:70            'u3' (uniform 3-component vector of uint)
+0:71      Sequence
+0:71        move second child to first child (temp 3-component vector of bool)
+0:71          'r32' (temp 3-component vector of bool)
+0:71          Convert float to bool (temp 3-component vector of bool)
+0:71            'f3' (uniform 3-component vector of float)
+0:72      Sequence
+0:72        move second child to first child (temp 3-component vector of bool)
+0:72          'r33' (temp 3-component vector of bool)
+0:72          Convert double to bool (temp 3-component vector of bool)
+0:72            'd3' (uniform 3-component vector of double)
+0:74      Sequence
+0:74        move second child to first child (temp 3-component vector of double)
+0:74          'r40' (temp 3-component vector of double)
+0:74          Convert int to double (temp 3-component vector of double)
+0:74            'i3' (uniform 3-component vector of int)
+0:75      Sequence
+0:75        move second child to first child (temp 3-component vector of double)
+0:75          'r41' (temp 3-component vector of double)
+0:75          Convert uint to double (temp 3-component vector of double)
+0:75            'u3' (uniform 3-component vector of uint)
+0:76      Sequence
+0:76        move second child to first child (temp 3-component vector of double)
+0:76          'r42' (temp 3-component vector of double)
+0:76          Convert float to double (temp 3-component vector of double)
+0:76            'f3' (uniform 3-component vector of float)
+0:77      Sequence
+0:77        move second child to first child (temp 3-component vector of double)
+0:77          'r43' (temp 3-component vector of double)
+0:77          Convert bool to double (temp 3-component vector of double)
+0:77            'b3' (uniform 3-component vector of bool)
+0:80      multiply second child into first child (temp 3-component vector of float)
+0:80        'r00' (temp 3-component vector of float)
+0:80        Convert int to float (temp 3-component vector of float)
+0:80          'i3' (uniform 3-component vector of int)
+0:81      multiply second child into first child (temp 3-component vector of float)
+0:81        'r01' (temp 3-component vector of float)
+0:81        Convert bool to float (temp 3-component vector of float)
+0:81          'b3' (uniform 3-component vector of bool)
+0:82      multiply second child into first child (temp 3-component vector of float)
+0:82        'r02' (temp 3-component vector of float)
+0:82        Convert uint to float (temp 3-component vector of float)
+0:82          'u3' (uniform 3-component vector of uint)
+0:83      multiply second child into first child (temp 3-component vector of float)
+0:83        'r03' (temp 3-component vector of float)
+0:83        Convert double to float (temp 3-component vector of float)
+0:83          'd3' (uniform 3-component vector of double)
+0:85      multiply second child into first child (temp 3-component vector of int)
+0:85        'r10' (temp 3-component vector of int)
+0:85        Convert bool to int (temp 3-component vector of int)
+0:85          'b3' (uniform 3-component vector of bool)
+0:86      multiply second child into first child (temp 3-component vector of int)
+0:86        'r11' (temp 3-component vector of int)
+0:86        Convert uint to int (temp 3-component vector of int)
+0:86          'u3' (uniform 3-component vector of uint)
+0:87      multiply second child into first child (temp 3-component vector of int)
+0:87        'r12' (temp 3-component vector of int)
+0:87        Convert float to int (temp 3-component vector of int)
+0:87          'f3' (uniform 3-component vector of float)
+0:88      multiply second child into first child (temp 3-component vector of int)
+0:88        'r13' (temp 3-component vector of int)
+0:88        Convert double to int (temp 3-component vector of int)
+0:88          'd3' (uniform 3-component vector of double)
+0:90      multiply second child into first child (temp 3-component vector of uint)
+0:90        'r20' (temp 3-component vector of uint)
+0:90        Convert bool to uint (temp 3-component vector of uint)
+0:90          'b3' (uniform 3-component vector of bool)
+0:91      multiply second child into first child (temp 3-component vector of uint)
+0:91        'r21' (temp 3-component vector of uint)
+0:91        Convert int to uint (temp 3-component vector of uint)
+0:91          'i3' (uniform 3-component vector of int)
+0:92      multiply second child into first child (temp 3-component vector of uint)
+0:92        'r22' (temp 3-component vector of uint)
+0:92        Convert float to uint (temp 3-component vector of uint)
+0:92          'f3' (uniform 3-component vector of float)
+0:93      multiply second child into first child (temp 3-component vector of uint)
+0:93        'r23' (temp 3-component vector of uint)
+0:93        Convert double to uint (temp 3-component vector of uint)
+0:93          'd3' (uniform 3-component vector of double)
+0:97      multiply second child into first child (temp 3-component vector of double)
+0:97        'r40' (temp 3-component vector of double)
+0:97        Convert int to double (temp 3-component vector of double)
+0:97          'i3' (uniform 3-component vector of int)
+0:98      multiply second child into first child (temp 3-component vector of double)
+0:98        'r41' (temp 3-component vector of double)
+0:98        Convert uint to double (temp 3-component vector of double)
+0:98          'u3' (uniform 3-component vector of uint)
+0:99      multiply second child into first child (temp 3-component vector of double)
+0:99        'r42' (temp 3-component vector of double)
+0:99        Convert float to double (temp 3-component vector of double)
+0:99          'f3' (uniform 3-component vector of float)
+0:100      multiply second child into first child (temp 3-component vector of double)
+0:100        'r43' (temp 3-component vector of double)
+0:100        Convert bool to double (temp 3-component vector of double)
+0:100          'b3' (uniform 3-component vector of bool)
+0:103      vector scale second child into first child (temp 3-component vector of float)
+0:103        'r00' (temp 3-component vector of float)
+0:103        Convert int to float (temp float)
+0:103          'is' (uniform int)
+0:104      vector scale second child into first child (temp 3-component vector of float)
+0:104        'r01' (temp 3-component vector of float)
+0:104        Convert bool to float (temp float)
+0:104          'bs' (uniform bool)
+0:105      vector scale second child into first child (temp 3-component vector of float)
+0:105        'r02' (temp 3-component vector of float)
+0:105        Convert uint to float (temp float)
+0:105          'us' (uniform uint)
+0:106      vector scale second child into first child (temp 3-component vector of float)
+0:106        'r03' (temp 3-component vector of float)
+0:106        Convert double to float (temp float)
+0:106          'ds' (uniform double)
+0:108      vector scale second child into first child (temp 3-component vector of int)
+0:108        'r10' (temp 3-component vector of int)
+0:108        Convert bool to int (temp int)
+0:108          'bs' (uniform bool)
+0:109      vector scale second child into first child (temp 3-component vector of int)
+0:109        'r11' (temp 3-component vector of int)
+0:109        Convert uint to int (temp int)
+0:109          'us' (uniform uint)
+0:110      vector scale second child into first child (temp 3-component vector of int)
+0:110        'r12' (temp 3-component vector of int)
+0:110        Convert float to int (temp int)
+0:110          'fs' (uniform float)
+0:111      vector scale second child into first child (temp 3-component vector of int)
+0:111        'r13' (temp 3-component vector of int)
+0:111        Convert double to int (temp int)
+0:111          'ds' (uniform double)
+0:113      vector scale second child into first child (temp 3-component vector of uint)
+0:113        'r20' (temp 3-component vector of uint)
+0:113        Convert bool to uint (temp uint)
+0:113          'bs' (uniform bool)
+0:114      vector scale second child into first child (temp 3-component vector of uint)
+0:114        'r21' (temp 3-component vector of uint)
+0:114        Convert int to uint (temp uint)
+0:114          'is' (uniform int)
+0:115      vector scale second child into first child (temp 3-component vector of uint)
+0:115        'r22' (temp 3-component vector of uint)
+0:115        Convert float to uint (temp uint)
+0:115          'fs' (uniform float)
+0:116      vector scale second child into first child (temp 3-component vector of uint)
+0:116        'r23' (temp 3-component vector of uint)
+0:116        Convert double to uint (temp uint)
+0:116          'ds' (uniform double)
+0:120      vector scale second child into first child (temp 3-component vector of double)
+0:120        'r40' (temp 3-component vector of double)
+0:120        Convert int to double (temp double)
+0:120          'is' (uniform int)
+0:121      vector scale second child into first child (temp 3-component vector of double)
+0:121        'r41' (temp 3-component vector of double)
+0:121        Convert uint to double (temp double)
+0:121          'us' (uniform uint)
+0:122      vector scale second child into first child (temp 3-component vector of double)
+0:122        'r42' (temp 3-component vector of double)
+0:122        Convert float to double (temp double)
+0:122          'fs' (uniform float)
+0:123      vector scale second child into first child (temp 3-component vector of double)
+0:123        'r43' (temp 3-component vector of double)
+0:123        Convert bool to double (temp double)
+0:123          'bs' (uniform bool)
+0:193      Sequence
+0:193        move second child to first child (temp int)
+0:193          'c1' (temp int)
+0:193          Constant:
+0:193            3 (const int)
+0:194      Sequence
+0:194        move second child to first child (temp int)
+0:194          'c2' (temp int)
+0:194          Constant:
+0:194            3 (const int)
+0:196      Sequence
+0:196        move second child to first child (temp 4-component vector of float)
+0:196          'outval' (temp 4-component vector of float)
+0:?           Construct vec4 (temp 4-component vector of float)
+0:196            Constant:
+0:196              3.600000
+0:196            Constant:
+0:196              3.600000
+0:196            Convert int to float (temp float)
+0:196              'c1' (temp int)
+0:196            Convert int to float (temp float)
+0:196              'c2' (temp int)
+0:199      move second child to first child (temp 4-component vector of float)
+0:199        Color: direct index for structure (temp 4-component vector of float)
+0:199          'psout' (temp structure{temp 4-component vector of float Color})
+0:199          Constant:
+0:199            0 (const int)
+0:199        'outval' (temp 4-component vector of float)
+0:200      Branch: Return with expression
+0:200        'psout' (temp structure{temp 4-component vector of float Color})
+0:?   Linker Objects
+0:?     'i3' (uniform 3-component vector of int)
+0:?     'b3' (uniform 3-component vector of bool)
+0:?     'f3' (uniform 3-component vector of float)
+0:?     'u3' (uniform 3-component vector of uint)
+0:?     'd3' (uniform 3-component vector of double)
+0:?     'is' (uniform int)
+0:?     'bs' (uniform bool)
+0:?     'fs' (uniform float)
+0:?     'us' (uniform uint)
+0:?     'ds' (uniform double)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:20  Function Definition: Fn_F3(vf3; (global void)
+0:19    Function Parameters: 
+0:19      'x' (in 3-component vector of float)
+0:21  Function Definition: Fn_I3(vi3; (global void)
+0:20    Function Parameters: 
+0:20      'x' (in 3-component vector of int)
+0:22  Function Definition: Fn_U3(vu3; (global void)
+0:21    Function Parameters: 
+0:21      'x' (in 3-component vector of uint)
+0:23  Function Definition: Fn_B3(vb3; (global void)
+0:22    Function Parameters: 
+0:22      'x' (in 3-component vector of bool)
+0:26  Function Definition: Fn_D3(vd3; (global void)
+0:23    Function Parameters: 
+0:23      'x' (in 3-component vector of double)
+0:27  Function Definition: Fn_R_F3I(vf3; (global 3-component vector of float)
+0:26    Function Parameters: 
+0:26      'p' (out 3-component vector of float)
+0:?     Sequence
+0:26      move second child to first child (temp 3-component vector of float)
+0:26        'p' (out 3-component vector of float)
+0:26        Convert int to float (temp 3-component vector of float)
+0:26          'i3' (uniform 3-component vector of int)
+0:26      Branch: Return with expression
+0:26        Convert int to float (temp 3-component vector of float)
+0:26          'i3' (uniform 3-component vector of int)
+0:28  Function Definition: Fn_R_F3U(vf3; (global 3-component vector of float)
+0:27    Function Parameters: 
+0:27      'p' (out 3-component vector of float)
+0:?     Sequence
+0:27      move second child to first child (temp 3-component vector of float)
+0:27        'p' (out 3-component vector of float)
+0:27        Convert uint to float (temp 3-component vector of float)
+0:27          'u3' (uniform 3-component vector of uint)
+0:27      Branch: Return with expression
+0:27        Convert uint to float (temp 3-component vector of float)
+0:27          'u3' (uniform 3-component vector of uint)
+0:29  Function Definition: Fn_R_F3B(vf3; (global 3-component vector of float)
+0:28    Function Parameters: 
+0:28      'p' (out 3-component vector of float)
+0:?     Sequence
+0:28      move second child to first child (temp 3-component vector of float)
+0:28        'p' (out 3-component vector of float)
+0:28        Convert bool to float (temp 3-component vector of float)
+0:28          'b3' (uniform 3-component vector of bool)
+0:28      Branch: Return with expression
+0:28        Convert bool to float (temp 3-component vector of float)
+0:28          'b3' (uniform 3-component vector of bool)
+0:31  Function Definition: Fn_R_F3D(vf3; (global 3-component vector of float)
+0:29    Function Parameters: 
+0:29      'p' (out 3-component vector of float)
+0:?     Sequence
+0:29      move second child to first child (temp 3-component vector of float)
+0:29        'p' (out 3-component vector of float)
+0:29        Convert double to float (temp 3-component vector of float)
+0:29          'd3' (uniform 3-component vector of double)
+0:29      Branch: Return with expression
+0:29        Convert double to float (temp 3-component vector of float)
+0:29          'd3' (uniform 3-component vector of double)
+0:32  Function Definition: Fn_R_I3U(vi3; (global 3-component vector of int)
+0:31    Function Parameters: 
+0:31      'p' (out 3-component vector of int)
+0:?     Sequence
+0:31      move second child to first child (temp 3-component vector of int)
+0:31        'p' (out 3-component vector of int)
+0:31        Convert uint to int (temp 3-component vector of int)
+0:31          'u3' (uniform 3-component vector of uint)
+0:31      Branch: Return with expression
+0:31        Convert uint to int (temp 3-component vector of int)
+0:31          'u3' (uniform 3-component vector of uint)
+0:33  Function Definition: Fn_R_I3B(vi3; (global 3-component vector of int)
+0:32    Function Parameters: 
+0:32      'p' (out 3-component vector of int)
+0:?     Sequence
+0:32      move second child to first child (temp 3-component vector of int)
+0:32        'p' (out 3-component vector of int)
+0:32        Convert bool to int (temp 3-component vector of int)
+0:32          'b3' (uniform 3-component vector of bool)
+0:32      Branch: Return with expression
+0:32        Convert bool to int (temp 3-component vector of int)
+0:32          'b3' (uniform 3-component vector of bool)
+0:34  Function Definition: Fn_R_I3F(vi3; (global 3-component vector of int)
+0:33    Function Parameters: 
+0:33      'p' (out 3-component vector of int)
+0:?     Sequence
+0:33      move second child to first child (temp 3-component vector of int)
+0:33        'p' (out 3-component vector of int)
+0:33        Convert float to int (temp 3-component vector of int)
+0:33          'f3' (uniform 3-component vector of float)
+0:33      Branch: Return with expression
+0:33        Convert float to int (temp 3-component vector of int)
+0:33          'f3' (uniform 3-component vector of float)
+0:36  Function Definition: Fn_R_I3D(vi3; (global 3-component vector of int)
+0:34    Function Parameters: 
+0:34      'p' (out 3-component vector of int)
+0:?     Sequence
+0:34      move second child to first child (temp 3-component vector of int)
+0:34        'p' (out 3-component vector of int)
+0:34        Convert double to int (temp 3-component vector of int)
+0:34          'd3' (uniform 3-component vector of double)
+0:34      Branch: Return with expression
+0:34        Convert double to int (temp 3-component vector of int)
+0:34          'd3' (uniform 3-component vector of double)
+0:37  Function Definition: Fn_R_U3I(vu3; (global 3-component vector of uint)
+0:36    Function Parameters: 
+0:36      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:36      move second child to first child (temp 3-component vector of uint)
+0:36        'p' (out 3-component vector of uint)
+0:36        Convert int to uint (temp 3-component vector of uint)
+0:36          'i3' (uniform 3-component vector of int)
+0:36      Branch: Return with expression
+0:36        Convert int to uint (temp 3-component vector of uint)
+0:36          'i3' (uniform 3-component vector of int)
+0:38  Function Definition: Fn_R_U3F(vu3; (global 3-component vector of uint)
+0:37    Function Parameters: 
+0:37      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:37      move second child to first child (temp 3-component vector of uint)
+0:37        'p' (out 3-component vector of uint)
+0:37        Convert float to uint (temp 3-component vector of uint)
+0:37          'f3' (uniform 3-component vector of float)
+0:37      Branch: Return with expression
+0:37        Convert float to uint (temp 3-component vector of uint)
+0:37          'f3' (uniform 3-component vector of float)
+0:39  Function Definition: Fn_R_U3B(vu3; (global 3-component vector of uint)
+0:38    Function Parameters: 
+0:38      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:38      move second child to first child (temp 3-component vector of uint)
+0:38        'p' (out 3-component vector of uint)
+0:38        Convert bool to uint (temp 3-component vector of uint)
+0:38          'b3' (uniform 3-component vector of bool)
+0:38      Branch: Return with expression
+0:38        Convert bool to uint (temp 3-component vector of uint)
+0:38          'b3' (uniform 3-component vector of bool)
+0:41  Function Definition: Fn_R_U3D(vu3; (global 3-component vector of uint)
+0:39    Function Parameters: 
+0:39      'p' (out 3-component vector of uint)
+0:?     Sequence
+0:39      move second child to first child (temp 3-component vector of uint)
+0:39        'p' (out 3-component vector of uint)
+0:39        Convert double to uint (temp 3-component vector of uint)
+0:39          'd3' (uniform 3-component vector of double)
+0:39      Branch: Return with expression
+0:39        Convert double to uint (temp 3-component vector of uint)
+0:39          'd3' (uniform 3-component vector of double)
+0:42  Function Definition: Fn_R_B3I(vb3; (global 3-component vector of bool)
+0:41    Function Parameters: 
+0:41      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:41      move second child to first child (temp 3-component vector of bool)
+0:41        'p' (out 3-component vector of bool)
+0:41        Convert int to bool (temp 3-component vector of bool)
+0:41          'i3' (uniform 3-component vector of int)
+0:41      Branch: Return with expression
+0:41        Convert int to bool (temp 3-component vector of bool)
+0:41          'i3' (uniform 3-component vector of int)
+0:43  Function Definition: Fn_R_B3U(vb3; (global 3-component vector of bool)
+0:42    Function Parameters: 
+0:42      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:42      move second child to first child (temp 3-component vector of bool)
+0:42        'p' (out 3-component vector of bool)
+0:42        Convert uint to bool (temp 3-component vector of bool)
+0:42          'u3' (uniform 3-component vector of uint)
+0:42      Branch: Return with expression
+0:42        Convert uint to bool (temp 3-component vector of bool)
+0:42          'u3' (uniform 3-component vector of uint)
+0:44  Function Definition: Fn_R_B3F(vb3; (global 3-component vector of bool)
+0:43    Function Parameters: 
+0:43      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:43      move second child to first child (temp 3-component vector of bool)
+0:43        'p' (out 3-component vector of bool)
+0:43        Convert float to bool (temp 3-component vector of bool)
+0:43          'f3' (uniform 3-component vector of float)
+0:43      Branch: Return with expression
+0:43        Convert float to bool (temp 3-component vector of bool)
+0:43          'f3' (uniform 3-component vector of float)
+0:46  Function Definition: Fn_R_B3D(vb3; (global 3-component vector of bool)
+0:44    Function Parameters: 
+0:44      'p' (out 3-component vector of bool)
+0:?     Sequence
+0:44      move second child to first child (temp 3-component vector of bool)
+0:44        'p' (out 3-component vector of bool)
+0:44        Convert double to bool (temp 3-component vector of bool)
+0:44          'd3' (uniform 3-component vector of double)
+0:44      Branch: Return with expression
+0:44        Convert double to bool (temp 3-component vector of bool)
+0:44          'd3' (uniform 3-component vector of double)
+0:47  Function Definition: Fn_R_D3I(vd3; (global 3-component vector of double)
+0:46    Function Parameters: 
+0:46      'p' (out 3-component vector of double)
+0:?     Sequence
+0:46      move second child to first child (temp 3-component vector of double)
+0:46        'p' (out 3-component vector of double)
+0:46        Convert int to double (temp 3-component vector of double)
+0:46          'i3' (uniform 3-component vector of int)
+0:46      Branch: Return with expression
+0:46        Convert int to double (temp 3-component vector of double)
+0:46          'i3' (uniform 3-component vector of int)
+0:48  Function Definition: Fn_R_D3U(vd3; (global 3-component vector of double)
+0:47    Function Parameters: 
+0:47      'p' (out 3-component vector of double)
+0:?     Sequence
+0:47      move second child to first child (temp 3-component vector of double)
+0:47        'p' (out 3-component vector of double)
+0:47        Convert uint to double (temp 3-component vector of double)
+0:47          'u3' (uniform 3-component vector of uint)
+0:47      Branch: Return with expression
+0:47        Convert uint to double (temp 3-component vector of double)
+0:47          'u3' (uniform 3-component vector of uint)
+0:49  Function Definition: Fn_R_D3B(vd3; (global 3-component vector of double)
+0:48    Function Parameters: 
+0:48      'p' (out 3-component vector of double)
+0:?     Sequence
+0:48      move second child to first child (temp 3-component vector of double)
+0:48        'p' (out 3-component vector of double)
+0:48        Convert bool to double (temp 3-component vector of double)
+0:48          'b3' (uniform 3-component vector of bool)
+0:48      Branch: Return with expression
+0:48        Convert bool to double (temp 3-component vector of double)
+0:48          'b3' (uniform 3-component vector of bool)
+0:51  Function Definition: Fn_R_D3F(vd3; (global 3-component vector of double)
+0:49    Function Parameters: 
+0:49      'p' (out 3-component vector of double)
+0:?     Sequence
+0:49      move second child to first child (temp 3-component vector of double)
+0:49        'p' (out 3-component vector of double)
+0:49        Convert float to double (temp 3-component vector of double)
+0:49          'f3' (uniform 3-component vector of float)
+0:49      Branch: Return with expression
+0:49        Convert float to double (temp 3-component vector of double)
+0:49          'f3' (uniform 3-component vector of float)
+0:202  Function Definition: main( (global structure{temp 4-component vector of float Color})
+0:52    Function Parameters: 
+0:?     Sequence
+0:54      Sequence
+0:54        move second child to first child (temp 3-component vector of float)
+0:54          'r00' (temp 3-component vector of float)
+0:54          Convert int to float (temp 3-component vector of float)
+0:54            'i3' (uniform 3-component vector of int)
+0:55      Sequence
+0:55        move second child to first child (temp 3-component vector of float)
+0:55          'r01' (temp 3-component vector of float)
+0:55          Convert bool to float (temp 3-component vector of float)
+0:55            'b3' (uniform 3-component vector of bool)
+0:56      Sequence
+0:56        move second child to first child (temp 3-component vector of float)
+0:56          'r02' (temp 3-component vector of float)
+0:56          Convert uint to float (temp 3-component vector of float)
+0:56            'u3' (uniform 3-component vector of uint)
+0:57      Sequence
+0:57        move second child to first child (temp 3-component vector of float)
+0:57          'r03' (temp 3-component vector of float)
+0:57          Convert double to float (temp 3-component vector of float)
+0:57            'd3' (uniform 3-component vector of double)
+0:59      Sequence
+0:59        move second child to first child (temp 3-component vector of int)
+0:59          'r10' (temp 3-component vector of int)
+0:59          Convert bool to int (temp 3-component vector of int)
+0:59            'b3' (uniform 3-component vector of bool)
+0:60      Sequence
+0:60        move second child to first child (temp 3-component vector of int)
+0:60          'r11' (temp 3-component vector of int)
+0:60          Convert uint to int (temp 3-component vector of int)
+0:60            'u3' (uniform 3-component vector of uint)
+0:61      Sequence
+0:61        move second child to first child (temp 3-component vector of int)
+0:61          'r12' (temp 3-component vector of int)
+0:61          Convert float to int (temp 3-component vector of int)
+0:61            'f3' (uniform 3-component vector of float)
+0:62      Sequence
+0:62        move second child to first child (temp 3-component vector of int)
+0:62          'r13' (temp 3-component vector of int)
+0:62          Convert double to int (temp 3-component vector of int)
+0:62            'd3' (uniform 3-component vector of double)
+0:64      Sequence
+0:64        move second child to first child (temp 3-component vector of uint)
+0:64          'r20' (temp 3-component vector of uint)
+0:64          Convert bool to uint (temp 3-component vector of uint)
+0:64            'b3' (uniform 3-component vector of bool)
+0:65      Sequence
+0:65        move second child to first child (temp 3-component vector of uint)
+0:65          'r21' (temp 3-component vector of uint)
+0:65          Convert int to uint (temp 3-component vector of uint)
+0:65            'i3' (uniform 3-component vector of int)
+0:66      Sequence
+0:66        move second child to first child (temp 3-component vector of uint)
+0:66          'r22' (temp 3-component vector of uint)
+0:66          Convert float to uint (temp 3-component vector of uint)
+0:66            'f3' (uniform 3-component vector of float)
+0:67      Sequence
+0:67        move second child to first child (temp 3-component vector of uint)
+0:67          'r23' (temp 3-component vector of uint)
+0:67          Convert double to uint (temp 3-component vector of uint)
+0:67            'd3' (uniform 3-component vector of double)
+0:69      Sequence
+0:69        move second child to first child (temp 3-component vector of bool)
+0:69          'r30' (temp 3-component vector of bool)
+0:69          Convert int to bool (temp 3-component vector of bool)
+0:69            'i3' (uniform 3-component vector of int)
+0:70      Sequence
+0:70        move second child to first child (temp 3-component vector of bool)
+0:70          'r31' (temp 3-component vector of bool)
+0:70          Convert uint to bool (temp 3-component vector of bool)
+0:70            'u3' (uniform 3-component vector of uint)
+0:71      Sequence
+0:71        move second child to first child (temp 3-component vector of bool)
+0:71          'r32' (temp 3-component vector of bool)
+0:71          Convert float to bool (temp 3-component vector of bool)
+0:71            'f3' (uniform 3-component vector of float)
+0:72      Sequence
+0:72        move second child to first child (temp 3-component vector of bool)
+0:72          'r33' (temp 3-component vector of bool)
+0:72          Convert double to bool (temp 3-component vector of bool)
+0:72            'd3' (uniform 3-component vector of double)
+0:74      Sequence
+0:74        move second child to first child (temp 3-component vector of double)
+0:74          'r40' (temp 3-component vector of double)
+0:74          Convert int to double (temp 3-component vector of double)
+0:74            'i3' (uniform 3-component vector of int)
+0:75      Sequence
+0:75        move second child to first child (temp 3-component vector of double)
+0:75          'r41' (temp 3-component vector of double)
+0:75          Convert uint to double (temp 3-component vector of double)
+0:75            'u3' (uniform 3-component vector of uint)
+0:76      Sequence
+0:76        move second child to first child (temp 3-component vector of double)
+0:76          'r42' (temp 3-component vector of double)
+0:76          Convert float to double (temp 3-component vector of double)
+0:76            'f3' (uniform 3-component vector of float)
+0:77      Sequence
+0:77        move second child to first child (temp 3-component vector of double)
+0:77          'r43' (temp 3-component vector of double)
+0:77          Convert bool to double (temp 3-component vector of double)
+0:77            'b3' (uniform 3-component vector of bool)
+0:80      multiply second child into first child (temp 3-component vector of float)
+0:80        'r00' (temp 3-component vector of float)
+0:80        Convert int to float (temp 3-component vector of float)
+0:80          'i3' (uniform 3-component vector of int)
+0:81      multiply second child into first child (temp 3-component vector of float)
+0:81        'r01' (temp 3-component vector of float)
+0:81        Convert bool to float (temp 3-component vector of float)
+0:81          'b3' (uniform 3-component vector of bool)
+0:82      multiply second child into first child (temp 3-component vector of float)
+0:82        'r02' (temp 3-component vector of float)
+0:82        Convert uint to float (temp 3-component vector of float)
+0:82          'u3' (uniform 3-component vector of uint)
+0:83      multiply second child into first child (temp 3-component vector of float)
+0:83        'r03' (temp 3-component vector of float)
+0:83        Convert double to float (temp 3-component vector of float)
+0:83          'd3' (uniform 3-component vector of double)
+0:85      multiply second child into first child (temp 3-component vector of int)
+0:85        'r10' (temp 3-component vector of int)
+0:85        Convert bool to int (temp 3-component vector of int)
+0:85          'b3' (uniform 3-component vector of bool)
+0:86      multiply second child into first child (temp 3-component vector of int)
+0:86        'r11' (temp 3-component vector of int)
+0:86        Convert uint to int (temp 3-component vector of int)
+0:86          'u3' (uniform 3-component vector of uint)
+0:87      multiply second child into first child (temp 3-component vector of int)
+0:87        'r12' (temp 3-component vector of int)
+0:87        Convert float to int (temp 3-component vector of int)
+0:87          'f3' (uniform 3-component vector of float)
+0:88      multiply second child into first child (temp 3-component vector of int)
+0:88        'r13' (temp 3-component vector of int)
+0:88        Convert double to int (temp 3-component vector of int)
+0:88          'd3' (uniform 3-component vector of double)
+0:90      multiply second child into first child (temp 3-component vector of uint)
+0:90        'r20' (temp 3-component vector of uint)
+0:90        Convert bool to uint (temp 3-component vector of uint)
+0:90          'b3' (uniform 3-component vector of bool)
+0:91      multiply second child into first child (temp 3-component vector of uint)
+0:91        'r21' (temp 3-component vector of uint)
+0:91        Convert int to uint (temp 3-component vector of uint)
+0:91          'i3' (uniform 3-component vector of int)
+0:92      multiply second child into first child (temp 3-component vector of uint)
+0:92        'r22' (temp 3-component vector of uint)
+0:92        Convert float to uint (temp 3-component vector of uint)
+0:92          'f3' (uniform 3-component vector of float)
+0:93      multiply second child into first child (temp 3-component vector of uint)
+0:93        'r23' (temp 3-component vector of uint)
+0:93        Convert double to uint (temp 3-component vector of uint)
+0:93          'd3' (uniform 3-component vector of double)
+0:97      multiply second child into first child (temp 3-component vector of double)
+0:97        'r40' (temp 3-component vector of double)
+0:97        Convert int to double (temp 3-component vector of double)
+0:97          'i3' (uniform 3-component vector of int)
+0:98      multiply second child into first child (temp 3-component vector of double)
+0:98        'r41' (temp 3-component vector of double)
+0:98        Convert uint to double (temp 3-component vector of double)
+0:98          'u3' (uniform 3-component vector of uint)
+0:99      multiply second child into first child (temp 3-component vector of double)
+0:99        'r42' (temp 3-component vector of double)
+0:99        Convert float to double (temp 3-component vector of double)
+0:99          'f3' (uniform 3-component vector of float)
+0:100      multiply second child into first child (temp 3-component vector of double)
+0:100        'r43' (temp 3-component vector of double)
+0:100        Convert bool to double (temp 3-component vector of double)
+0:100          'b3' (uniform 3-component vector of bool)
+0:103      vector scale second child into first child (temp 3-component vector of float)
+0:103        'r00' (temp 3-component vector of float)
+0:103        Convert int to float (temp float)
+0:103          'is' (uniform int)
+0:104      vector scale second child into first child (temp 3-component vector of float)
+0:104        'r01' (temp 3-component vector of float)
+0:104        Convert bool to float (temp float)
+0:104          'bs' (uniform bool)
+0:105      vector scale second child into first child (temp 3-component vector of float)
+0:105        'r02' (temp 3-component vector of float)
+0:105        Convert uint to float (temp float)
+0:105          'us' (uniform uint)
+0:106      vector scale second child into first child (temp 3-component vector of float)
+0:106        'r03' (temp 3-component vector of float)
+0:106        Convert double to float (temp float)
+0:106          'ds' (uniform double)
+0:108      vector scale second child into first child (temp 3-component vector of int)
+0:108        'r10' (temp 3-component vector of int)
+0:108        Convert bool to int (temp int)
+0:108          'bs' (uniform bool)
+0:109      vector scale second child into first child (temp 3-component vector of int)
+0:109        'r11' (temp 3-component vector of int)
+0:109        Convert uint to int (temp int)
+0:109          'us' (uniform uint)
+0:110      vector scale second child into first child (temp 3-component vector of int)
+0:110        'r12' (temp 3-component vector of int)
+0:110        Convert float to int (temp int)
+0:110          'fs' (uniform float)
+0:111      vector scale second child into first child (temp 3-component vector of int)
+0:111        'r13' (temp 3-component vector of int)
+0:111        Convert double to int (temp int)
+0:111          'ds' (uniform double)
+0:113      vector scale second child into first child (temp 3-component vector of uint)
+0:113        'r20' (temp 3-component vector of uint)
+0:113        Convert bool to uint (temp uint)
+0:113          'bs' (uniform bool)
+0:114      vector scale second child into first child (temp 3-component vector of uint)
+0:114        'r21' (temp 3-component vector of uint)
+0:114        Convert int to uint (temp uint)
+0:114          'is' (uniform int)
+0:115      vector scale second child into first child (temp 3-component vector of uint)
+0:115        'r22' (temp 3-component vector of uint)
+0:115        Convert float to uint (temp uint)
+0:115          'fs' (uniform float)
+0:116      vector scale second child into first child (temp 3-component vector of uint)
+0:116        'r23' (temp 3-component vector of uint)
+0:116        Convert double to uint (temp uint)
+0:116          'ds' (uniform double)
+0:120      vector scale second child into first child (temp 3-component vector of double)
+0:120        'r40' (temp 3-component vector of double)
+0:120        Convert int to double (temp double)
+0:120          'is' (uniform int)
+0:121      vector scale second child into first child (temp 3-component vector of double)
+0:121        'r41' (temp 3-component vector of double)
+0:121        Convert uint to double (temp double)
+0:121          'us' (uniform uint)
+0:122      vector scale second child into first child (temp 3-component vector of double)
+0:122        'r42' (temp 3-component vector of double)
+0:122        Convert float to double (temp double)
+0:122          'fs' (uniform float)
+0:123      vector scale second child into first child (temp 3-component vector of double)
+0:123        'r43' (temp 3-component vector of double)
+0:123        Convert bool to double (temp double)
+0:123          'bs' (uniform bool)
+0:193      Sequence
+0:193        move second child to first child (temp int)
+0:193          'c1' (temp int)
+0:193          Constant:
+0:193            3 (const int)
+0:194      Sequence
+0:194        move second child to first child (temp int)
+0:194          'c2' (temp int)
+0:194          Constant:
+0:194            3 (const int)
+0:196      Sequence
+0:196        move second child to first child (temp 4-component vector of float)
+0:196          'outval' (temp 4-component vector of float)
+0:?           Construct vec4 (temp 4-component vector of float)
+0:196            Constant:
+0:196              3.600000
+0:196            Constant:
+0:196              3.600000
+0:196            Convert int to float (temp float)
+0:196              'c1' (temp int)
+0:196            Convert int to float (temp float)
+0:196              'c2' (temp int)
+0:199      move second child to first child (temp 4-component vector of float)
+0:199        Color: direct index for structure (temp 4-component vector of float)
+0:199          'psout' (temp structure{temp 4-component vector of float Color})
+0:199          Constant:
+0:199            0 (const int)
+0:199        'outval' (temp 4-component vector of float)
+0:200      Branch: Return with expression
+0:200        'psout' (temp structure{temp 4-component vector of float Color})
+0:?   Linker Objects
+0:?     'i3' (uniform 3-component vector of int)
+0:?     'b3' (uniform 3-component vector of bool)
+0:?     'f3' (uniform 3-component vector of float)
+0:?     'u3' (uniform 3-component vector of uint)
+0:?     'd3' (uniform 3-component vector of double)
+0:?     'is' (uniform int)
+0:?     'bs' (uniform bool)
+0:?     'fs' (uniform float)
+0:?     'us' (uniform uint)
+0:?     'ds' (uniform double)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 478
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "main"
+                              Name 11  "Fn_F3(vf3;"
+                              Name 10  "x"
+                              Name 18  "Fn_I3(vi3;"
+                              Name 17  "x"
+                              Name 25  "Fn_U3(vu3;"
+                              Name 24  "x"
+                              Name 32  "Fn_B3(vb3;"
+                              Name 31  "x"
+                              Name 39  "Fn_D3(vd3;"
+                              Name 38  "x"
+                              Name 43  "Fn_R_F3I(vf3;"
+                              Name 42  "p"
+                              Name 46  "Fn_R_F3U(vf3;"
+                              Name 45  "p"
+                              Name 49  "Fn_R_F3B(vf3;"
+                              Name 48  "p"
+                              Name 52  "Fn_R_F3D(vf3;"
+                              Name 51  "p"
+                              Name 56  "Fn_R_I3U(vi3;"
+                              Name 55  "p"
+                              Name 59  "Fn_R_I3B(vi3;"
+                              Name 58  "p"
+                              Name 62  "Fn_R_I3F(vi3;"
+                              Name 61  "p"
+                              Name 65  "Fn_R_I3D(vi3;"
+                              Name 64  "p"
+                              Name 69  "Fn_R_U3I(vu3;"
+                              Name 68  "p"
+                              Name 72  "Fn_R_U3F(vu3;"
+                              Name 71  "p"
+                              Name 75  "Fn_R_U3B(vu3;"
+                              Name 74  "p"
+                              Name 78  "Fn_R_U3D(vu3;"
+                              Name 77  "p"
+                              Name 82  "Fn_R_B3I(vb3;"
+                              Name 81  "p"
+                              Name 85  "Fn_R_B3U(vb3;"
+                              Name 84  "p"
+                              Name 88  "Fn_R_B3F(vb3;"
+                              Name 87  "p"
+                              Name 91  "Fn_R_B3D(vb3;"
+                              Name 90  "p"
+                              Name 95  "Fn_R_D3I(vd3;"
+                              Name 94  "p"
+                              Name 98  "Fn_R_D3U(vd3;"
+                              Name 97  "p"
+                              Name 101  "Fn_R_D3B(vd3;"
+                              Name 100  "p"
+                              Name 104  "Fn_R_D3F(vd3;"
+                              Name 103  "p"
+                              Name 107  "i3"
+                              Name 115  "u3"
+                              Name 123  "b3"
+                              Name 135  "d3"
+                              Name 159  "f3"
+                              Name 252  "r00"
+                              Name 255  "r01"
+                              Name 258  "r02"
+                              Name 261  "r03"
+                              Name 264  "r10"
+                              Name 267  "r11"
+                              Name 270  "r12"
+                              Name 273  "r13"
+                              Name 276  "r20"
+                              Name 279  "r21"
+                              Name 282  "r22"
+                              Name 285  "r23"
+                              Name 288  "r30"
+                              Name 291  "r31"
+                              Name 294  "r32"
+                              Name 297  "r33"
+                              Name 300  "r40"
+                              Name 303  "r41"
+                              Name 306  "r42"
+                              Name 309  "r43"
+                              Name 377  "is"
+                              Name 383  "bs"
+                              Name 389  "us"
+                              Name 395  "ds"
+                              Name 411  "fs"
+                              Name 459  "c1"
+                              Name 461  "c2"
+                              Name 464  "outval"
+                              Name 471  "PS_OUTPUT"
+                              MemberName 471(PS_OUTPUT) 0  "Color"
+                              Name 473  "psout"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+               8:             TypePointer Function 7(fvec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeInt 32 1
+              14:             TypeVector 13(int) 3
+              15:             TypePointer Function 14(ivec3)
+              16:             TypeFunction 2 15(ptr)
+              20:             TypeInt 32 0
+              21:             TypeVector 20(int) 3
+              22:             TypePointer Function 21(ivec3)
+              23:             TypeFunction 2 22(ptr)
+              27:             TypeBool
+              28:             TypeVector 27(bool) 3
+              29:             TypePointer Function 28(bvec3)
+              30:             TypeFunction 2 29(ptr)
+              34:             TypeFloat 64
+              35:             TypeVector 34(float) 3
+              36:             TypePointer Function 35(fvec3)
+              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)
+             106:             TypePointer UniformConstant 14(ivec3)
+         107(i3):    106(ptr) Variable UniformConstant
+             114:             TypePointer UniformConstant 21(ivec3)
+         115(u3):    114(ptr) Variable UniformConstant
+             122:             TypePointer UniformConstant 28(bvec3)
+         123(b3):    122(ptr) Variable UniformConstant
+             125:    6(float) Constant 0
+             126:    6(float) Constant 1065353216
+             127:    7(fvec3) ConstantComposite 125 125 125
+             128:    7(fvec3) ConstantComposite 126 126 126
+             134:             TypePointer UniformConstant 35(fvec3)
+         135(d3):    134(ptr) Variable UniformConstant
+             149:     13(int) Constant 0
+             150:     13(int) Constant 1
+             151:   14(ivec3) ConstantComposite 149 149 149
+             152:   14(ivec3) ConstantComposite 150 150 150
+             158:             TypePointer UniformConstant 7(fvec3)
+         159(f3):    158(ptr) Variable UniformConstant
+             185:     20(int) Constant 0
+             186:     20(int) Constant 1
+             187:   21(ivec3) ConstantComposite 185 185 185
+             188:   21(ivec3) ConstantComposite 186 186 186
+             219:   34(float) Constant 0 0
+             220:   35(fvec3) ConstantComposite 219 219 219
+             239:   34(float) Constant 0 1072693248
+             240:   35(fvec3) ConstantComposite 239 239 239
+             376:             TypePointer UniformConstant 13(int)
+         377(is):    376(ptr) Variable UniformConstant
+             382:             TypePointer UniformConstant 27(bool)
+         383(bs):    382(ptr) Variable UniformConstant
+             388:             TypePointer UniformConstant 20(int)
+         389(us):    388(ptr) Variable UniformConstant
+             394:             TypePointer UniformConstant 34(float)
+         395(ds):    394(ptr) Variable UniformConstant
+             410:             TypePointer UniformConstant 6(float)
+         411(fs):    410(ptr) Variable UniformConstant
+             458:             TypePointer Function 13(int)
+             460:     13(int) Constant 3
+             462:             TypeVector 6(float) 4
+             463:             TypePointer Function 462(fvec4)
+             465:    6(float) Constant 1080452710
+  471(PS_OUTPUT):             TypeStruct 462(fvec4)
+             472:             TypePointer Function 471(PS_OUTPUT)
+         4(main):           2 Function None 3
+               5:             Label
+        252(r00):      8(ptr) Variable Function
+        255(r01):      8(ptr) Variable Function
+        258(r02):      8(ptr) Variable Function
+        261(r03):      8(ptr) Variable Function
+        264(r10):     15(ptr) Variable Function
+        267(r11):     15(ptr) Variable Function
+        270(r12):     15(ptr) Variable Function
+        273(r13):     15(ptr) Variable Function
+        276(r20):     22(ptr) Variable Function
+        279(r21):     22(ptr) Variable Function
+        282(r22):     22(ptr) Variable Function
+        285(r23):     22(ptr) Variable Function
+        288(r30):     29(ptr) Variable Function
+        291(r31):     29(ptr) Variable Function
+        294(r32):     29(ptr) Variable Function
+        297(r33):     29(ptr) Variable Function
+        300(r40):     36(ptr) Variable Function
+        303(r41):     36(ptr) Variable Function
+        306(r42):     36(ptr) Variable Function
+        309(r43):     36(ptr) Variable Function
+         459(c1):    458(ptr) Variable Function
+         461(c2):    458(ptr) Variable Function
+     464(outval):    463(ptr) Variable Function
+      473(psout):    472(ptr) Variable Function
+             253:   14(ivec3) Load 107(i3)
+             254:    7(fvec3) ConvertSToF 253
+                              Store 252(r00) 254
+             256:   28(bvec3) Load 123(b3)
+             257:    7(fvec3) Select 256 128 127
+                              Store 255(r01) 257
+             259:   21(ivec3) Load 115(u3)
+             260:    7(fvec3) ConvertUToF 259
+                              Store 258(r02) 260
+             262:   35(fvec3) Load 135(d3)
+             263:    7(fvec3) FConvert 262
+                              Store 261(r03) 263
+             265:   28(bvec3) Load 123(b3)
+             266:   14(ivec3) Select 265 152 151
+                              Store 264(r10) 266
+             268:   21(ivec3) Load 115(u3)
+             269:   14(ivec3) Bitcast 268
+                              Store 267(r11) 269
+             271:    7(fvec3) Load 159(f3)
+             272:   14(ivec3) ConvertFToS 271
+                              Store 270(r12) 272
+             274:   35(fvec3) Load 135(d3)
+             275:   14(ivec3) ConvertFToS 274
+                              Store 273(r13) 275
+             277:   28(bvec3) Load 123(b3)
+             278:   21(ivec3) Select 277 188 187
+                              Store 276(r20) 278
+             280:   14(ivec3) Load 107(i3)
+             281:   21(ivec3) Bitcast 280
+                              Store 279(r21) 281
+             283:    7(fvec3) Load 159(f3)
+             284:   21(ivec3) ConvertFToU 283
+                              Store 282(r22) 284
+             286:   35(fvec3) Load 135(d3)
+             287:   21(ivec3) ConvertFToU 286
+                              Store 285(r23) 287
+             289:   14(ivec3) Load 107(i3)
+             290:   28(bvec3) INotEqual 289 187
+                              Store 288(r30) 290
+             292:   21(ivec3) Load 115(u3)
+             293:   28(bvec3) INotEqual 292 187
+                              Store 291(r31) 293
+             295:    7(fvec3) Load 159(f3)
+             296:   28(bvec3) FOrdNotEqual 295 127
+                              Store 294(r32) 296
+             298:   35(fvec3) Load 135(d3)
+             299:   28(bvec3) FOrdNotEqual 298 220
+                              Store 297(r33) 299
+             301:   14(ivec3) Load 107(i3)
+             302:   35(fvec3) ConvertSToF 301
+                              Store 300(r40) 302
+             304:   21(ivec3) Load 115(u3)
+             305:   35(fvec3) ConvertUToF 304
+                              Store 303(r41) 305
+             307:    7(fvec3) Load 159(f3)
+             308:   35(fvec3) FConvert 307
+                              Store 306(r42) 308
+             310:   28(bvec3) Load 123(b3)
+             311:   35(fvec3) Select 310 240 220
+                              Store 309(r43) 311
+             312:   14(ivec3) Load 107(i3)
+             313:    7(fvec3) ConvertSToF 312
+             314:    7(fvec3) Load 252(r00)
+             315:    7(fvec3) FMul 314 313
+                              Store 252(r00) 315
+             316:   28(bvec3) Load 123(b3)
+             317:    7(fvec3) Select 316 128 127
+             318:    7(fvec3) Load 255(r01)
+             319:    7(fvec3) FMul 318 317
+                              Store 255(r01) 319
+             320:   21(ivec3) Load 115(u3)
+             321:    7(fvec3) ConvertUToF 320
+             322:    7(fvec3) Load 258(r02)
+             323:    7(fvec3) FMul 322 321
+                              Store 258(r02) 323
+             324:   35(fvec3) Load 135(d3)
+             325:    7(fvec3) FConvert 324
+             326:    7(fvec3) Load 261(r03)
+             327:    7(fvec3) FMul 326 325
+                              Store 261(r03) 327
+             328:   28(bvec3) Load 123(b3)
+             329:   14(ivec3) Select 328 152 151
+             330:   14(ivec3) Load 264(r10)
+             331:   14(ivec3) IMul 330 329
+                              Store 264(r10) 331
+             332:   21(ivec3) Load 115(u3)
+             333:   14(ivec3) Bitcast 332
+             334:   14(ivec3) Load 267(r11)
+             335:   14(ivec3) IMul 334 333
+                              Store 267(r11) 335
+             336:    7(fvec3) Load 159(f3)
+             337:   14(ivec3) ConvertFToS 336
+             338:   14(ivec3) Load 270(r12)
+             339:   14(ivec3) IMul 338 337
+                              Store 270(r12) 339
+             340:   35(fvec3) Load 135(d3)
+             341:   14(ivec3) ConvertFToS 340
+             342:   14(ivec3) Load 273(r13)
+             343:   14(ivec3) IMul 342 341
+                              Store 273(r13) 343
+             344:   28(bvec3) Load 123(b3)
+             345:   21(ivec3) Select 344 188 187
+             346:   21(ivec3) Load 276(r20)
+             347:   21(ivec3) IMul 346 345
+                              Store 276(r20) 347
+             348:   14(ivec3) Load 107(i3)
+             349:   21(ivec3) Bitcast 348
+             350:   21(ivec3) Load 279(r21)
+             351:   21(ivec3) IMul 350 349
+                              Store 279(r21) 351
+             352:    7(fvec3) Load 159(f3)
+             353:   21(ivec3) ConvertFToU 352
+             354:   21(ivec3) Load 282(r22)
+             355:   21(ivec3) IMul 354 353
+                              Store 282(r22) 355
+             356:   35(fvec3) Load 135(d3)
+             357:   21(ivec3) ConvertFToU 356
+             358:   21(ivec3) Load 285(r23)
+             359:   21(ivec3) IMul 358 357
+                              Store 285(r23) 359
+             360:   14(ivec3) Load 107(i3)
+             361:   35(fvec3) ConvertSToF 360
+             362:   35(fvec3) Load 300(r40)
+             363:   35(fvec3) FMul 362 361
+                              Store 300(r40) 363
+             364:   21(ivec3) Load 115(u3)
+             365:   35(fvec3) ConvertUToF 364
+             366:   35(fvec3) Load 303(r41)
+             367:   35(fvec3) FMul 366 365
+                              Store 303(r41) 367
+             368:    7(fvec3) Load 159(f3)
+             369:   35(fvec3) FConvert 368
+             370:   35(fvec3) Load 306(r42)
+             371:   35(fvec3) FMul 370 369
+                              Store 306(r42) 371
+             372:   28(bvec3) Load 123(b3)
+             373:   35(fvec3) Select 372 240 220
+             374:   35(fvec3) Load 309(r43)
+             375:   35(fvec3) FMul 374 373
+                              Store 309(r43) 375
+             378:     13(int) Load 377(is)
+             379:    6(float) ConvertSToF 378
+             380:    7(fvec3) Load 252(r00)
+             381:    7(fvec3) VectorTimesScalar 380 379
+                              Store 252(r00) 381
+             384:    27(bool) Load 383(bs)
+             385:    6(float) Select 384 126 125
+             386:    7(fvec3) Load 255(r01)
+             387:    7(fvec3) VectorTimesScalar 386 385
+                              Store 255(r01) 387
+             390:     20(int) Load 389(us)
+             391:    6(float) ConvertUToF 390
+             392:    7(fvec3) Load 258(r02)
+             393:    7(fvec3) VectorTimesScalar 392 391
+                              Store 258(r02) 393
+             396:   34(float) Load 395(ds)
+             397:    6(float) FConvert 396
+             398:    7(fvec3) Load 261(r03)
+             399:    7(fvec3) VectorTimesScalar 398 397
+                              Store 261(r03) 399
+             400:    27(bool) Load 383(bs)
+             401:     13(int) Select 400 150 149
+             402:   14(ivec3) Load 264(r10)
+             403:   14(ivec3) CompositeConstruct 401 401 401
+             404:   14(ivec3) IMul 402 403
+                              Store 264(r10) 404
+             405:     20(int) Load 389(us)
+             406:     13(int) Bitcast 405
+             407:   14(ivec3) Load 267(r11)
+             408:   14(ivec3) CompositeConstruct 406 406 406
+             409:   14(ivec3) IMul 407 408
+                              Store 267(r11) 409
+             412:    6(float) Load 411(fs)
+             413:     13(int) ConvertFToS 412
+             414:   14(ivec3) Load 270(r12)
+             415:   14(ivec3) CompositeConstruct 413 413 413
+             416:   14(ivec3) IMul 414 415
+                              Store 270(r12) 416
+             417:   34(float) Load 395(ds)
+             418:     13(int) ConvertFToS 417
+             419:   14(ivec3) Load 273(r13)
+             420:   14(ivec3) CompositeConstruct 418 418 418
+             421:   14(ivec3) IMul 419 420
+                              Store 273(r13) 421
+             422:    27(bool) Load 383(bs)
+             423:     20(int) Select 422 186 185
+             424:   21(ivec3) Load 276(r20)
+             425:   21(ivec3) CompositeConstruct 423 423 423
+             426:   21(ivec3) IMul 424 425
+                              Store 276(r20) 426
+             427:     13(int) Load 377(is)
+             428:     20(int) Bitcast 427
+             429:   21(ivec3) Load 279(r21)
+             430:   21(ivec3) CompositeConstruct 428 428 428
+             431:   21(ivec3) IMul 429 430
+                              Store 279(r21) 431
+             432:    6(float) Load 411(fs)
+             433:     20(int) ConvertFToU 432
+             434:   21(ivec3) Load 282(r22)
+             435:   21(ivec3) CompositeConstruct 433 433 433
+             436:   21(ivec3) IMul 434 435
+                              Store 282(r22) 436
+             437:   34(float) Load 395(ds)
+             438:     20(int) ConvertFToU 437
+             439:   21(ivec3) Load 285(r23)
+             440:   21(ivec3) CompositeConstruct 438 438 438
+             441:   21(ivec3) IMul 439 440
+                              Store 285(r23) 441
+             442:     13(int) Load 377(is)
+             443:   34(float) ConvertSToF 442
+             444:   35(fvec3) Load 300(r40)
+             445:   35(fvec3) VectorTimesScalar 444 443
+                              Store 300(r40) 445
+             446:     20(int) Load 389(us)
+             447:   34(float) ConvertUToF 446
+             448:   35(fvec3) Load 303(r41)
+             449:   35(fvec3) VectorTimesScalar 448 447
+                              Store 303(r41) 449
+             450:    6(float) Load 411(fs)
+             451:   34(float) FConvert 450
+             452:   35(fvec3) Load 306(r42)
+             453:   35(fvec3) VectorTimesScalar 452 451
+                              Store 306(r42) 453
+             454:    27(bool) Load 383(bs)
+             455:   34(float) Select 454 239 219
+             456:   35(fvec3) Load 309(r43)
+             457:   35(fvec3) VectorTimesScalar 456 455
+                              Store 309(r43) 457
+                              Store 459(c1) 460
+                              Store 461(c2) 460
+             466:     13(int) Load 459(c1)
+             467:    6(float) ConvertSToF 466
+             468:     13(int) Load 461(c2)
+             469:    6(float) ConvertSToF 468
+             470:  462(fvec4) CompositeConstruct 465 465 467 469
+                              Store 464(outval) 470
+             474:  462(fvec4) Load 464(outval)
+             475:    463(ptr) AccessChain 473(psout) 149
+                              Store 475 474
+             476:471(PS_OUTPUT) Load 473(psout)
+                              ReturnValue 476
+                              FunctionEnd
+  11(Fn_F3(vf3;):           2 Function None 9
+           10(x):      8(ptr) FunctionParameter
+              12:             Label
+                              Return
+                              FunctionEnd
+  18(Fn_I3(vi3;):           2 Function None 16
+           17(x):     15(ptr) FunctionParameter
+              19:             Label
+                              Return
+                              FunctionEnd
+  25(Fn_U3(vu3;):           2 Function None 23
+           24(x):     22(ptr) FunctionParameter
+              26:             Label
+                              Return
+                              FunctionEnd
+  32(Fn_B3(vb3;):           2 Function None 30
+           31(x):     29(ptr) FunctionParameter
+              33:             Label
+                              Return
+                              FunctionEnd
+  39(Fn_D3(vd3;):           2 Function None 37
+           38(x):     36(ptr) FunctionParameter
+              40:             Label
+                              Return
+                              FunctionEnd
+43(Fn_R_F3I(vf3;):    7(fvec3) Function None 41
+           42(p):      8(ptr) FunctionParameter
+              44:             Label
+             108:   14(ivec3) Load 107(i3)
+             109:    7(fvec3) ConvertSToF 108
+                              Store 42(p) 109
+             110:   14(ivec3) Load 107(i3)
+             111:    7(fvec3) ConvertSToF 110
+                              ReturnValue 111
+                              FunctionEnd
+46(Fn_R_F3U(vf3;):    7(fvec3) Function None 41
+           45(p):      8(ptr) FunctionParameter
+              47:             Label
+             116:   21(ivec3) Load 115(u3)
+             117:    7(fvec3) ConvertUToF 116
+                              Store 45(p) 117
+             118:   21(ivec3) Load 115(u3)
+             119:    7(fvec3) ConvertUToF 118
+                              ReturnValue 119
+                              FunctionEnd
+49(Fn_R_F3B(vf3;):    7(fvec3) Function None 41
+           48(p):      8(ptr) FunctionParameter
+              50:             Label
+             124:   28(bvec3) Load 123(b3)
+             129:    7(fvec3) Select 124 128 127
+                              Store 48(p) 129
+             130:   28(bvec3) Load 123(b3)
+             131:    7(fvec3) Select 130 128 127
+                              ReturnValue 131
+                              FunctionEnd
+52(Fn_R_F3D(vf3;):    7(fvec3) Function None 41
+           51(p):      8(ptr) FunctionParameter
+              53:             Label
+             136:   35(fvec3) Load 135(d3)
+             137:    7(fvec3) FConvert 136
+                              Store 51(p) 137
+             138:   35(fvec3) Load 135(d3)
+             139:    7(fvec3) FConvert 138
+                              ReturnValue 139
+                              FunctionEnd
+56(Fn_R_I3U(vi3;):   14(ivec3) Function None 54
+           55(p):     15(ptr) FunctionParameter
+              57:             Label
+             142:   21(ivec3) Load 115(u3)
+             143:   14(ivec3) Bitcast 142
+                              Store 55(p) 143
+             144:   21(ivec3) Load 115(u3)
+             145:   14(ivec3) Bitcast 144
+                              ReturnValue 145
+                              FunctionEnd
+59(Fn_R_I3B(vi3;):   14(ivec3) Function None 54
+           58(p):     15(ptr) FunctionParameter
+              60:             Label
+             148:   28(bvec3) Load 123(b3)
+             153:   14(ivec3) Select 148 152 151
+                              Store 58(p) 153
+             154:   28(bvec3) Load 123(b3)
+             155:   14(ivec3) Select 154 152 151
+                              ReturnValue 155
+                              FunctionEnd
+62(Fn_R_I3F(vi3;):   14(ivec3) Function None 54
+           61(p):     15(ptr) FunctionParameter
+              63:             Label
+             160:    7(fvec3) Load 159(f3)
+             161:   14(ivec3) ConvertFToS 160
+                              Store 61(p) 161
+             162:    7(fvec3) Load 159(f3)
+             163:   14(ivec3) ConvertFToS 162
+                              ReturnValue 163
+                              FunctionEnd
+65(Fn_R_I3D(vi3;):   14(ivec3) Function None 54
+           64(p):     15(ptr) FunctionParameter
+              66:             Label
+             166:   35(fvec3) Load 135(d3)
+             167:   14(ivec3) ConvertFToS 166
+                              Store 64(p) 167
+             168:   35(fvec3) Load 135(d3)
+             169:   14(ivec3) ConvertFToS 168
+                              ReturnValue 169
+                              FunctionEnd
+69(Fn_R_U3I(vu3;):   21(ivec3) Function None 67
+           68(p):     22(ptr) FunctionParameter
+              70:             Label
+             172:   14(ivec3) Load 107(i3)
+             173:   21(ivec3) Bitcast 172
+                              Store 68(p) 173
+             174:   14(ivec3) Load 107(i3)
+             175:   21(ivec3) Bitcast 174
+                              ReturnValue 175
+                              FunctionEnd
+72(Fn_R_U3F(vu3;):   21(ivec3) Function None 67
+           71(p):     22(ptr) FunctionParameter
+              73:             Label
+             178:    7(fvec3) Load 159(f3)
+             179:   21(ivec3) ConvertFToU 178
+                              Store 71(p) 179
+             180:    7(fvec3) Load 159(f3)
+             181:   21(ivec3) ConvertFToU 180
+                              ReturnValue 181
+                              FunctionEnd
+75(Fn_R_U3B(vu3;):   21(ivec3) Function None 67
+           74(p):     22(ptr) FunctionParameter
+              76:             Label
+             184:   28(bvec3) Load 123(b3)
+             189:   21(ivec3) Select 184 188 187
+                              Store 74(p) 189
+             190:   28(bvec3) Load 123(b3)
+             191:   21(ivec3) Select 190 188 187
+                              ReturnValue 191
+                              FunctionEnd
+78(Fn_R_U3D(vu3;):   21(ivec3) Function None 67
+           77(p):     22(ptr) FunctionParameter
+              79:             Label
+             194:   35(fvec3) Load 135(d3)
+             195:   21(ivec3) ConvertFToU 194
+                              Store 77(p) 195
+             196:   35(fvec3) Load 135(d3)
+             197:   21(ivec3) ConvertFToU 196
+                              ReturnValue 197
+                              FunctionEnd
+82(Fn_R_B3I(vb3;):   28(bvec3) Function None 80
+           81(p):     29(ptr) FunctionParameter
+              83:             Label
+             200:   14(ivec3) Load 107(i3)
+             201:   28(bvec3) INotEqual 200 187
+                              Store 81(p) 201
+             202:   14(ivec3) Load 107(i3)
+             203:   28(bvec3) INotEqual 202 187
+                              ReturnValue 203
+                              FunctionEnd
+85(Fn_R_B3U(vb3;):   28(bvec3) Function None 80
+           84(p):     29(ptr) FunctionParameter
+              86:             Label
+             206:   21(ivec3) Load 115(u3)
+             207:   28(bvec3) INotEqual 206 187
+                              Store 84(p) 207
+             208:   21(ivec3) Load 115(u3)
+             209:   28(bvec3) INotEqual 208 187
+                              ReturnValue 209
+                              FunctionEnd
+88(Fn_R_B3F(vb3;):   28(bvec3) Function None 80
+           87(p):     29(ptr) FunctionParameter
+              89:             Label
+             212:    7(fvec3) Load 159(f3)
+             213:   28(bvec3) FOrdNotEqual 212 127
+                              Store 87(p) 213
+             214:    7(fvec3) Load 159(f3)
+             215:   28(bvec3) FOrdNotEqual 214 127
+                              ReturnValue 215
+                              FunctionEnd
+91(Fn_R_B3D(vb3;):   28(bvec3) Function None 80
+           90(p):     29(ptr) FunctionParameter
+              92:             Label
+             218:   35(fvec3) Load 135(d3)
+             221:   28(bvec3) FOrdNotEqual 218 220
+                              Store 90(p) 221
+             222:   35(fvec3) Load 135(d3)
+             223:   28(bvec3) FOrdNotEqual 222 220
+                              ReturnValue 223
+                              FunctionEnd
+95(Fn_R_D3I(vd3;):   35(fvec3) Function None 93
+           94(p):     36(ptr) FunctionParameter
+              96:             Label
+             226:   14(ivec3) Load 107(i3)
+             227:   35(fvec3) ConvertSToF 226
+                              Store 94(p) 227
+             228:   14(ivec3) Load 107(i3)
+             229:   35(fvec3) ConvertSToF 228
+                              ReturnValue 229
+                              FunctionEnd
+98(Fn_R_D3U(vd3;):   35(fvec3) Function None 93
+           97(p):     36(ptr) FunctionParameter
+              99:             Label
+             232:   21(ivec3) Load 115(u3)
+             233:   35(fvec3) ConvertUToF 232
+                              Store 97(p) 233
+             234:   21(ivec3) Load 115(u3)
+             235:   35(fvec3) ConvertUToF 234
+                              ReturnValue 235
+                              FunctionEnd
+101(Fn_R_D3B(vd3;):   35(fvec3) Function None 93
+          100(p):     36(ptr) FunctionParameter
+             102:             Label
+             238:   28(bvec3) Load 123(b3)
+             241:   35(fvec3) Select 238 240 220
+                              Store 100(p) 241
+             242:   28(bvec3) Load 123(b3)
+             243:   35(fvec3) Select 242 240 220
+                              ReturnValue 243
+                              FunctionEnd
+104(Fn_R_D3F(vd3;):   35(fvec3) Function None 93
+          103(p):     36(ptr) FunctionParameter
+             105:             Label
+             246:    7(fvec3) Load 159(f3)
+             247:   35(fvec3) FConvert 246
+                              Store 103(p) 247
+             248:    7(fvec3) Load 159(f3)
+             249:   35(fvec3) FConvert 248
+                              ReturnValue 249
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.semicolons.frag.out b/Test/baseResults/hlsl.semicolons.frag.out
new file mode 100644
index 0000000..78a3a5a
--- /dev/null
+++ b/Test/baseResults/hlsl.semicolons.frag.out
@@ -0,0 +1,96 @@
+hlsl.semicolons.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: MyFunc( (global void)
+0:2    Function Parameters: 
+0:8  Function Definition: MyFunc2( (global void)
+0:8    Function Parameters: 
+0:18  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:13    Function Parameters: 
+0:?     Sequence
+0:16      move second child to first child (temp 4-component vector of float)
+0:16        color: direct index for structure (temp 4-component vector of float)
+0:16          'ps_output' (temp structure{temp 4-component vector of float color})
+0:16          Constant:
+0:16            0 (const int)
+0:16        Constant:
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:17      Branch: Return with expression
+0:17        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: MyFunc( (global void)
+0:2    Function Parameters: 
+0:8  Function Definition: MyFunc2( (global void)
+0:8    Function Parameters: 
+0:18  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:13    Function Parameters: 
+0:?     Sequence
+0:16      move second child to first child (temp 4-component vector of float)
+0:16        color: direct index for structure (temp 4-component vector of float)
+0:16          'ps_output' (temp structure{temp 4-component vector of float color})
+0:16          Constant:
+0:16            0 (const int)
+0:16        Constant:
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:16          1.000000
+0:17      Branch: Return with expression
+0:17        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?   Linker Objects
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 23
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "main"
+                              Name 6  "MyFunc("
+                              Name 8  "MyFunc2("
+                              Name 12  "PS_OUTPUT"
+                              MemberName 12(PS_OUTPUT) 0  "color"
+                              Name 14  "ps_output"
+               2:             TypeVoid
+               3:             TypeFunction 2
+              10:             TypeFloat 32
+              11:             TypeVector 10(float) 4
+   12(PS_OUTPUT):             TypeStruct 11(fvec4)
+              13:             TypePointer Function 12(PS_OUTPUT)
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:   10(float) Constant 1065353216
+              18:   11(fvec4) ConstantComposite 17 17 17 17
+              19:             TypePointer Function 11(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+   14(ps_output):     13(ptr) Variable Function
+              20:     19(ptr) AccessChain 14(ps_output) 16
+                              Store 20 18
+              21:12(PS_OUTPUT) Load 14(ps_output)
+                              ReturnValue 21
+                              FunctionEnd
+      6(MyFunc():           2 Function None 3
+               7:             Label
+                              Return
+                              FunctionEnd
+     8(MyFunc2():           2 Function None 3
+               9:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.shapeConv.frag.out b/Test/baseResults/hlsl.shapeConv.frag.out
index e9b7389..6389595 100755
--- a/Test/baseResults/hlsl.shapeConv.frag.out
+++ b/Test/baseResults/hlsl.shapeConv.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: PixelShaderFunction(vf4;f1; (global 4-component vector of float)
+0:23  Function Definition: PixelShaderFunction(vf4;f1; (global 4-component vector of float)
 0:2    Function Parameters: 
 0:2      'input' (in 4-component vector of float)
 0:2      'f' (in float)
@@ -42,8 +42,48 @@
 0:10        Construct vec3 (temp 3-component vector of float)
 0:10          Construct float (temp float)
 0:10            'f' (in float)
-0:12      Branch: Return with expression
-0:12        'input' (in 4-component vector of 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)
+0:11          Constant:
+0:11            2.000000
+0:11            2.000000
+0:12      Sequence
+0:12        move second child to first child (temp float)
+0:12          'V' (temp float)
+0:12          Constant:
+0:12            1.000000
+0:13      Sequence
+0:13        move second child to first child (temp 3-component vector of float)
+0:13          'MyVal' (temp 3-component vector of float)
+0:13          Construct vec3 (temp 3-component vector of float)
+0:13            'V' (temp float)
+0:16      Compare Greater Than (temp bool)
+0:16        'foo' (temp 3-component vector of float)
+0:16        Constant:
+0:16          4.000000
+0:16          4.000000
+0:16          4.000000
+0:17      Compare Greater Than or Equal (temp bool)
+0:17        'foo' (temp 3-component vector of float)
+0:17        Constant:
+0:17          5.000000
+0:17          5.000000
+0:17          5.000000
+0:18      Compare Less Than (temp bool)
+0:18        Constant:
+0:18          6.000000
+0:18          6.000000
+0:18          6.000000
+0:18        'foo' (temp 3-component vector of float)
+0:19      Compare Less Than or Equal (temp bool)
+0:19        Constant:
+0:19          7.000000
+0:19          7.000000
+0:19          7.000000
+0:19        'foo' (temp 3-component vector of float)
+0:21      Branch: Return with expression
+0:21        'input' (in 4-component vector of float)
 0:?   Linker Objects
 
 
@@ -53,7 +93,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: PixelShaderFunction(vf4;f1; (global 4-component vector of float)
+0:23  Function Definition: PixelShaderFunction(vf4;f1; (global 4-component vector of float)
 0:2    Function Parameters: 
 0:2      'input' (in 4-component vector of float)
 0:2      'f' (in float)
@@ -93,13 +133,53 @@
 0:10        Construct vec3 (temp 3-component vector of float)
 0:10          Construct float (temp float)
 0:10            'f' (in float)
-0:12      Branch: Return with expression
-0:12        'input' (in 4-component vector of 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)
+0:11          Constant:
+0:11            2.000000
+0:11            2.000000
+0:12      Sequence
+0:12        move second child to first child (temp float)
+0:12          'V' (temp float)
+0:12          Constant:
+0:12            1.000000
+0:13      Sequence
+0:13        move second child to first child (temp 3-component vector of float)
+0:13          'MyVal' (temp 3-component vector of float)
+0:13          Construct vec3 (temp 3-component vector of float)
+0:13            'V' (temp float)
+0:16      Compare Greater Than (temp bool)
+0:16        'foo' (temp 3-component vector of float)
+0:16        Constant:
+0:16          4.000000
+0:16          4.000000
+0:16          4.000000
+0:17      Compare Greater Than or Equal (temp bool)
+0:17        'foo' (temp 3-component vector of float)
+0:17        Constant:
+0:17          5.000000
+0:17          5.000000
+0:17          5.000000
+0:18      Compare Less Than (temp bool)
+0:18        Constant:
+0:18          6.000000
+0:18          6.000000
+0:18          6.000000
+0:18        'foo' (temp 3-component vector of float)
+0:19      Compare Less Than or Equal (temp bool)
+0:19        Constant:
+0:19          7.000000
+0:19          7.000000
+0:19          7.000000
+0:19        'foo' (temp 3-component vector of float)
+0:21      Branch: Return with expression
+0:21        'input' (in 4-component vector of float)
 0:?   Linker Objects
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 32
+// Id's are bound by 58
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -113,6 +193,10 @@
                               Name 12  "f"
                               Name 15  "v"
                               Name 24  "u"
+                              Name 31  "w"
+                              Name 33  "V"
+                              Name 34  "MyVal"
+                              Name 37  "foo"
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -128,6 +212,18 @@
               23:             TypePointer Function 22(fvec3)
               25:   22(fvec3) ConstantComposite 16 16 16
               26:   22(fvec3) ConstantComposite 18 18 18
+              29:             TypeVector 6(float) 2
+              30:             TypePointer Function 29(fvec2)
+              32:   29(fvec2) ConstantComposite 18 18
+              39:    6(float) Constant 1082130432
+              40:   22(fvec3) ConstantComposite 39 39 39
+              41:             TypeBool
+              44:    6(float) Constant 1084227584
+              45:   22(fvec3) ConstantComposite 44 44 44
+              47:    6(float) Constant 1086324736
+              48:   22(fvec3) ConstantComposite 47 47 47
+              51:    6(float) Constant 1088421888
+              52:   22(fvec3) ConstantComposite 51 51 51
          4(main):           2 Function None 3
                5:             Label
                               FunctionEnd
@@ -137,6 +233,10 @@
               14:             Label
            15(v):      8(ptr) Variable Function
            24(u):     23(ptr) Variable Function
+           31(w):     30(ptr) Variable Function
+           33(V):      9(ptr) Variable Function
+       34(MyVal):     23(ptr) Variable Function
+         37(foo):     23(ptr) Variable Function
                               Store 15(v) 17
                               Store 15(v) 19
               20:    6(float) Load 12(f)
@@ -147,6 +247,19 @@
               27:    6(float) Load 12(f)
               28:   22(fvec3) CompositeConstruct 27 27 27
                               Store 24(u) 28
-              29:    7(fvec4) Load 11(input)
-                              ReturnValue 29
+                              Store 31(w) 32
+                              Store 33(V) 16
+              35:    6(float) Load 33(V)
+              36:   22(fvec3) CompositeConstruct 35 35 35
+                              Store 34(MyVal) 36
+              38:   22(fvec3) Load 37(foo)
+              42:    41(bool) FOrdGreaterThan 38 40
+              43:   22(fvec3) Load 37(foo)
+              46:    41(bool) FOrdGreaterThanEqual 43 45
+              49:   22(fvec3) Load 37(foo)
+              50:    41(bool) FOrdLessThan 48 49
+              53:   22(fvec3) Load 37(foo)
+              54:    41(bool) FOrdLessThanEqual 52 53
+              55:    7(fvec4) Load 11(input)
+                              ReturnValue 55
                               FunctionEnd
diff --git a/Test/baseResults/pointCoord.frag.out b/Test/baseResults/pointCoord.frag.out
index 633d8b9..5d53aea 100644
--- a/Test/baseResults/pointCoord.frag.out
+++ b/Test/baseResults/pointCoord.frag.out
@@ -14,7 +14,7 @@
 0:9        true case
 0:10        move second child to first child (temp highp 4-component vector of float)
 0:10          'color' (temp highp 4-component vector of float)
-0:10          texture (global lowp 4-component vector of float)
+0:10          texture (global lowp 4-component vector of float, operation at mediump)
 0:10            'sampler' (uniform lowp sampler2D)
 0:10            'gl_PointCoord' (gl_PointCoord mediump 2-component vector of float PointCoord)
 0:9        false case
@@ -50,7 +50,7 @@
 0:9        true case
 0:10        move second child to first child (temp highp 4-component vector of float)
 0:10          'color' (temp highp 4-component vector of float)
-0:10          texture (global lowp 4-component vector of float)
+0:10          texture (global lowp 4-component vector of float, operation at mediump)
 0:10            'sampler' (uniform lowp sampler2D)
 0:10            'gl_PointCoord' (gl_PointCoord mediump 2-component vector of float PointCoord)
 0:9        false case
diff --git a/Test/baseResults/preprocessor.simple.vert.out b/Test/baseResults/preprocessor.simple.vert.out
index 8737bc8..8cbabda 100644
--- a/Test/baseResults/preprocessor.simple.vert.out
+++ b/Test/baseResults/preprocessor.simple.vert.out
@@ -19,5 +19,12 @@
   gl_Position = vec4(1);
   gl_Position = vec4(1, 2);
   gl_Position = vec4(fn(3));
+  []. ++ --
+  + - * % / - ! ~
+  << >> < > <= >=
+  == !=
+  & ^ | && ^^ || ? :
+  += -= *= /= %= <<= >>= &= |= ^=
+  1.2 2E10 5u - 5 lf
 }
 
diff --git a/Test/baseResults/spv.450.tesc.out b/Test/baseResults/spv.450.tesc.out
index c6c08b2..95eda65 100755
--- a/Test/baseResults/spv.450.tesc.out
+++ b/Test/baseResults/spv.450.tesc.out
@@ -7,12 +7,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 17
+// Id's are bound by 24
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 9 16
+                              EntryPoint TessellationControl 4  "main" 9 16 20 23
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 450
                               Name 4  "main"
@@ -25,12 +25,42 @@
                               MemberName 11(TheBlock) 1  "bMem2"
                               MemberName 11(TheBlock) 2  "s"
                               Name 16  "tcBlock"
+                              Name 17  "S"
+                              MemberName 17(S) 0  "sMem1"
+                              MemberName 17(S) 1  "sMem2"
+                              Name 18  "SingleBlock"
+                              MemberName 18(SingleBlock) 0  "bMem1"
+                              MemberName 18(SingleBlock) 1  "bMem2"
+                              MemberName 18(SingleBlock) 2  "s"
+                              Name 20  "singleBlock"
+                              Name 21  "bn"
+                              MemberName 21(bn) 0  "v1"
+                              MemberName 21(bn) 1  "v2"
+                              MemberName 21(bn) 2  "v3"
+                              Name 23  ""
                               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 18(SingleBlock) 0 Patch
+                              MemberDecorate 18(SingleBlock) 0 Location 2
+                              MemberDecorate 18(SingleBlock) 1 Patch
+                              MemberDecorate 18(SingleBlock) 1 Location 3
+                              MemberDecorate 18(SingleBlock) 2 Patch
+                              MemberDecorate 18(SingleBlock) 2 Location 4
+                              Decorate 18(SingleBlock) Block
+                              Decorate 20(singleBlock) Location 2
+                              MemberDecorate 21(bn) 0 Patch
+                              MemberDecorate 21(bn) 0 Location 20
+                              MemberDecorate 21(bn) 0 Component 0
+                              MemberDecorate 21(bn) 1 Patch
+                              MemberDecorate 21(bn) 1 Location 24
+                              MemberDecorate 21(bn) 2 Patch
+                              MemberDecorate 21(bn) 2 Location 25
+                              MemberDecorate 21(bn) 2 Component 0
+                              Decorate 21(bn) Block
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -44,6 +74,13 @@
               14:             TypeArray 11(TheBlock) 13
               15:             TypePointer Output 14
      16(tcBlock):     15(ptr) Variable Output
+           17(S):             TypeStruct 6(float) 6(float)
+ 18(SingleBlock):             TypeStruct 6(float) 6(float) 17(S)
+              19:             TypePointer Output 18(SingleBlock)
+ 20(singleBlock):     19(ptr) Variable Output
+          21(bn):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4)
+              22:             TypePointer Output 21(bn)
+              23:     22(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
                               Return
diff --git a/Test/baseResults/uint.frag.out b/Test/baseResults/uint.frag.out
index dbe9578..1ee2825 100644
--- a/Test/baseResults/uint.frag.out
+++ b/Test/baseResults/uint.frag.out
@@ -113,7 +113,7 @@
 0:55        true case
 0:56        move second child to first child (temp mediump 4-component vector of uint)
 0:56          'c' (out mediump 4-component vector of uint)
-0:56          texture (global lowp 4-component vector of uint)
+0:56          texture (global lowp 4-component vector of uint, operation at highp)
 0:56            'usampler' (uniform lowp usampler2D)
 0:56            'tc' (smooth in highp 2-component vector of float)
 0:57      Test condition and select (temp void)
@@ -124,7 +124,7 @@
 0:57        true case
 0:58        move second child to first child (temp mediump 4-component vector of uint)
 0:58          'c' (out mediump 4-component vector of uint)
-0:58          texture (global lowp 4-component vector of uint)
+0:58          texture (global lowp 4-component vector of uint, operation at highp)
 0:58            'usampler' (uniform lowp usampler2D)
 0:58            add (temp highp 2-component vector of float)
 0:58              'tc' (smooth in highp 2-component vector of float)
@@ -139,7 +139,7 @@
 0:59        true case
 0:60        move second child to first child (temp mediump 4-component vector of uint)
 0:60          'c' (out mediump 4-component vector of uint)
-0:60          texture (global lowp 4-component vector of uint)
+0:60          texture (global lowp 4-component vector of uint, operation at highp)
 0:60            'usampler' (uniform lowp usampler2D)
 0:60            subtract (temp highp 2-component vector of float)
 0:60              'tc' (smooth in highp 2-component vector of float)
@@ -412,7 +412,7 @@
 0:55        true case
 0:56        move second child to first child (temp mediump 4-component vector of uint)
 0:56          'c' (out mediump 4-component vector of uint)
-0:56          texture (global lowp 4-component vector of uint)
+0:56          texture (global lowp 4-component vector of uint, operation at highp)
 0:56            'usampler' (uniform lowp usampler2D)
 0:56            'tc' (smooth in highp 2-component vector of float)
 0:57      Test condition and select (temp void)
@@ -423,7 +423,7 @@
 0:57        true case
 0:58        move second child to first child (temp mediump 4-component vector of uint)
 0:58          'c' (out mediump 4-component vector of uint)
-0:58          texture (global lowp 4-component vector of uint)
+0:58          texture (global lowp 4-component vector of uint, operation at highp)
 0:58            'usampler' (uniform lowp usampler2D)
 0:58            add (temp highp 2-component vector of float)
 0:58              'tc' (smooth in highp 2-component vector of float)
@@ -438,7 +438,7 @@
 0:59        true case
 0:60        move second child to first child (temp mediump 4-component vector of uint)
 0:60          'c' (out mediump 4-component vector of uint)
-0:60          texture (global lowp 4-component vector of uint)
+0:60          texture (global lowp 4-component vector of uint, operation at highp)
 0:60            'usampler' (uniform lowp usampler2D)
 0:60            subtract (temp highp 2-component vector of float)
 0:60              'tc' (smooth in highp 2-component vector of float)
diff --git a/Test/hlsl.gatherRGBA.array.dx10.frag b/Test/hlsl.gatherRGBA.array.dx10.frag
new file mode 100644
index 0000000..279b6d6
--- /dev/null
+++ b/Test/hlsl.gatherRGBA.array.dx10.frag
@@ -0,0 +1,71 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d;
+
+uniform Texture1DArray <float4> g_tTex1df4a : register(t0);
+Texture1DArray <int4>   g_tTex1di4a;
+Texture1DArray <uint4>  g_tTex1du4a;
+
+Texture2DArray <float4> g_tTex2df4a;
+Texture2DArray <int4>   g_tTex2di4a;
+Texture2DArray <uint4>  g_tTex2du4a;
+
+TextureCubeArray <float4> g_tTexcdf4a;
+TextureCubeArray <int4>   g_tTexcdi4a;
+TextureCubeArray <uint4>  g_tTexcdu4a;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   // no 1D gathers
+
+   float4 txval00 = g_tTex2df4a . GatherRed(g_sSamp, c3);
+   int4   txval01 = g_tTex2di4a . GatherRed(g_sSamp, c3);
+   uint4  txval02 = g_tTex2du4a . GatherRed(g_sSamp, c3);
+
+   float4 txval10 = g_tTex2df4a . GatherGreen(g_sSamp, c3);
+   int4   txval11 = g_tTex2di4a . GatherGreen(g_sSamp, c3);
+   uint4  txval12 = g_tTex2du4a . GatherGreen(g_sSamp, c3);
+
+   float4 txval20 = g_tTex2df4a . GatherBlue(g_sSamp, c3);
+   int4   txval21 = g_tTex2di4a . GatherBlue(g_sSamp, c3);
+   uint4  txval22 = g_tTex2du4a . GatherBlue(g_sSamp, c3);
+
+   float4 txval30 = g_tTex2df4a . GatherAlpha(g_sSamp, c3);
+   int4   txval31 = g_tTex2di4a . GatherAlpha(g_sSamp, c3);
+   uint4  txval32 = g_tTex2du4a . GatherAlpha(g_sSamp, c3);
+
+   // no 3D gathers
+
+   float4 txval40 = g_tTexcdf4a . GatherRed(g_sSamp, c4);
+   int4   txval41 = g_tTexcdi4a . GatherRed(g_sSamp, c4);
+   uint4  txval42 = g_tTexcdu4a . GatherRed(g_sSamp, c4);
+
+   float4 txval50 = g_tTexcdf4a . GatherGreen(g_sSamp, c4);
+   int4   txval51 = g_tTexcdi4a . GatherGreen(g_sSamp, c4);
+   uint4  txval52 = g_tTexcdu4a . GatherGreen(g_sSamp, c4);
+
+   float4 txval60 = g_tTexcdf4a . GatherBlue(g_sSamp, c4);
+   int4   txval61 = g_tTexcdi4a . GatherBlue(g_sSamp, c4);
+   uint4  txval62 = g_tTexcdu4a . GatherBlue(g_sSamp, c4);
+
+   float4 txval70 = g_tTexcdf4a . GatherAlpha(g_sSamp, c4);
+   int4   txval71 = g_tTexcdi4a . GatherAlpha(g_sSamp, c4);
+   uint4  txval72 = g_tTexcdu4a . GatherAlpha(g_sSamp, c4);
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.gatherRGBA.basic.dx10.frag b/Test/hlsl.gatherRGBA.basic.dx10.frag
new file mode 100644
index 0000000..17fae19
--- /dev/null
+++ b/Test/hlsl.gatherRGBA.basic.dx10.frag
@@ -0,0 +1,77 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d;
+
+Texture1D          g_tTex1df4a : register(t1);
+
+uniform Texture1D <float4> g_tTex1df4 : register(t0);
+Texture1D <int4>   g_tTex1di4;
+Texture1D <uint4>  g_tTex1du4;
+
+Texture2D <float4> g_tTex2df4;
+Texture2D <int4>   g_tTex2di4;
+Texture2D <uint4>  g_tTex2du4;
+
+Texture3D <float4> g_tTex3df4;
+Texture3D <int4>   g_tTex3di4;
+Texture3D <uint4>  g_tTex3du4;
+
+TextureCube <float4> g_tTexcdf4;
+TextureCube <int4>   g_tTexcdi4;
+TextureCube <uint4>  g_tTexcdu4;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   // no 1D gathers
+
+   float4 txval00 = g_tTex2df4 . GatherRed(g_sSamp, c2);
+   int4   txval01 = g_tTex2di4 . GatherRed(g_sSamp, c2);
+   uint4  txval02 = g_tTex2du4 . GatherRed(g_sSamp, c2);
+
+   float4 txval10 = g_tTex2df4 . GatherGreen(g_sSamp, c2);
+   int4   txval11 = g_tTex2di4 . GatherGreen(g_sSamp, c2);
+   uint4  txval12 = g_tTex2du4 . GatherGreen(g_sSamp, c2);
+
+   float4 txval20 = g_tTex2df4 . GatherBlue(g_sSamp, c2);
+   int4   txval21 = g_tTex2di4 . GatherBlue(g_sSamp, c2);
+   uint4  txval22 = g_tTex2du4 . GatherBlue(g_sSamp, c2);
+
+   float4 txval30 = g_tTex2df4 . GatherAlpha(g_sSamp, c2);
+   int4   txval31 = g_tTex2di4 . GatherAlpha(g_sSamp, c2);
+   uint4  txval32 = g_tTex2du4 . GatherAlpha(g_sSamp, c2);
+
+   // no 3D gathers
+
+   float4 txval40 = g_tTexcdf4 . GatherRed(g_sSamp, c3);
+   int4   txval41 = g_tTexcdi4 . GatherRed(g_sSamp, c3);
+   uint4  txval42 = g_tTexcdu4 . GatherRed(g_sSamp, c3);
+
+   float4 txval50 = g_tTexcdf4 . GatherGreen(g_sSamp, c3);
+   int4   txval51 = g_tTexcdi4 . GatherGreen(g_sSamp, c3);
+   uint4  txval52 = g_tTexcdu4 . GatherGreen(g_sSamp, c3);
+
+   float4 txval60 = g_tTexcdf4 . GatherBlue(g_sSamp, c3);
+   int4   txval61 = g_tTexcdi4 . GatherBlue(g_sSamp, c3);
+   uint4  txval62 = g_tTexcdu4 . GatherBlue(g_sSamp, c3);
+
+   float4 txval70 = g_tTexcdf4 . GatherAlpha(g_sSamp, c3);
+   int4   txval71 = g_tTexcdi4 . GatherAlpha(g_sSamp, c3);
+   uint4  txval72 = g_tTexcdu4 . GatherAlpha(g_sSamp, c3);
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.gatherRGBA.offset.dx10.frag b/Test/hlsl.gatherRGBA.offset.dx10.frag
new file mode 100644
index 0000000..a8909b4
--- /dev/null
+++ b/Test/hlsl.gatherRGBA.offset.dx10.frag
@@ -0,0 +1,116 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d;
+
+Texture1D          g_tTex1df4a : register(t1);
+
+uniform Texture1D <float4> g_tTex1df4 : register(t0);
+Texture1D <int4>   g_tTex1di4;
+Texture1D <uint4>  g_tTex1du4;
+
+Texture2D <float4> g_tTex2df4;
+Texture2D <int4>   g_tTex2di4;
+Texture2D <uint4>  g_tTex2du4;
+
+Texture3D <float4> g_tTex3df4;
+Texture3D <int4>   g_tTex3di4;
+Texture3D <uint4>  g_tTex3du4;
+
+TextureCube <float4> g_tTexcdf4;
+TextureCube <int4>   g_tTexcdi4;
+TextureCube <uint4>  g_tTexcdu4;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+uniform int  o1;
+uniform int2 o2;
+uniform int3 o3;
+uniform int4 o4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   uint status;
+
+   // no 1D gathers
+
+   float4 txval001 = g_tTex2df4 . GatherRed(g_sSamp, c2, o2);
+   int4   txval011 = g_tTex2di4 . GatherRed(g_sSamp, c2, o2);
+   uint4  txval021 = g_tTex2du4 . GatherRed(g_sSamp, c2, o2);
+
+   float4 txval004 = g_tTex2df4 . GatherRed(g_sSamp, c2, o2, o2, o2, o2);
+   int4   txval014 = g_tTex2di4 . GatherRed(g_sSamp, c2, o2, o2, o2, o2);
+   uint4  txval024 = g_tTex2du4 . GatherRed(g_sSamp, c2, o2, o2, o2, o2);
+   
+   // float4 txval00s = g_tTex2df4 . GatherRed(g_sSamp, c2, o2, status);
+   // int4   txval01s = g_tTex2di4 . GatherRed(g_sSamp, c2, o2, status);
+   // uint4  txval02s = g_tTex2du4 . GatherRed(g_sSamp, c2, o2, status);
+
+   // float4 txval004s = g_tTex2df4 . GatherRed(g_sSamp, c2, o2, o2, o2, o2, status);
+   // int4   txval014s = g_tTex2di4 . GatherRed(g_sSamp, c2, o2, o2, o2, o2, status);
+   // uint4  txval024s = g_tTex2du4 . GatherRed(g_sSamp, c2, o2, o2, o2, o2, status);
+
+   float4 txval101 = g_tTex2df4 . GatherGreen(g_sSamp, c2, o2);
+   int4   txval111 = g_tTex2di4 . GatherGreen(g_sSamp, c2, o2);
+   uint4  txval121 = g_tTex2du4 . GatherGreen(g_sSamp, c2, o2);
+
+   float4 txval104 = g_tTex2df4 . GatherGreen(g_sSamp, c2, o2, o2, o2, o2);
+   int4   txval114 = g_tTex2di4 . GatherGreen(g_sSamp, c2, o2, o2, o2, o2);
+   uint4  txval124 = g_tTex2du4 . GatherGreen(g_sSamp, c2, o2, o2, o2, o2);
+
+   // float4 txval10s = g_tTex2df4 . GatherGreen(g_sSamp, c2, o2, status);
+   // int4   txval11s = g_tTex2di4 . GatherGreen(g_sSamp, c2, o2, status);
+   // uint4  txval12s = g_tTex2du4 . GatherGreen(g_sSamp, c2, o2, status);
+
+   // float4 txval104 = g_tTex2df4 . GatherGreen(g_sSamp, c2, o2, o2, o2, o2, status);
+   // int4   txval114 = g_tTex2di4 . GatherGreen(g_sSamp, c2, o2, o2, o2, o2, status);
+   // uint4  txval124 = g_tTex2du4 . GatherGreen(g_sSamp, c2, o2, o2, o2, o2, status);
+
+   float4 txval201 = g_tTex2df4 . GatherBlue(g_sSamp, c2, o2);
+   int4   txval211 = g_tTex2di4 . GatherBlue(g_sSamp, c2, o2);
+   uint4  txval221 = g_tTex2du4 . GatherBlue(g_sSamp, c2, o2);
+
+   float4 txval204 = g_tTex2df4 . GatherBlue(g_sSamp, c2, o2, o2, o2, o2);
+   int4   txval214 = g_tTex2di4 . GatherBlue(g_sSamp, c2, o2, o2, o2, o2);
+   uint4  txval224 = g_tTex2du4 . GatherBlue(g_sSamp, c2, o2, o2, o2, o2);
+
+   // float4 txval204s = g_tTex2df4 . GatherBlue(g_sSamp, c2, o2, o2, o2, o2, status);
+   // int4   txval214s = g_tTex2di4 . GatherBlue(g_sSamp, c2, o2, o2, o2, o2, status);
+   // uint4  txval224s = g_tTex2du4 . GatherBlue(g_sSamp, c2, o2, o2, o2, o2, status);
+
+   // float4 txval20s = g_tTex2df4 . GatherBlue(g_sSamp, c2, o2, status);
+   // int4   txval21s = g_tTex2di4 . GatherBlue(g_sSamp, c2, o2, status);
+   // uint4  txval22s = g_tTex2du4 . GatherBlue(g_sSamp, c2, o2, status);
+
+   float4 txval301 = g_tTex2df4 . GatherAlpha(g_sSamp, c2, o2);
+   int4   txval311 = g_tTex2di4 . GatherAlpha(g_sSamp, c2, o2);
+   uint4  txval321 = g_tTex2du4 . GatherAlpha(g_sSamp, c2, o2);
+
+   float4 txval304 = g_tTex2df4 . GatherAlpha(g_sSamp, c2, o2, o2, o2, o2);
+   int4   txval314 = g_tTex2di4 . GatherAlpha(g_sSamp, c2, o2, o2, o2, o2);
+   uint4  txval324 = g_tTex2du4 . GatherAlpha(g_sSamp, c2, o2, o2, o2, o2);
+
+   // float4 txval304s = g_tTex2df4 . GatherAlpha(g_sSamp, c2, o2, o2, o2, o2, status);
+   // int4   txval314s = g_tTex2di4 . GatherAlpha(g_sSamp, c2, o2, o2, o2, o2, status);
+   // uint4  txval324s = g_tTex2du4 . GatherAlpha(g_sSamp, c2, o2, o2, o2, o2, status);
+
+   // float4 txval30s = g_tTex2df4 . GatherAlpha(g_sSamp, c2, o2, status);
+   // int4   txval31s = g_tTex2di4 . GatherAlpha(g_sSamp, c2, o2, status);
+   // uint4  txval32s = g_tTex2du4 . GatherAlpha(g_sSamp, c2, o2, status);
+
+   // no 3D gathers with offset
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.gatherRGBA.offsetarray.dx10.frag b/Test/hlsl.gatherRGBA.offsetarray.dx10.frag
new file mode 100644
index 0000000..ca32f56
--- /dev/null
+++ b/Test/hlsl.gatherRGBA.offsetarray.dx10.frag
@@ -0,0 +1,110 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d;
+
+uniform Texture1DArray <float4> g_tTex1df4a : register(t0);
+Texture1DArray <int4>   g_tTex1di4a;
+Texture1DArray <uint4>  g_tTex1du4a;
+
+Texture2DArray <float4> g_tTex2df4a;
+Texture2DArray <int4>   g_tTex2di4a;
+Texture2DArray <uint4>  g_tTex2du4a;
+
+TextureCubeArray <float4> g_tTexcdf4a;
+TextureCubeArray <int4>   g_tTexcdi4a;
+TextureCubeArray <uint4>  g_tTexcdu4a;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+uniform int  o1;
+uniform int2 o2;
+uniform int3 o3;
+uniform int4 o4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   uint status;
+
+   // no 1D gathers
+
+   float4 txval001 = g_tTex2df4a . GatherRed(g_sSamp, c3, o2);
+   int4   txval011 = g_tTex2di4a . GatherRed(g_sSamp, c3, o2);
+   uint4  txval021 = g_tTex2du4a . GatherRed(g_sSamp, c3, o2);
+
+   float4 txval004 = g_tTex2df4a . GatherRed(g_sSamp, c3, o2, o2, o2, o2);
+   int4   txval014 = g_tTex2di4a . GatherRed(g_sSamp, c3, o2, o2, o2, o2);
+   uint4  txval024 = g_tTex2du4a . GatherRed(g_sSamp, c3, o2, o2, o2, o2);
+   
+   // float4 txval00s = g_tTex2df4a . GatherRed(g_sSamp, c3, o2, status);
+   // int4   txval01s = g_tTex2di4a . GatherRed(g_sSamp, c3, o2, status);
+   // uint4  txval02s = g_tTex2du4a . GatherRed(g_sSamp, c3, o2, status);
+
+   // float4 txval004s = g_tTex2df4a . GatherRed(g_sSamp, c3, o2, o2, o2, o2, status);
+   // int4   txval014s = g_tTex2di4a . GatherRed(g_sSamp, c3, o2, o2, o2, o2, status);
+   // uint4  txval024s = g_tTex2du4a . GatherRed(g_sSamp, c3, o2, o2, o2, o2, status);
+
+   float4 txval101 = g_tTex2df4a . GatherGreen(g_sSamp, c3, o2);
+   int4   txval111 = g_tTex2di4a . GatherGreen(g_sSamp, c3, o2);
+   uint4  txval121 = g_tTex2du4a . GatherGreen(g_sSamp, c3, o2);
+
+   float4 txval104 = g_tTex2df4a . GatherGreen(g_sSamp, c3, o2, o2, o2, o2);
+   int4   txval114 = g_tTex2di4a . GatherGreen(g_sSamp, c3, o2, o2, o2, o2);
+   uint4  txval124 = g_tTex2du4a . GatherGreen(g_sSamp, c3, o2, o2, o2, o2);
+
+   // float4 txval10s = g_tTex2df4a . GatherGreen(g_sSamp, c3, o2, status);
+   // int4   txval11s = g_tTex2di4a . GatherGreen(g_sSamp, c3, o2, status);
+   // uint4  txval12s = g_tTex2du4a . GatherGreen(g_sSamp, c3, o2, status);
+
+   // float4 txval104 = g_tTex2df4a . GatherGreen(g_sSamp, c3, o2, o2, o2, o2, status);
+   // int4   txval114 = g_tTex2di4a . GatherGreen(g_sSamp, c3, o2, o2, o2, o2, status);
+   // uint4  txval124 = g_tTex2du4a . GatherGreen(g_sSamp, c3, o2, o2, o2, o2, status);
+
+   float4 txval201 = g_tTex2df4a . GatherBlue(g_sSamp, c3, o2);
+   int4   txval211 = g_tTex2di4a . GatherBlue(g_sSamp, c3, o2);
+   uint4  txval221 = g_tTex2du4a . GatherBlue(g_sSamp, c3, o2);
+
+   float4 txval204 = g_tTex2df4a . GatherBlue(g_sSamp, c3, o2, o2, o2, o2);
+   int4   txval214 = g_tTex2di4a . GatherBlue(g_sSamp, c3, o2, o2, o2, o2);
+   uint4  txval224 = g_tTex2du4a . GatherBlue(g_sSamp, c3, o2, o2, o2, o2);
+
+   // float4 txval204s = g_tTex2df4a . GatherBlue(g_sSamp, c3, o2, o2, o2, o2, status);
+   // int4   txval214s = g_tTex2di4a . GatherBlue(g_sSamp, c3, o2, o2, o2, o2, status);
+   // uint4  txval224s = g_tTex2du4a . GatherBlue(g_sSamp, c3, o2, o2, o2, o2, status);
+
+   // float4 txval20s = g_tTex2df4a . GatherBlue(g_sSamp, c3, o2, status);
+   // int4   txval21s = g_tTex2di4a . GatherBlue(g_sSamp, c3, o2, status);
+   // uint4  txval22s = g_tTex2du4a . GatherBlue(g_sSamp, c3, o2, status);
+
+   float4 txval301 = g_tTex2df4a . GatherAlpha(g_sSamp, c3, o2);
+   int4   txval311 = g_tTex2di4a . GatherAlpha(g_sSamp, c3, o2);
+   uint4  txval321 = g_tTex2du4a . GatherAlpha(g_sSamp, c3, o2);
+
+   float4 txval304 = g_tTex2df4a . GatherAlpha(g_sSamp, c3, o2, o2, o2, o2);
+   int4   txval314 = g_tTex2di4a . GatherAlpha(g_sSamp, c3, o2, o2, o2, o2);
+   uint4  txval324 = g_tTex2du4a . GatherAlpha(g_sSamp, c3, o2, o2, o2, o2);
+
+   // float4 txval304s = g_tTex2df4a . GatherAlpha(g_sSamp, c3, o2, o2, o2, o2, status);
+   // int4   txval314s = g_tTex2di4a . GatherAlpha(g_sSamp, c3, o2, o2, o2, o2, status);
+   // uint4  txval324s = g_tTex2du4a . GatherAlpha(g_sSamp, c3, o2, o2, o2, o2, status);
+
+   // float4 txval30s = g_tTex2df4a . GatherAlpha(g_sSamp, c3, o2, status);
+   // int4   txval31s = g_tTex2di4a . GatherAlpha(g_sSamp, c3, o2, status);
+   // uint4  txval32s = g_tTex2du4a . GatherAlpha(g_sSamp, c3, o2, status);
+
+   // no 3D gathers with offset
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.gathercmpRGBA.array.dx10.frag b/Test/hlsl.gathercmpRGBA.array.dx10.frag
new file mode 100644
index 0000000..4ed7f4b
--- /dev/null
+++ b/Test/hlsl.gathercmpRGBA.array.dx10.frag
@@ -0,0 +1,70 @@
+SamplerComparisonState  g_sSampCmp : register(s0);
+
+uniform Texture1DArray <float4> g_tTex1df4a : register(t0);
+Texture1DArray <int4>   g_tTex1di4a;
+Texture1DArray <uint4>  g_tTex1du4a;
+
+Texture2DArray <float4> g_tTex2df4a;
+Texture2DArray <int4>   g_tTex2di4a;
+Texture2DArray <uint4>  g_tTex2du4a;
+
+TextureCubeArray <float4> g_tTexcdf4a;
+TextureCubeArray <int4>   g_tTexcdi4a;
+TextureCubeArray <uint4>  g_tTexcdu4a;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   // no 1D gathers
+
+   float4 txval00 = g_tTex2df4a . GatherCmpRed(g_sSampCmp, c3, .75);
+   int4   txval01 = g_tTex2di4a . GatherCmpRed(g_sSampCmp, c3, .75);
+   uint4  txval02 = g_tTex2du4a . GatherCmpRed(g_sSampCmp, c3, .75);
+
+   float4 txval10 = g_tTex2df4a . GatherCmpGreen(g_sSampCmp, c3, .75);
+   int4   txval11 = g_tTex2di4a . GatherCmpGreen(g_sSampCmp, c3, .75);
+   uint4  txval12 = g_tTex2du4a . GatherCmpGreen(g_sSampCmp, c3, .75);
+
+   float4 txval20 = g_tTex2df4a . GatherCmpBlue(g_sSampCmp, c3, .75);
+   int4   txval21 = g_tTex2di4a . GatherCmpBlue(g_sSampCmp, c3, .75);
+   uint4  txval22 = g_tTex2du4a . GatherCmpBlue(g_sSampCmp, c3, .75);
+
+   float4 txval30 = g_tTex2df4a . GatherCmpAlpha(g_sSampCmp, c3, .75);
+   int4   txval31 = g_tTex2di4a . GatherCmpAlpha(g_sSampCmp, c3, .75);
+   uint4  txval32 = g_tTex2du4a . GatherCmpAlpha(g_sSampCmp, c3, .75);
+
+   // no 3D gathers
+
+   float4 txval40 = g_tTexcdf4a . GatherCmpRed(g_sSampCmp, c4, .75);
+   int4   txval41 = g_tTexcdi4a . GatherCmpRed(g_sSampCmp, c4, .75);
+   uint4  txval42 = g_tTexcdu4a . GatherCmpRed(g_sSampCmp, c4, .75);
+
+   float4 txval50 = g_tTexcdf4a . GatherCmpGreen(g_sSampCmp, c4, .75);
+   int4   txval51 = g_tTexcdi4a . GatherCmpGreen(g_sSampCmp, c4, .75);
+   uint4  txval52 = g_tTexcdu4a . GatherCmpGreen(g_sSampCmp, c4, .75);
+
+   float4 txval60 = g_tTexcdf4a . GatherCmpBlue(g_sSampCmp, c4, .75);
+   int4   txval61 = g_tTexcdi4a . GatherCmpBlue(g_sSampCmp, c4, .75);
+   uint4  txval62 = g_tTexcdu4a . GatherCmpBlue(g_sSampCmp, c4, .75);
+
+   float4 txval70 = g_tTexcdf4a . GatherCmpAlpha(g_sSampCmp, c4, .75);
+   int4   txval71 = g_tTexcdi4a . GatherCmpAlpha(g_sSampCmp, c4, .75);
+   uint4  txval72 = g_tTexcdu4a . GatherCmpAlpha(g_sSampCmp, c4, .75);
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.gathercmpRGBA.basic.dx10.frag b/Test/hlsl.gathercmpRGBA.basic.dx10.frag
new file mode 100644
index 0000000..9dc1631
--- /dev/null
+++ b/Test/hlsl.gathercmpRGBA.basic.dx10.frag
@@ -0,0 +1,76 @@
+SamplerComparisonState     g_sSampCmp : register(s0);
+
+Texture1D          g_tTex1df4a : register(t1);
+
+uniform Texture1D <float4> g_tTex1df4 : register(t0);
+Texture1D <int4>   g_tTex1di4;
+Texture1D <uint4>  g_tTex1du4;
+
+Texture2D <float4> g_tTex2df4;
+Texture2D <int4>   g_tTex2di4;
+Texture2D <uint4>  g_tTex2du4;
+
+Texture3D <float4> g_tTex3df4;
+Texture3D <int4>   g_tTex3di4;
+Texture3D <uint4>  g_tTex3du4;
+
+TextureCube <float4> g_tTexcdf4;
+TextureCube <int4>   g_tTexcdi4;
+TextureCube <uint4>  g_tTexcdu4;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   // no 1D gathers
+
+   float4 txval00 = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75);
+   int4   txval01 = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75);
+   uint4  txval02 = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75);
+
+   float4 txval10 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75);
+   int4   txval11 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75);
+   uint4  txval12 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75);
+
+   float4 txval20 = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75);
+   int4   txval21 = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75);
+   uint4  txval22 = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75);
+
+   float4 txval30 = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75);
+   int4   txval31 = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75);
+   uint4  txval32 = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75);
+
+   // no 3D gathers
+
+   float4 txval40 = g_tTexcdf4 . GatherCmpRed(g_sSampCmp, c3, 0.75);
+   int4   txval41 = g_tTexcdi4 . GatherCmpRed(g_sSampCmp, c3, 0.75);
+   uint4  txval42 = g_tTexcdu4 . GatherCmpRed(g_sSampCmp, c3, 0.75);
+
+   float4 txval50 = g_tTexcdf4 . GatherCmpGreen(g_sSampCmp, c3, 0.75);
+   int4   txval51 = g_tTexcdi4 . GatherCmpGreen(g_sSampCmp, c3, 0.75);
+   uint4  txval52 = g_tTexcdu4 . GatherCmpGreen(g_sSampCmp, c3, 0.75);
+
+   float4 txval60 = g_tTexcdf4 . GatherCmpBlue(g_sSampCmp, c3, 0.75);
+   int4   txval61 = g_tTexcdi4 . GatherCmpBlue(g_sSampCmp, c3, 0.75);
+   uint4  txval62 = g_tTexcdu4 . GatherCmpBlue(g_sSampCmp, c3, 0.75);
+
+   float4 txval70 = g_tTexcdf4 . GatherCmpAlpha(g_sSampCmp, c3, 0.75);
+   int4   txval71 = g_tTexcdi4 . GatherCmpAlpha(g_sSampCmp, c3, 0.75);
+   uint4  txval72 = g_tTexcdu4 . GatherCmpAlpha(g_sSampCmp, c3, 0.75);
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.gathercmpRGBA.offset.dx10.frag b/Test/hlsl.gathercmpRGBA.offset.dx10.frag
new file mode 100644
index 0000000..3a6fbb7
--- /dev/null
+++ b/Test/hlsl.gathercmpRGBA.offset.dx10.frag
@@ -0,0 +1,115 @@
+SamplerComparisonState g_sSampCmp : register(s0);
+
+Texture1D          g_tTex1df4a : register(t1);
+
+uniform Texture1D <float4> g_tTex1df4 : register(t0);
+Texture1D <int4>   g_tTex1di4;
+Texture1D <uint4>  g_tTex1du4;
+
+Texture2D <float4> g_tTex2df4;
+Texture2D <int4>   g_tTex2di4;
+Texture2D <uint4>  g_tTex2du4;
+
+Texture3D <float4> g_tTex3df4;
+Texture3D <int4>   g_tTex3di4;
+Texture3D <uint4>  g_tTex3du4;
+
+TextureCube <float4> g_tTexcdf4;
+TextureCube <int4>   g_tTexcdi4;
+TextureCube <uint4>  g_tTexcdu4;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+uniform int  o1;
+uniform int2 o2;
+uniform int3 o3;
+uniform int4 o4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   uint status;
+
+   // no 1D gathers
+
+   float4 txval001 = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2);
+   int4   txval011 = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2);
+   uint4  txval021 = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2);
+
+   float4 txval004 = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   int4   txval014 = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   uint4  txval024 = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   
+   // float4 txval00s = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, status);
+   // int4   txval01s = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, status);
+   // uint4  txval02s = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, status);
+
+   // float4 txval004s = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // int4   txval014s = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval024s = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+
+   float4 txval101 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2);
+   int4   txval111 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2);
+   uint4  txval121 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2);
+
+   float4 txval104 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   int4   txval114 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   uint4  txval124 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+
+   // float4 txval10s = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, status);
+   // int4   txval11s = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, status);
+   // uint4  txval12s = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, status);
+
+   // float4 txval104 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // int4   txval114 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval124 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+
+   float4 txval201 = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2);
+   int4   txval211 = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2);
+   uint4  txval221 = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2);
+
+   float4 txval204 = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   int4   txval214 = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   uint4  txval224 = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+
+   // float4 txval204s = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // int4   txval214s = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval224s = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+
+   // float4 txval20s = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, status);
+   // int4   txval21s = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, status);
+   // uint4  txval22s = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, status);
+
+   float4 txval301 = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2);
+   int4   txval311 = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2);
+   uint4  txval321 = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2);
+
+   float4 txval304 = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   int4   txval314 = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   uint4  txval324 = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+
+   // float4 txval304s = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // int4   txval314s = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval324s = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
+
+   // float4 txval30s = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, status);
+   // int4   txval31s = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, status);
+   // uint4  txval32s = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, status);
+
+   // no 3D gathers with offset
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.gathercmpRGBA.offsetarray.dx10.frag b/Test/hlsl.gathercmpRGBA.offsetarray.dx10.frag
new file mode 100644
index 0000000..11131bc
--- /dev/null
+++ b/Test/hlsl.gathercmpRGBA.offsetarray.dx10.frag
@@ -0,0 +1,109 @@
+SamplerComparisonState g_sSampCmp : register(s0);
+
+uniform Texture1DArray <float4> g_tTex1df4a : register(t0);
+Texture1DArray <int4>   g_tTex1di4a;
+Texture1DArray <uint4>  g_tTex1du4a;
+
+Texture2DArray <float4> g_tTex2df4a;
+Texture2DArray <int4>   g_tTex2di4a;
+Texture2DArray <uint4>  g_tTex2du4a;
+
+TextureCubeArray <float4> g_tTexcdf4a;
+TextureCubeArray <int4>   g_tTexcdi4a;
+TextureCubeArray <uint4>  g_tTexcdu4a;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+uniform float  c1;
+uniform float2 c2;
+uniform float3 c3;
+uniform float4 c4;
+
+uniform int  o1;
+uniform int2 o2;
+uniform int3 o3;
+uniform int4 o4;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   uint status;
+
+   // no 1D gathers
+
+   float4 txval001 = g_tTex2df4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2);
+   int4   txval011 = g_tTex2di4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2);
+   uint4  txval021 = g_tTex2du4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2);
+
+   float4 txval004 = g_tTex2df4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   int4   txval014 = g_tTex2di4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   uint4  txval024 = g_tTex2du4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   
+   // float4 txval00s = g_tTex2df4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, status);
+   // int4   txval01s = g_tTex2di4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, status);
+   // uint4  txval02s = g_tTex2du4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, status);
+
+   // float4 txval004s = g_tTex2df4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // int4   txval014s = g_tTex2di4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval024s = g_tTex2du4a . GatherCmpRed(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+
+   float4 txval101 = g_tTex2df4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2);
+   int4   txval111 = g_tTex2di4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2);
+   uint4  txval121 = g_tTex2du4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2);
+
+   float4 txval104 = g_tTex2df4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   int4   txval114 = g_tTex2di4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   uint4  txval124 = g_tTex2du4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+
+   // float4 txval10s = g_tTex2df4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, status);
+   // int4   txval11s = g_tTex2di4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, status);
+   // uint4  txval12s = g_tTex2du4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, status);
+
+   // float4 txval104 = g_tTex2df4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // int4   txval114 = g_tTex2di4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval124 = g_tTex2du4a . GatherCmpGreen(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+
+   float4 txval201 = g_tTex2df4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2);
+   int4   txval211 = g_tTex2di4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2);
+   uint4  txval221 = g_tTex2du4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2);
+
+   float4 txval204 = g_tTex2df4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   int4   txval214 = g_tTex2di4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   uint4  txval224 = g_tTex2du4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+
+   // float4 txval204s = g_tTex2df4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // int4   txval214s = g_tTex2di4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval224s = g_tTex2du4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+
+   // float4 txval20s = g_tTex2df4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, status);
+   // int4   txval21s = g_tTex2di4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, status);
+   // uint4  txval22s = g_tTex2du4a . GatherCmpBlue(g_sSampCmp, c3, 0.75, o2, status);
+
+   float4 txval301 = g_tTex2df4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2);
+   int4   txval311 = g_tTex2di4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2);
+   uint4  txval321 = g_tTex2du4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2);
+
+   float4 txval304 = g_tTex2df4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   int4   txval314 = g_tTex2di4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+   uint4  txval324 = g_tTex2du4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, o2, o2, o2);
+
+   // float4 txval304s = g_tTex2df4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // int4   txval314s = g_tTex2di4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+   // uint4  txval324s = g_tTex2du4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, o2, o2, o2, status);
+
+   // float4 txval30s = g_tTex2df4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, status);
+   // int4   txval31s = g_tTex2di4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, status);
+   // uint4  txval32s = g_tTex2du4a . GatherCmpAlpha(g_sSampCmp, c3, 0.75, o2, status);
+
+   // no 3D gathers with offset
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/hlsl.intrinsics.negative.comp b/Test/hlsl.intrinsics.negative.comp
index c89d04b..fe612d6 100644
--- a/Test/hlsl.intrinsics.negative.comp
+++ b/Test/hlsl.intrinsics.negative.comp
@@ -4,49 +4,49 @@
 
     // AllMemoryBarrier();              // invalid in fragment stage  TODO: parser currently crashes on empty arg list
     // AllMemoryBarrierWithGroupSync(); // invalid in fragment stage  TODO: parser currently crashes on empty arg list
-    asdouble(inF0, inF1);                     // expected error: only integer inputs
-    CheckAccessFullyMapped(3.0);              // expected error: only valid on integers
-    clip(inF0);                               // expected error: only valid in pixel stage
-    countbits(inF0);                          // expected error: only integer inputs
-    cross(inF0, inF1);                        // expected error: only on float3 inputs
-    D3DCOLORtoUBYTE4(inF0);                   // expected error: only on float4 inputs
-    ddx(inF0);                                // expected error: only valid in pixel stage
-    ddx_coarse(inF0);                         // expected error: only valid in pixel stage
-    ddx_fine(inF0);                           // expected error: only valid in pixel stage
-    ddy(inF0);                                // expected error: only valid in pixel stage
-    ddy_coarse(inF0);                         // expected error: only valid in pixel stage
-    ddy_fine(inF0);                           // expected error: only valid in pixel stage
-    determinant(inF0);                        // expected error: only valid on mats
-    EvaluateAttributeAtCentroid(inF0);        // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);       // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));  // expected error: only valid in pixel stage
-    f16tof32(inF0);                           // expected error: only integer inputs
-    firstbithigh(inF0);                       // expected error: only integer inputs
-    firstbitlow(inF0);                        // expected error: only integer inputs
+    // asdouble(inF0, inF1);                     // expected error: only integer inputs
+    // CheckAccessFullyMapped(3.0);              // expected error: only valid on integers
+    // clip(inF0);                               // expected error: only valid in pixel stage
+    // countbits(inF0);                          // expected error: only integer inputs
+    // cross(inF0, inF1);                        // expected error: only on float3 inputs
+    // D3DCOLORtoUBYTE4(inF0);                   // expected error: only on float4 inputs
+    // ddx(inF0);                                // expected error: only valid in pixel stage
+    // ddx_coarse(inF0);                         // expected error: only valid in pixel stage
+    // ddx_fine(inF0);                           // expected error: only valid in pixel stage
+    // ddy(inF0);                                // expected error: only valid in pixel stage
+    // ddy_coarse(inF0);                         // expected error: only valid in pixel stage
+    // ddy_fine(inF0);                           // expected error: only valid in pixel stage
+    // determinant(inF0);                        // expected error: only valid on mats
+    // EvaluateAttributeAtCentroid(inF0);        // expected error: only interpolant
+    // EvaluateAttributeAtSample(inF0, 2);       // expected error: only interpolant
+    // EvaluateAttributeSnapped(inF0, int2(2));  // expected error: only interpolant
+    // f16tof32(inF0);                           // expected error: only integer inputs
+    // firstbithigh(inF0);                       // expected error: only integer inputs
+    // firstbitlow(inF0);                        // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua, gs_ub, gs_uc, out_u1); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua, gs_ub, out_u1);// expected error: only valid in pixel stage
-    InterlockedMax(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua, gs_ub);              // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua, gs_ub, out_u1);      // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    length(inF0);                             // expect error: invalid on scalars
-    msad4(inF0, float2(0), float4(0));        // expected error: only integer inputs
-    normalize(inF0);                          // expect error: invalid on scalars
-    reflect(inF0, inF1);                      // expect error: invalid on scalars
-    refract(inF0, inF1, inF2);                // expect error: invalid on scalars
-    refract(float2(0), float2(0), float2(0)); // expected error: last parameter only scalar
-    reversebits(inF0);                        // expected error: only integer inputs
-    transpose(inF0);                          // expect error: only valid on mats
+    // fwidth(inF0);                             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua, gs_ub, gs_uc, out_u1); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua, gs_ub, out_u1);// expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua, gs_ub);              // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua, gs_ub, out_u1);      // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // length(inF0);                             // expect error: invalid on scalars
+    // msad4(inF0, float2(0), float4(0));        // expected error: only integer inputs
+    // normalize(inF0);                          // expect error: invalid on scalars
+    // reflect(inF0, inF1);                      // expect error: invalid on scalars
+    // refract(inF0, inF1, inF2);                // expect error: invalid on scalars
+    // refract(float2(0), float2(0), float2(0)); // expected error: last parameter only scalar
+    // reversebits(inF0);                        // expected error: only integer inputs
+    // transpose(inF0);                          // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
@@ -57,7 +57,7 @@
 {
     // TODO: ... add when float1 prototypes are generated
 
-    GetRenderTargetSamplePosition(inF0); // expected error: only integer inputs
+    // GetRenderTargetSamplePosition(inF0); // expected error: only integer inputs
 
     return 0.0;
 }
@@ -66,43 +66,43 @@
 {
     uint2 out_u2;
 
-    asdouble(inF0, inF1);         // expected error: only integer inputs
-    CheckAccessFullyMapped(inF0); // expect error: only valid on scalars
-    countbits(inF0);              // expected error: only integer inputs
-    cross(inF0, inF1);            // expected error: only on float3 inputs
-    D3DCOLORtoUBYTE4(inF0);       // expected error: only on float4 inputs
-    ddx(inF0);                                // only valid in pixel stage
-    ddx_coarse(inF0);                         // only valid in pixel stage
-    ddx_fine(inF0);                           // only valid in pixel stage
-    ddy(inF0);                                // only valid in pixel stage
-    ddy_coarse(inF0);                         // only valid in pixel stage
-    ddy_fine(inF0);                           // only valid in pixel stage
-    determinant(inF0);            // expect error: only valid on mats
-    EvaluateAttributeAtCentroid(inF0);        // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);       // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));  // expected error: only valid in pixel stage
-    f16tof32(inF0);               // expected error: only integer inputs
-    firstbithigh(inF0);           // expected error: only integer inputs
-    firstbitlow(inF0);            // expected error: only integer inputs
+    // asdouble(inF0, inF1);         // expected error: only integer inputs
+    // CheckAccessFullyMapped(inF0); // expect error: only valid on scalars
+    // countbits(inF0);              // expected error: only integer inputs
+    // cross(inF0, inF1);            // expected error: only on float3 inputs
+    // D3DCOLORtoUBYTE4(inF0);       // expected error: only on float4 inputs
+    // ddx(inF0);                                // only valid in pixel stage
+    // ddx_coarse(inF0);                         // only valid in pixel stage
+    // ddx_fine(inF0);                           // only valid in pixel stage
+    // ddy(inF0);                                // only valid in pixel stage
+    // ddy_coarse(inF0);                         // only valid in pixel stage
+    // ddy_fine(inF0);                           // only valid in pixel stage
+    // determinant(inF0);            // expect error: only valid on mats
+    // EvaluateAttributeAtCentroid(inF0);        // expected error: only interpolant
+    // EvaluateAttributeAtSample(inF0, 2);       // expected error: only interpolant
+    // EvaluateAttributeSnapped(inF0, int2(2));  // expected error: only interpolant
+    // f16tof32(inF0);               // expected error: only integer inputs
+    // firstbithigh(inF0);           // expected error: only integer inputs
+    // firstbitlow(inF0);            // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                 // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua2, gs_ub2, gs_uc2, out_u2); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua2, gs_ub2, out_u2);// expected error: only valid in pixel stage
-    InterlockedMax(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua2, gs_ub2);          // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua2, gs_ub2, out_u2);  // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
-    noise(inF0);                  // expected error: only valid in pixel stage
-    reversebits(inF0);            // expected error: only integer inputs
-    transpose(inF0);              // expect error: only valid on mats
+    // fwidth(inF0);                 // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua2, gs_ub2, gs_uc2, out_u2); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua2, gs_ub2, out_u2);// expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua2, gs_ub2);          // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua2, gs_ub2, out_u2);  // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua2, gs_ub2);         // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua2, gs_ub2, out_u2); // expected error: only valid in pixel stage
+    // noise(inF0);                  // expected error: only valid in pixel stage
+    // reversebits(inF0);            // expected error: only integer inputs
+    // transpose(inF0);              // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
@@ -113,41 +113,41 @@
 {
     uint3 out_u3;
 
-    CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
-    countbits(inF0);                                            // expected error: only integer inputs
-    ddx(inF0);                                                  // only valid in pixel stage
-    ddx_coarse(inF0);                                           // only valid in pixel stage
-    ddx_fine(inF0);                                             // only valid in pixel stage
-    ddy(inF0);                                                  // only valid in pixel stage
-    ddy_coarse(inF0);                                           // only valid in pixel stage
-    ddy_fine(inF0);                                             // only valid in pixel stage
-    D3DCOLORtoUBYTE4(inF0);                                     // expected error: only on float4 inputs
-    determinant(inF0);                                          // expect error: only valid on mats
-    EvaluateAttributeAtCentroid(inF0);                          // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);                         // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only valid in pixel stage
-    f16tof32(inF0);                                             // expected error: only integer inputs
-    firstbithigh(inF0);                                         // expected error: only integer inputs
-    firstbitlow(inF0);                                          // expected error: only integer inputs
+    // CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
+    // countbits(inF0);                                            // expected error: only integer inputs
+    // ddx(inF0);                                                  // only valid in pixel stage
+    // ddx_coarse(inF0);                                           // only valid in pixel stage
+    // ddx_fine(inF0);                                             // only valid in pixel stage
+    // ddy(inF0);                                                  // only valid in pixel stage
+    // ddy_coarse(inF0);                                           // only valid in pixel stage
+    // ddy_fine(inF0);                                             // only valid in pixel stage
+    // D3DCOLORtoUBYTE4(inF0);                                     // expected error: only on float4 inputs
+    // determinant(inF0);                                          // expect error: only valid on mats
+    // EvaluateAttributeAtCentroid(inF0);                          // expected error: only interpolant
+    // EvaluateAttributeAtSample(inF0, 2);                         // expected error: only interpolant
+    // EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only interpolant
+    // f16tof32(inF0);                                             // expected error: only integer inputs
+    // firstbithigh(inF0);                                         // expected error: only integer inputs
+    // firstbitlow(inF0);                                          // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                                               // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua3, gs_ub3, gs_uc3, out_u3); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua3, gs_ub3, out_u3);                // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua3, gs_ub3);                              // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua3, gs_ub3, out_u3);                      // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    noise(inF0);                                                // expected error: only valid in pixel stage
-    reversebits(inF0);                                          // expected error: only integer inputs
-    transpose(inF0);                                            // expect error: only valid on mats
+    // fwidth(inF0);                                               // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua3, gs_ub3, gs_uc3, out_u3); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua3, gs_ub3, out_u3);                // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua3, gs_ub3);                              // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua3, gs_ub3, out_u3);                      // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // noise(inF0);                                                // expected error: only valid in pixel stage
+    // reversebits(inF0);                                          // expected error: only integer inputs
+    // transpose(inF0);                                            // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
@@ -158,41 +158,41 @@
 {
     uint4 out_u4;
 
-    CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
-    countbits(inF0);                                            // expected error: only integer inputs
-    cross(inF0, inF1);                                          // expected error: only on float3 inputs
-    determinant(inF0);                                          // expect error: only valid on mats
-    ddx(inF0);                                                  // only valid in pixel stage
-    ddx_coarse(inF0);                                           // only valid in pixel stage
-    ddx_fine(inF0);                                             // only valid in pixel stage
-    ddy(inF0);                                                  // only valid in pixel stage
-    ddy_coarse(inF0);                                           // only valid in pixel stage
-    ddy_fine(inF0);                                             // only valid in pixel stage
-    EvaluateAttributeAtCentroid(inF0);                          // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);                         // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only valid in pixel stage
-    f16tof32(inF0);                                             // expected error: only integer inputs
-    firstbithigh(inF0);                                         // expected error: only integer inputs
-    firstbitlow(inF0);                                          // expected error: only integer inputs
+    // CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
+    // countbits(inF0);                                            // expected error: only integer inputs
+    // cross(inF0, inF1);                                          // expected error: only on float3 inputs
+    // determinant(inF0);                                          // expect error: only valid on mats
+    // ddx(inF0);                                                  // only valid in pixel stage
+    // ddx_coarse(inF0);                                           // only valid in pixel stage
+    // ddx_fine(inF0);                                             // only valid in pixel stage
+    // ddy(inF0);                                                  // only valid in pixel stage
+    // ddy_coarse(inF0);                                           // only valid in pixel stage
+    // ddy_fine(inF0);                                             // only valid in pixel stage
+    // EvaluateAttributeAtCentroid(inF0);                          // expected error: only valid in pixel stage
+    // EvaluateAttributeAtSample(inF0, 2);                         // expected error: only valid in pixel stage
+    // EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only valid in pixel stage
+    // f16tof32(inF0);                                             // expected error: only integer inputs
+    // firstbithigh(inF0);                                         // expected error: only integer inputs
+    // firstbitlow(inF0);                                          // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                                               // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua4, gs_ub4, gs_uc4, out_u4); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua4, gs_ub4, out_u4);                // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua4, gs_ub4);                              // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua4, gs_ub4, out_u4);                      // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    noise(inF0);                                                // expected error: only valid in pixel stage
-    reversebits(inF0);                                          // expected error: only integer inputs
-    transpose(inF0);                                            // expect error: only valid on mats
+    // fwidth(inF0);                                               // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua4, gs_ub4, gs_uc4, out_u4); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua4, gs_ub4, out_u4);                // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua4, gs_ub4);                              // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua4, gs_ub4, out_u4);                      // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // noise(inF0);                                                // expected error: only valid in pixel stage
+    // reversebits(inF0);                                          // expected error: only integer inputs
+    // transpose(inF0);                                            // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
diff --git a/Test/hlsl.intrinsics.negative.vert b/Test/hlsl.intrinsics.negative.vert
index a5030cf..fcfb761 100644
--- a/Test/hlsl.intrinsics.negative.vert
+++ b/Test/hlsl.intrinsics.negative.vert
@@ -15,56 +15,56 @@
 {
     uint out_u1;
 
-    AllMemoryBarrier();                       // expected error: only valid in compute stage
-    AllMemoryBarrierWithGroupSync();          // expected error: only valid in compute stage
-    asdouble(inF0, inF1);                     // expected error: only integer inputs
-    CheckAccessFullyMapped(3.0);              // expected error: only valid on integers
-    CheckAccessFullyMapped(3);                // expected error: only valid in pixel & compute stages
-    clip(inF0);                               // expected error: only valid in pixel stage
-    countbits(inF0);                          // expected error: only integer inputs
-    cross(inF0, inF1);                        // expected error: only on float3 inputs
-    D3DCOLORtoUBYTE4(inF0);                   // expected error: only on float4 inputs
-    DeviceMemoryBarrier();                    // expected error: only valid in pixel & compute stages
-    DeviceMemoryBarrierWithGroupSync();       // expected error: only valid in compute stage
-    ddx(inF0);                                // expected error: only valid in pixel stage
-    ddx_coarse(inF0);                         // expected error: only valid in pixel stage
-    ddx_fine(inF0);                           // expected error: only valid in pixel stage
-    ddy(inF0);                                // expected error: only valid in pixel stage
-    ddy_coarse(inF0);                         // expected error: only valid in pixel stage
-    ddy_fine(inF0);                           // expected error: only valid in pixel stage
-    determinant(inF0);                        // expected error: only valid on mats
-    EvaluateAttributeAtCentroid(inF0);        // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);       // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));  // expected error: only valid in pixel stage
-    f16tof32(inF0);                           // expected error: only integer inputs
-    firstbithigh(inF0);                       // expected error: only integer inputs
-    firstbitlow(inF0);                        // expected error: only integer inputs
+    // AllMemoryBarrier();                       // expected error: only valid in compute stage
+    // AllMemoryBarrierWithGroupSync();          // expected error: only valid in compute stage
+    // asdouble(inF0, inF1);                     // expected error: only integer inputs
+    // CheckAccessFullyMapped(3.0);              // expected error: only valid on integers
+    // CheckAccessFullyMapped(3);                // expected error: only valid in pixel & compute stages
+    // clip(inF0);                               // expected error: only valid in pixel stage
+    // countbits(inF0);                          // expected error: only integer inputs
+    // cross(inF0, inF1);                        // expected error: only on float3 inputs
+    // D3DCOLORtoUBYTE4(inF0);                   // expected error: only on float4 inputs
+    // DeviceMemoryBarrier();                    // expected error: only valid in pixel & compute stages
+    // DeviceMemoryBarrierWithGroupSync();       // expected error: only valid in compute stage
+    // ddx(inF0);                                // expected error: only valid in pixel stage
+    // ddx_coarse(inF0);                         // expected error: only valid in pixel stage
+    // ddx_fine(inF0);                           // expected error: only valid in pixel stage
+    // ddy(inF0);                                // expected error: only valid in pixel stage
+    // ddy_coarse(inF0);                         // expected error: only valid in pixel stage
+    // ddy_fine(inF0);                           // expected error: only valid in pixel stage
+    // determinant(inF0);                        // expected error: only valid on mats
+    // EvaluateAttributeAtCentroid(inF0);        // expected error: only interpolant
+    // EvaluateAttributeAtSample(inF0, 2);       // expected error: only interpolant
+    // EvaluateAttributeSnapped(inF0, int2(2));  // expected error: only interpolant
+    // f16tof32(inF0);                           // expected error: only integer inputs
+    // firstbithigh(inF0);                       // expected error: only integer inputs
+    // firstbitlow(inF0);                        // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua, gs_ub, gs_uc, out_u1); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua, gs_ub, out_u1);// expected error: only valid in pixel stage
-    InterlockedMax(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua, gs_ub);              // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua, gs_ub, out_u1);      // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua, gs_ub);             // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
-    GroupMemoryBarrier();                     // expected error: only valid in compute stage
-    GroupMemoryBarrierWithGroupSync();        // expected error: only valid in compute stage
-    length(inF0);                             // expect error: invalid on scalars
-    msad4(inF0, float2(0), float4(0));        // expected error: only integer inputs
-    normalize(inF0);                          // expect error: invalid on scalars
-    reflect(inF0, inF1);                      // expect error: invalid on scalars
-    refract(inF0, inF1, inF2);                // expect error: invalid on scalars
-    refract(float2(0), float2(0), float2(0)); // expected error: last parameter only scalar
-    reversebits(inF0);                        // expected error: only integer inputs
-    transpose(inF0);                          // expect error: only valid on mats
+    // fwidth(inF0);                             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua, gs_ub, gs_uc, out_u1); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua, gs_ub, out_u1);// expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua, gs_ub);              // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua, gs_ub, out_u1);      // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua, gs_ub);             // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua, gs_ub, out_u1);     // expected error: only valid in pixel stage
+    // GroupMemoryBarrier();                     // expected error: only valid in compute stage
+    // GroupMemoryBarrierWithGroupSync();        // expected error: only valid in compute stage
+    // length(inF0);                             // expect error: invalid on scalars
+    // msad4(inF0, float2(0), float4(0));        // expected error: only integer inputs
+    // normalize(inF0);                          // expect error: invalid on scalars
+    // reflect(inF0, inF1);                      // expect error: invalid on scalars
+    // refract(inF0, inF1, inF2);                // expect error: invalid on scalars
+    // refract(float2(0), float2(0), float2(0)); // expected error: last parameter only scalar
+    // reversebits(inF0);                        // expected error: only integer inputs
+    // transpose(inF0);                          // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
@@ -75,7 +75,7 @@
 {
     // TODO: ... add when float1 prototypes are generated
 
-    GetRenderTargetSamplePosition(inF0); // expected error: only integer inputs
+    // GetRenderTargetSamplePosition(inF0); // expected error: only integer inputs
 
     return 0.0;
 }
@@ -84,43 +84,43 @@
 {
     uint2 out_u2;
 
-    asdouble(inF0, inF1);                                       // expected error: only integer inputs
-    CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
-    countbits(inF0);                                            // expected error: only integer inputs
-    cross(inF0, inF1);                                          // expected error: only on float3 inputs
-    D3DCOLORtoUBYTE4(inF0);                                     // expected error: only on float4 inputs
-    ddx(inF0);                                                  // only valid in pixel stage
-    ddx_coarse(inF0);                                           // only valid in pixel stage
-    ddx_fine(inF0);                                             // only valid in pixel stage
-    ddy(inF0);                                                  // only valid in pixel stage
-    ddy_coarse(inF0);                                           // only valid in pixel stage
-    ddy_fine(inF0);                                             // only valid in pixel stage
-    determinant(inF0);                                          // expect error: only valid on mats
-    EvaluateAttributeAtCentroid(inF0);                          // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);                         // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only valid in pixel stage
-    f16tof32(inF0);                                             // expected error: only integer inputs
-    firstbithigh(inF0);                                         // expected error: only integer inputs
-    firstbitlow(inF0);                                          // expected error: only integer inputs
+    // asdouble(inF0, inF1);                                       // expected error: only integer inputs
+    // CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
+    // countbits(inF0);                                            // expected error: only integer inputs
+    // cross(inF0, inF1);                                          // expected error: only on float3 inputs
+    // D3DCOLORtoUBYTE4(inF0);                                     // expected error: only on float4 inputs
+    // ddx(inF0);                                                  // only valid in pixel stage
+    // ddx_coarse(inF0);                                           // only valid in pixel stage
+    // ddx_fine(inF0);                                             // only valid in pixel stage
+    // ddy(inF0);                                                  // only valid in pixel stage
+    // ddy_coarse(inF0);                                           // only valid in pixel stage
+    // ddy_fine(inF0);                                             // only valid in pixel stage
+    // determinant(inF0);                                          // expect error: only valid on mats
+    // EvaluateAttributeAtCentroid(inF0);                          // expected error: only interpolant
+    // EvaluateAttributeAtSample(inF0, 2);                         // expected error: only interpolant
+    // EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only interpolant
+    // f16tof32(inF0);                                             // expected error: only integer inputs
+    // firstbithigh(inF0);                                         // expected error: only integer inputs
+    // firstbitlow(inF0);                                          // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                                               // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua2, gs_ub2, gs_uc2, out_u2); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua2, gs_ub2, out_u2);                // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua2, gs_ub2);                              // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua2, gs_ub2, out_u2);                      // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
-    noise(inF0);                                                // expected error: only valid in pixel stage
-    reversebits(inF0);                                          // expected error: only integer inputs
-    transpose(inF0);                                            // expect error: only valid on mats
+    // fwidth(inF0);                                               // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua2, gs_ub2, gs_uc2, out_u2); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua2, gs_ub2, out_u2);                // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua2, gs_ub2);                              // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua2, gs_ub2, out_u2);                      // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua2, gs_ub2);                             // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua2, gs_ub2, out_u2);                     // expected error: only valid in pixel stage
+    // noise(inF0);                                                // expected error: only valid in pixel stage
+    // reversebits(inF0);                                          // expected error: only integer inputs
+    // transpose(inF0);                                            // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
@@ -131,41 +131,41 @@
 {
     uint3 out_u3;
 
-    CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
-    countbits(inF0);                                            // expected error: only integer inputs
-    ddx(inF0);                                                  // only valid in pixel stage
-    ddx_coarse(inF0);                                           // only valid in pixel stage
-    ddx_fine(inF0);                                             // only valid in pixel stage
-    ddy(inF0);                                                  // only valid in pixel stage
-    ddy_coarse(inF0);                                           // only valid in pixel stage
-    ddy_fine(inF0);                                             // only valid in pixel stage
-    D3DCOLORtoUBYTE4(inF0);                                     // expected error: only on float4 inputs
-    determinant(inF0);                                          // expect error: only valid on mats
-    EvaluateAttributeAtCentroid(inF0);                          // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);                         // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only valid in pixel stage
-    f16tof32(inF0);                                             // expected error: only integer inputs
-    firstbithigh(inF0);                                         // expected error: only integer inputs
-    firstbitlow(inF0);                                          // expected error: only integer inputs
+    // CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
+    // countbits(inF0);                                            // expected error: only integer inputs
+    // ddx(inF0);                                                  // only valid in pixel stage
+    // ddx_coarse(inF0);                                           // only valid in pixel stage
+    // ddx_fine(inF0);                                             // only valid in pixel stage
+    // ddy(inF0);                                                  // only valid in pixel stage
+    // ddy_coarse(inF0);                                           // only valid in pixel stage
+    // ddy_fine(inF0);                                             // only valid in pixel stage
+    // D3DCOLORtoUBYTE4(inF0);                                     // expected error: only on float4 inputs
+    // determinant(inF0);                                          // expect error: only valid on mats
+    // EvaluateAttributeAtCentroid(inF0);                          // expected error: only interpolant
+    // EvaluateAttributeAtSample(inF0, 2);                         // expected error: only interpolant
+    // EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only interpolant
+    // f16tof32(inF0);                                             // expected error: only integer inputs
+    // firstbithigh(inF0);                                         // expected error: only integer inputs
+    // firstbitlow(inF0);                                          // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                                               // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua3, gs_ub3, gs_uc3, out_u3); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua3, gs_ub3, out_u3);                // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua3, gs_ub3);                              // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua3, gs_ub3, out_u3);                      // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
-    noise(inF0);                                                // expected error: only valid in pixel stage
-    reversebits(inF0);                                          // expected error: only integer inputs
-    transpose(inF0);                                            // expect error: only valid on mats
+    // fwidth(inF0);                                               // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua3, gs_ub3, gs_uc3, out_u3); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua3, gs_ub3, out_u3);                // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua3, gs_ub3);                              // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua3, gs_ub3, out_u3);                      // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua3, gs_ub3);                             // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua3, gs_ub3, out_u3);                     // expected error: only valid in pixel stage
+    // noise(inF0);                                                // expected error: only valid in pixel stage
+    // reversebits(inF0);                                          // expected error: only integer inputs
+    // transpose(inF0);                                            // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
@@ -176,41 +176,41 @@
 {
     uint4 out_u4;
 
-    CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
-    countbits(inF0);                                            // expected error: only integer inputs
-    cross(inF0, inF1);                                          // expected error: only on float3 inputs
-    determinant(inF0);                                          // expect error: only valid on mats
-    ddx(inF0);                                                  // only valid in pixel stage
-    ddx_coarse(inF0);                                           // only valid in pixel stage
-    ddx_fine(inF0);                                             // only valid in pixel stage
-    ddy(inF0);                                                  // only valid in pixel stage
-    ddy_coarse(inF0);                                           // only valid in pixel stage
-    ddy_fine(inF0);                                             // only valid in pixel stage
-    EvaluateAttributeAtCentroid(inF0);                          // expected error: only valid in pixel stage
-    EvaluateAttributeAtSample(inF0, 2);                         // expected error: only valid in pixel stage
-    EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only valid in pixel stage
-    f16tof32(inF0);                                             // expected error: only integer inputs
-    firstbithigh(inF0);                                         // expected error: only integer inputs
-    firstbitlow(inF0);                                          // expected error: only integer inputs
+    // CheckAccessFullyMapped(inF0);                               // expect error: only valid on scalars
+    // countbits(inF0);                                            // expected error: only integer inputs
+    // cross(inF0, inF1);                                          // expected error: only on float3 inputs
+    // determinant(inF0);                                          // expect error: only valid on mats
+    // ddx(inF0);                                                  // only valid in pixel stage
+    // ddx_coarse(inF0);                                           // only valid in pixel stage
+    // ddx_fine(inF0);                                             // only valid in pixel stage
+    // ddy(inF0);                                                  // only valid in pixel stage
+    // ddy_coarse(inF0);                                           // only valid in pixel stage
+    // ddy_fine(inF0);                                             // only valid in pixel stage
+    // EvaluateAttributeAtCentroid(inF0);                          // expected error: only interpolant
+    // EvaluateAttributeAtSample(inF0, 2);                         // expected error: only interpolant
+    // EvaluateAttributeSnapped(inF0, int2(2));                    // expected error: only interpolant
+    // f16tof32(inF0);                                             // expected error: only integer inputs
+    // firstbithigh(inF0);                                         // expected error: only integer inputs
+    // firstbitlow(inF0);                                          // expected error: only integer inputs
     // fma(inF0, inF1, inF2); // TODO: this might auto-promote: need to check against FXC
-    fwidth(inF0);                                               // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedAdd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedAnd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedCompareExchange(gs_ua4, gs_ub4, gs_uc4, out_u4); // expected error: only valid in pixel stage
-    InterlockedExchange(gs_ua4, gs_ub4, out_u4);                // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedMax(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedMin(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua4, gs_ub4);                              // expected error: only valid in pixel stage
-    InterlockedOr(gs_ua4, gs_ub4, out_u4);                      // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
-    InterlockedXor(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
-    noise(inF0);                                                // expected error: only valid in pixel stage
-    reversebits(inF0);                                          // expected error: only integer inputs
-    transpose(inF0);                                            // expect error: only valid on mats
+    // fwidth(inF0);                                               // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedAdd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedAnd(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedCompareExchange(gs_ua4, gs_ub4, gs_uc4, out_u4); // expected error: only valid in pixel stage
+    // InterlockedExchange(gs_ua4, gs_ub4, out_u4);                // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedMax(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedMin(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua4, gs_ub4);                              // expected error: only valid in pixel stage
+    // InterlockedOr(gs_ua4, gs_ub4, out_u4);                      // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua4, gs_ub4);                             // expected error: only valid in pixel stage
+    // InterlockedXor(gs_ua4, gs_ub4, out_u4);                     // expected error: only valid in pixel stage
+    // noise(inF0);                                                // expected error: only valid in pixel stage
+    // reversebits(inF0);                                          // expected error: only integer inputs
+    // transpose(inF0);                                            // expect error: only valid on mats
 
     // TODO: texture intrinsics, when we can declare samplers.
 
@@ -218,32 +218,7 @@
 }
 
 // TODO: FXC doesn't accept this with (), but glslang doesn't accept it without.
-#define MATFNS() \
-    countbits(inF0);                         \
-    cross(inF0, inF1);                       \
-    D3DCOLORtoUBYTE4(inF0);                  \
-    ddx(inF0);                               \
-    ddx_coarse(inF0);                        \
-    ddx_fine(inF0);                          \
-    ddy(inF0);                               \
-    ddy_coarse(inF0);                        \
-    ddy_fine(inF0);                          \
-    EvaluateAttributeAtCentroid(inF0);       \
-    EvaluateAttributeAtSample(inF0, 2);      \
-    EvaluateAttributeSnapped(inF0, int2(2)); \
-    f16tof32(inF0);                          \
-    firstbithigh(inF0);                      \
-    firstbitlow(inF0);                       \
-    fwidth(inF0);                            \
-    noise(inF0);                             \
-    reversebits(inF0);                       \
-    length(inF0);                            \
-    noise(inF0);                             \
-    normalize(inF0);                         \
-    reflect(inF0, inF1);                     \
-    refract(inF0, inF1, 1.0);                \
-    reversebits(inF0);                       \
-    
+#define MATFNS()
 
 // TODO: turn on non-square matrix tests when protos are available.
 
diff --git a/Test/hlsl.promotions.frag b/Test/hlsl.promotions.frag
new file mode 100644
index 0000000..647096d
--- /dev/null
+++ b/Test/hlsl.promotions.frag
@@ -0,0 +1,201 @@
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+};
+
+uniform int3    i3;
+uniform bool3   b3;
+uniform float3  f3;
+uniform uint3   u3;
+uniform double3 d3;
+
+uniform int    is;
+uniform bool   bs;
+uniform float  fs;
+uniform uint   us;
+uniform double ds;
+
+void Fn_F3(float3 x) { }
+void Fn_I3(int3 x) { }
+void Fn_U3(uint3 x) { }
+void Fn_B3(bool3 x) { }
+void Fn_D3(double3 x) { }
+
+// ----------- Test implicit conversions on function returns -----------
+float3  Fn_R_F3I(out float3 p) { p = i3; return i3; }
+float3  Fn_R_F3U(out float3 p) { p = u3; return u3; }
+float3  Fn_R_F3B(out float3 p) { p = b3; return b3; }
+float3  Fn_R_F3D(out float3 p) { p = d3; return d3; }  // valid, but loss of precision on downconversion.
+
+int3    Fn_R_I3U(out int3 p) { p = u3; return u3; }
+int3    Fn_R_I3B(out int3 p) { p = b3; return b3; }
+int3    Fn_R_I3F(out int3 p) { p = f3; return f3; }
+int3    Fn_R_I3D(out int3 p) { p = d3; return d3; }  // valid, but loss of precision on downconversion.
+
+uint3   Fn_R_U3I(out uint3 p) { p = i3; return i3; }
+uint3   Fn_R_U3F(out uint3 p) { p = f3; return f3; }
+uint3   Fn_R_U3B(out uint3 p) { p = b3; return b3; }
+uint3   Fn_R_U3D(out uint3 p) { p = d3; return d3; }  // valid, but loss of precision on downconversion.
+
+bool3   Fn_R_B3I(out bool3 p) { p = i3; return i3; }
+bool3   Fn_R_B3U(out bool3 p) { p = u3; return u3; }
+bool3   Fn_R_B3F(out bool3 p) { p = f3; return f3; }
+bool3   Fn_R_B3D(out bool3 p) { p = d3; return d3; }
+
+double3 Fn_R_D3I(out double3 p) { p = i3; return i3; }
+double3 Fn_R_D3U(out double3 p) { p = u3; return u3; }
+double3 Fn_R_D3B(out double3 p) { p = b3; return b3; }
+double3 Fn_R_D3F(out double3 p) { p = f3; return f3; }
+
+PS_OUTPUT main()
+{
+    // ----------- assignment conversions -----------
+    float3 r00 = i3;
+    float3 r01 = b3;
+    float3 r02 = u3;
+    float3 r03 = d3;  // valid, but loss of precision on downconversion.
+
+    int3   r10 = b3;
+    int3   r11 = u3;
+    int3   r12 = f3;
+    int3   r13 = d3;  // valid, but loss of precision on downconversion.
+
+    uint3  r20 = b3;
+    uint3  r21 = i3;
+    uint3  r22 = f3;
+    uint3  r23 = d3;  // valid, but loss of precision on downconversion.
+
+    bool3  r30 = i3;
+    bool3  r31 = u3;
+    bool3  r32 = f3;
+    bool3  r33 = d3;
+
+    double3 r40 = i3;
+    double3 r41 = u3;
+    double3 r42 = f3;
+    double3 r43 = b3;
+
+    // ----------- assign ops: vector times vector ----------- 
+    r00 *= i3;
+    r01 *= b3;
+    r02 *= u3;
+    r03 *= d3;  // valid, but loss of precision on downconversion.
+    
+    r10 *= b3;
+    r11 *= u3;
+    r12 *= f3;
+    r13 *= d3;  // valid, but loss of precision on downconversion.
+    
+    r20 *= b3;
+    r21 *= i3;
+    r22 *= f3;
+    r23 *= d3;  // valid, but loss of precision on downconversion.
+
+    // No mul operator for bools
+    
+    r40 *= i3;
+    r41 *= u3;
+    r42 *= f3;
+    r43 *= b3;
+
+    // ----------- assign ops: vector times scalar ----------- 
+    r00 *= is;
+    r01 *= bs;
+    r02 *= us;
+    r03 *= ds;  // valid, but loss of precision on downconversion.
+    
+    r10 *= bs;
+    r11 *= us;
+    r12 *= fs;
+    r13 *= ds;  // valid, but loss of precision on downconversion.
+    
+    r20 *= bs;
+    r21 *= is;
+    r22 *= fs;
+    r23 *= ds;  // valid, but loss of precision on downconversion.
+
+    // No mul operator for bools
+    
+    r40 *= is;
+    r41 *= us;
+    r42 *= fs;
+    r43 *= bs;
+
+
+#define FN_OVERLOADS 0 // change to 1 when overloads under promotions are in place
+
+#if FN_OVERLOADS
+    Fn_F3(i3);
+    Fn_F3(u3);
+    Fn_F3(f3);
+    Fn_F3(b3);
+    Fn_F3(d3);  // valid, but loss of precision on downconversion.
+
+    Fn_I3(i3);
+    Fn_I3(u3);
+    Fn_I3(f3);
+    Fn_I3(b3);
+    Fn_I3(d3);  // valid, but loss of precision on downconversion.
+
+    Fn_U3(i3);
+    Fn_U3(u3);
+    Fn_U3(f3);
+    Fn_U3(b3);
+    Fn_U3(d3);  // valid, but loss of precision on downconversion.
+
+    Fn_B3(i3);
+    Fn_B3(u3);
+    Fn_B3(f3);
+    Fn_B3(b3);
+    Fn_B3(d3);
+
+    Fn_D3(i3);
+    Fn_D3(u3);
+    Fn_D3(f3);
+    Fn_D3(b3);
+    Fn_D3(d3);
+
+    Fn_F3(i3.x);
+    Fn_F3(u3.x);
+    Fn_F3(f3.x);
+    Fn_F3(b3.x);
+    Fn_F3(d3.x);  // valid, but loss of precision on downconversion.
+
+    Fn_I3(i3.x);
+    Fn_I3(u3.x);
+    Fn_I3(f3.x);
+    Fn_I3(b3.x);
+    Fn_I3(d3.x);  // valid, but loss of precision on downconversion.
+
+    Fn_U3(i3.x);
+    Fn_U3(u3.x);
+    Fn_U3(f3.x);
+    Fn_U3(b3.x);
+    Fn_U3(d3.x);  // valid, but loss of precision on downconversion.
+
+    Fn_B3(i3.x);
+    Fn_B3(u3.x);
+    Fn_B3(f3.x);
+    Fn_B3(b3.x);
+    Fn_B3(d3.x);
+
+    Fn_D3(i3.x);
+    Fn_D3(u3.x);
+    Fn_D3(f3.x);
+    Fn_D3(b3.x);
+    Fn_D3(d3.x);
+#endif
+
+    const int   si = 3;
+    const float sf = 1.2;
+
+    int   c1 = si * sf;  // 3.6 (not 3!)
+    int   c2 = sf * si;  // 3.6 (not 3!)
+
+    float4 outval = float4(si * sf, sf*si, c1, c2);
+
+    PS_OUTPUT psout;
+    psout.Color = outval;
+    return psout;
+}
diff --git a/Test/hlsl.semicolons.frag b/Test/hlsl.semicolons.frag
new file mode 100644
index 0000000..28fdedd
--- /dev/null
+++ b/Test/hlsl.semicolons.frag
@@ -0,0 +1,19 @@
+
+void MyFunc() { }
+
+;;;
+;
+; ; ;     // HLSL allows stray global scope semicolons.
+
+void MyFunc2() {;;;};
+
+struct PS_OUTPUT { float4 color : SV_Target0; };;;;;
+
+;PS_OUTPUT main()
+{
+    PS_OUTPUT ps_output;;;
+    ;
+    ps_output.color = 1.0;
+    return ps_output;
+};
+
diff --git a/Test/hlsl.shapeConv.frag b/Test/hlsl.shapeConv.frag
index 1e6dec6..3147b61 100644
--- a/Test/hlsl.shapeConv.frag
+++ b/Test/hlsl.shapeConv.frag
@@ -8,6 +8,15 @@
     u = float(1);
     u = float(2.0);
     u = float(f);
+    float2 w = 2.0;
+    float V = 1;

+    float3 MyVal = V;
+
+    float3 foo;

+    foo > 4.0;

+    foo >= 5.0;

+    6.0 < foo;
+    7.0 <= foo;
 
     return input;
 }
diff --git a/Test/preprocessor.simple.vert b/Test/preprocessor.simple.vert
index f4749f2..3522271 100644
--- a/Test/preprocessor.simple.vert
+++ b/Test/preprocessor.simple.vert
@@ -19,4 +19,11 @@
   gl_Position = vec4(Z);

   gl_Position = vec4(F);

   gl_Position = vec4(fn(3));

+  [] . ++ --

+  + - * % / - ! ~

+  << >> < > <= >=

+  == !=

+  & ^ | && ^^ || ? :

+  += -= *= /= %= <<= >>= &= |= ^=

+  1.2 2E10 5u -5lf

 }

diff --git a/Test/spv.450.tesc b/Test/spv.450.tesc
index 0f8ec5c..c3719f9 100644
--- a/Test/spv.450.tesc
+++ b/Test/spv.450.tesc
@@ -18,3 +18,15 @@
 void main()

 {

 }

+

+layout(location = 2) patch out SingleBlock {

+    highp float bMem1;  // should not see a location decoration

+    highp float bMem2;

+    S s;                // should see a patch decoration

+} singleBlock;

+

+layout(location = 20) patch out bn {

+                        vec4 v1; // location 20

+  layout(location = 24) vec4 v2; // location 24

+                        vec4 v3; // location 25

+};
\ No newline at end of file
diff --git a/glslang/GenericCodeGen/Link.cpp b/glslang/GenericCodeGen/Link.cpp
index 8160999..8da88bd 100644
--- a/glslang/GenericCodeGen/Link.cpp
+++ b/glslang/GenericCodeGen/Link.cpp
@@ -46,7 +46,7 @@
 public:
     TGenericLinker(EShExecutable e, int dOptions) : TLinker(e, infoSink), debugOptions(dOptions) { }
     bool link(TCompilerList&, TUniformMap*) { return true; }
-	void getAttributeBindings(ShBindingTable const **) const { }
+    void getAttributeBindings(ShBindingTable const **) const { }
     TInfoSink infoSink;
     int debugOptions;
 };
diff --git a/glslang/Include/Common.h b/glslang/Include/Common.h
index 4c04ae3..636645e 100644
--- a/glslang/Include/Common.h
+++ b/glslang/Include/Common.h
@@ -89,8 +89,8 @@
 #include <list>
 #include <algorithm>
 #include <string>
-#include <stdio.h>
-#include <assert.h>
+#include <cstdio>
+#include <cassert>
 
 #include "PoolAlloc.h"
 
@@ -99,11 +99,11 @@
 //
 #define POOL_ALLOCATOR_NEW_DELETE(A)                                  \
     void* operator new(size_t s) { return (A).allocate(s); }          \
-    void* operator new(size_t, void *_Where) { return (_Where);	}     \
+    void* operator new(size_t, void *_Where) { return (_Where); }     \
     void operator delete(void*) { }                                   \
     void operator delete(void *, void *) { }                          \
     void* operator new[](size_t s) { return (A).allocate(s); }        \
-    void* operator new[](size_t, void *_Where) { return (_Where);	} \
+    void* operator new[](size_t, void *_Where) { return (_Where); }   \
     void operator delete[](void*) { }                                 \
     void operator delete[](void *, void *) { }
 
diff --git a/glslang/Include/InfoSink.h b/glslang/Include/InfoSink.h
index 5862e5d..aa02f91 100644
--- a/glslang/Include/InfoSink.h
+++ b/glslang/Include/InfoSink.h
@@ -36,7 +36,7 @@
 #define _INFOSINK_INCLUDED_
 
 #include "../Include/Common.h"
-#include <math.h>
+#include <cmath>
 
 namespace glslang {
 
diff --git a/glslang/Include/PoolAlloc.h b/glslang/Include/PoolAlloc.h
index c3bebc6..635be79 100644
--- a/glslang/Include/PoolAlloc.h
+++ b/glslang/Include/PoolAlloc.h
@@ -61,13 +61,13 @@
 // class as the allocator (second) template argument.
 //
 
-#include <stddef.h>
-#include <string.h>
+#include <cstddef>
+#include <cstring>
 #include <vector>
 
 namespace glslang {
 
-// If we are using guard blocks, we must track each indivual
+// If we are using guard blocks, we must track each individual
 // allocation.  If we aren't using guard blocks, these
 // never get instantiated, so won't have any impact.
 // 
@@ -297,10 +297,10 @@
     pointer allocate(size_type n, const void*) { 
         return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); }
 
-	void deallocate(void*, size_type) { }
+    void deallocate(void*, size_type) { }
     void deallocate(pointer, size_type) { }
 
-	pointer _Charalloc(size_t n) {
+    pointer _Charalloc(size_t n) {
         return reinterpret_cast<pointer>(getAllocator().allocate(n)); }
 
     void construct(pointer p, const T& val) { new ((void *)p) T(val); }
diff --git a/glslang/Include/ShHandle.h b/glslang/Include/ShHandle.h
index fee6413..bfc97db 100644
--- a/glslang/Include/ShHandle.h
+++ b/glslang/Include/ShHandle.h
@@ -123,8 +123,8 @@
         haveReturnableObjectCode(false),
         appAttributeBindings(0),
         fixedAttributeBindings(0),
-		excludedAttributes(0),
-		excludedCount(0),
+        excludedAttributes(0),
+        excludedCount(0),
         uniformBindings(0) { }
     virtual TLinker* getAsLinker() { return this; }
     virtual ~TLinker() { }
@@ -132,8 +132,8 @@
     virtual bool link(THandleList&) { return false; }
     virtual void setAppAttributeBindings(const ShBindingTable* t)   { appAttributeBindings = t; }
     virtual void setFixedAttributeBindings(const ShBindingTable* t) { fixedAttributeBindings = t; }
-	virtual void getAttributeBindings(ShBindingTable const **t) const = 0;
-	virtual void setExcludedAttributes(const int* attributes, int count) { excludedAttributes = attributes; excludedCount = count; }
+    virtual void getAttributeBindings(ShBindingTable const **t) const = 0;
+    virtual void setExcludedAttributes(const int* attributes, int count) { excludedAttributes = attributes; excludedCount = count; }
     virtual ShBindingTable* getUniformBindings() const  { return uniformBindings; }
     virtual const void* getObjectCode() const { return 0; } // a real compiler would be returning object code here
     virtual TInfoSink& getInfoSink() { return infoSink; }
@@ -145,8 +145,8 @@
 
     const ShBindingTable* appAttributeBindings;
     const ShBindingTable* fixedAttributeBindings;
-	const int* excludedAttributes;
-	int excludedCount;
+    const int* excludedAttributes;
+    int excludedCount;
     ShBindingTable* uniformBindings;                // created by the linker    
 };
 
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 4d260f0..5166e3d 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -461,6 +461,9 @@
     EOpTextureQueryLod,
     EOpTextureQueryLevels,
     EOpTextureQuerySamples,
+
+    EOpSamplingGuardBegin,
+
     EOpTexture,
     EOpTextureProj,
     EOpTextureLod,
@@ -503,7 +506,7 @@
     EOpSparseTextureGradOffsetClamp,
 
     EOpSparseTextureGuardEnd,
-
+    EOpSamplingGuardEnd,
     EOpTextureGuardEnd,
 
     //
@@ -565,6 +568,17 @@
     EOpMethodGather,                     // ...
     EOpMethodCalculateLevelOfDetail,     // ...
     EOpMethodCalculateLevelOfDetailUnclamped,     // ...
+
+    // SM5 texture methods
+    EOpMethodGatherRed,                  // These are covered under the above EOpMethodSample comment about
+    EOpMethodGatherGreen,                // translation to existing AST opcodes.  They exist temporarily
+    EOpMethodGatherBlue,                 // because HLSL arguments are slightly different.
+    EOpMethodGatherAlpha,                // ...
+    EOpMethodGatherCmp,                  // ...
+    EOpMethodGatherCmpRed,               // ...
+    EOpMethodGatherCmpGreen,             // ...
+    EOpMethodGatherCmpBlue,              // ...
+    EOpMethodGatherCmpAlpha,             // ...
 };
 
 class TIntermTraverser;
@@ -799,11 +813,27 @@
     virtual bool promote() { return true; }
     bool modifiesState() const;
     bool isConstructor() const;
-    bool isTexture() const { return op > EOpTextureGuardBegin && op < EOpTextureGuardEnd; }
-    bool isImage()   const { return op > EOpImageGuardBegin   && op < EOpImageGuardEnd; }
+    bool isTexture()  const { return op > EOpTextureGuardBegin  && op < EOpTextureGuardEnd; }
+    bool isSampling() const { return op > EOpSamplingGuardBegin && op < EOpSamplingGuardEnd; }
+    bool isImage()    const { return op > EOpImageGuardBegin    && op < EOpImageGuardEnd; }
     bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; }
     bool isSparseImage()   const { return op == EOpSparseImageLoad; }
 
+    void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; }
+    TPrecisionQualifier getOperationPrecision() const { return operationPrecision != EpqNone ?
+                                                                                     operationPrecision :
+                                                                                     type.getQualifier().precision; }
+    TString getCompleteString() const
+    {
+        TString cs = type.getCompleteString();
+        if (getOperationPrecision() != type.getQualifier().precision) {
+            cs += ", operation at ";
+            cs += GetPrecisionQualifierString(getOperationPrecision());
+        }
+
+        return cs;
+    }
+
     // Crack the op into the individual dimensions of texturing operation.
     void crackTexture(TSampler sampler, TCrackedTextureOp& cracked) const
     {
@@ -935,9 +965,15 @@
     }
 
 protected:
-    TIntermOperator(TOperator o) : TIntermTyped(EbtFloat), op(o) {}
-    TIntermOperator(TOperator o, TType& t) : TIntermTyped(t), op(o) {}
+    TIntermOperator(TOperator o) : TIntermTyped(EbtFloat), op(o), operationPrecision(EpqNone) {}
+    TIntermOperator(TOperator o, TType& t) : TIntermTyped(t), op(o), operationPrecision(EpqNone) {}
     TOperator op;
+    // The result precision is in the inherited TType, and is usually meant to be both
+    // the operation precision and the result precision. However, some more complex things,
+    // like built-in function calls, distinguish between the two, in which case non-EqpNone
+    // 'operationPrecision' overrides the result precision as far as operation precision
+    // is concerned.
+    TPrecisionQualifier operationPrecision;
 };
 
 //
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index faaba8d..5bc8c9d 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
 // 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 "SPIRV99.1375"
-#define GLSLANG_DATE "31-Jul-2016"
+#define GLSLANG_REVISION "SPIRV99.1401"
+#define GLSLANG_DATE "11-Aug-2016"
diff --git a/glslang/MachineIndependent/InfoSink.cpp b/glslang/MachineIndependent/InfoSink.cpp
index 2e88882..aa0fe89 100644
--- a/glslang/MachineIndependent/InfoSink.cpp
+++ b/glslang/MachineIndependent/InfoSink.cpp
@@ -34,7 +34,7 @@
 
 #include "../Include/InfoSink.h"
 
-#include <string.h>
+#include <cstring>
 
 namespace glslang {
 
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 8523398..0323c1b 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -934,25 +934,25 @@
     if ((profile == EEsProfile && version >= 300) ||
         (profile != EEsProfile && version >= 330)) {
         commonBuiltins.append(
-            "highp int   floatBitsToInt(highp float value);"
-            "highp ivec2 floatBitsToInt(highp vec2  value);"
-            "highp ivec3 floatBitsToInt(highp vec3  value);"
-            "highp ivec4 floatBitsToInt(highp vec4  value);"
-                     
-            "highp uint  floatBitsToUint(highp float value);"
-            "highp uvec2 floatBitsToUint(highp vec2  value);"
-            "highp uvec3 floatBitsToUint(highp vec3  value);"
-            "highp uvec4 floatBitsToUint(highp vec4  value);"
+            "int   floatBitsToInt(highp float value);"
+            "ivec2 floatBitsToInt(highp vec2  value);"
+            "ivec3 floatBitsToInt(highp vec3  value);"
+            "ivec4 floatBitsToInt(highp vec4  value);"
 
-            "highp float intBitsToFloat(highp int   value);"
-            "highp vec2  intBitsToFloat(highp ivec2 value);"
-            "highp vec3  intBitsToFloat(highp ivec3 value);"
-            "highp vec4  intBitsToFloat(highp ivec4 value);"
+            "uint  floatBitsToUint(highp float value);"
+            "uvec2 floatBitsToUint(highp vec2  value);"
+            "uvec3 floatBitsToUint(highp vec3  value);"
+            "uvec4 floatBitsToUint(highp vec4  value);"
 
-            "highp float uintBitsToFloat(highp uint  value);"
-            "highp vec2  uintBitsToFloat(highp uvec2 value);"
-            "highp vec3  uintBitsToFloat(highp uvec3 value);"
-            "highp vec4  uintBitsToFloat(highp uvec4 value);"
+            "float intBitsToFloat(highp int   value);"
+            "vec2  intBitsToFloat(highp ivec2 value);"
+            "vec3  intBitsToFloat(highp ivec3 value);"
+            "vec4  intBitsToFloat(highp ivec4 value);"
+
+            "float uintBitsToFloat(highp uint  value);"
+            "vec2  uintBitsToFloat(highp uvec2 value);"
+            "vec3  uintBitsToFloat(highp uvec3 value);"
+            "vec4  uintBitsToFloat(highp uvec4 value);"
 
             "\n");
     }
@@ -980,15 +980,15 @@
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 400)) {
         commonBuiltins.append(
-            "highp float frexp(highp float, out highp int);"
-            "highp vec2  frexp(highp vec2,  out highp ivec2);"
-            "highp vec3  frexp(highp vec3,  out highp ivec3);"
-            "highp vec4  frexp(highp vec4,  out highp ivec4);"
+            "float frexp(highp float, out highp int);"
+            "vec2  frexp(highp vec2,  out highp ivec2);"
+            "vec3  frexp(highp vec3,  out highp ivec3);"
+            "vec4  frexp(highp vec4,  out highp ivec4);"
 
-            "highp float ldexp(highp float, highp int);"
-            "highp vec2  ldexp(highp vec2,  highp ivec2);"
-            "highp vec3  ldexp(highp vec3,  highp ivec3);"
-            "highp vec4  ldexp(highp vec4,  highp ivec4);"
+            "float ldexp(highp float, highp int);"
+            "vec2  ldexp(highp vec2,  highp ivec2);"
+            "vec3  ldexp(highp vec3,  highp ivec3);"
+            "vec4  ldexp(highp vec4,  highp ivec4);"
 
             "\n");
     }
@@ -1015,7 +1015,7 @@
         (profile != EEsProfile && version >= 400)) {
         commonBuiltins.append(
             "highp uint packUnorm2x16(vec2);"
-            "highp vec2 unpackUnorm2x16(highp uint);"
+                  "vec2 unpackUnorm2x16(highp uint);"
             "\n");
     }
 
@@ -1024,18 +1024,37 @@
         commonBuiltins.append(
             "highp uint packSnorm2x16(vec2);"
             "      vec2 unpackSnorm2x16(highp uint);"
-            "highp uint packHalf2x16(mediump vec2);"
-            "      vec2 unpackHalf2x16(highp uint);"
+            "highp uint packHalf2x16(vec2);"
+            "\n");
+    }
+
+    if (profile == EEsProfile && version >= 300) {
+        commonBuiltins.append(
+            "mediump vec2 unpackHalf2x16(highp uint);"
+            "\n");
+    } else if (profile != EEsProfile && version >= 420) {
+        commonBuiltins.append(
+            "        vec2 unpackHalf2x16(highp uint);"
             "\n");
     }
 
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 400)) {
         commonBuiltins.append(
-            "highp   uint packSnorm4x8  (mediump vec4);"
-            "        vec4 unpackSnorm4x8(highp   uint);"
-            "highp   uint packUnorm4x8  (mediump vec4);"
-            "        vec4 unpackUnorm4x8(highp   uint);"
+            "highp uint packSnorm4x8(vec4);"
+            "highp uint packUnorm4x8(vec4);"
+            "\n");
+    }
+
+    if (profile == EEsProfile && version >= 310) {
+        commonBuiltins.append(
+            "mediump vec4 unpackSnorm4x8(highp uint);"
+            "mediump vec4 unpackUnorm4x8(highp uint);"
+            "\n");
+    } else if (profile != EEsProfile && version >= 400) {
+        commonBuiltins.append(
+                    "vec4 unpackSnorm4x8(highp uint);"
+                    "vec4 unpackUnorm4x8(highp uint);"
             "\n");
     }
 
@@ -1372,6 +1391,11 @@
             "uvec3 bitfieldInsert(uvec3 base, uvec3, int, int);"
             "uvec4 bitfieldInsert(uvec4 base, uvec4, int, int);"
 
+            "\n");
+    }
+
+    if (profile != EEsProfile && version >= 400) {
+        commonBuiltins.append(
             "  int findLSB(  int);"
             "ivec2 findLSB(ivec2);"
             "ivec3 findLSB(ivec3);"
@@ -1383,95 +1407,23 @@
             "ivec4 findLSB(uvec4);"
 
             "\n");
-    }
-
-    if (profile != EEsProfile && version >= 400) {
+    } else if (profile == EEsProfile && version >= 310) {
         commonBuiltins.append(
-            " uint uaddCarry( uint,  uint, out  uint carry);"
-            "uvec2 uaddCarry(uvec2, uvec2, out uvec2 carry);"
-            "uvec3 uaddCarry(uvec3, uvec3, out uvec3 carry);"
-            "uvec4 uaddCarry(uvec4, uvec4, out uvec4 carry);"
+            "lowp   int findLSB(  int);"
+            "lowp ivec2 findLSB(ivec2);"
+            "lowp ivec3 findLSB(ivec3);"
+            "lowp ivec4 findLSB(ivec4);"
 
-            " uint usubBorrow( uint,  uint, out  uint borrow);"
-            "uvec2 usubBorrow(uvec2, uvec2, out uvec2 borrow);"
-            "uvec3 usubBorrow(uvec3, uvec3, out uvec3 borrow);"
-            "uvec4 usubBorrow(uvec4, uvec4, out uvec4 borrow);"
-
-            "void umulExtended( uint,  uint, out  uint, out  uint lsb);"
-            "void umulExtended(uvec2, uvec2, out uvec2, out uvec2 lsb);"
-            "void umulExtended(uvec3, uvec3, out uvec3, out uvec3 lsb);"
-            "void umulExtended(uvec4, uvec4, out uvec4, out uvec4 lsb);"
-
-            "void imulExtended(  int,   int, out   int, out   int lsb);"
-            "void imulExtended(ivec2, ivec2, out ivec2, out ivec2 lsb);"
-            "void imulExtended(ivec3, ivec3, out ivec3, out ivec3 lsb);"
-            "void imulExtended(ivec4, ivec4, out ivec4, out ivec4 lsb);"
-
-            "  int bitfieldReverse(  int);"
-            "ivec2 bitfieldReverse(ivec2);"
-            "ivec3 bitfieldReverse(ivec3);"
-            "ivec4 bitfieldReverse(ivec4);"
-
-            " uint bitfieldReverse( uint);"
-            "uvec2 bitfieldReverse(uvec2);"
-            "uvec3 bitfieldReverse(uvec3);"
-            "uvec4 bitfieldReverse(uvec4);"
-
-            "  int bitCount(  int);"
-            "ivec2 bitCount(ivec2);"
-            "ivec3 bitCount(ivec3);"
-            "ivec4 bitCount(ivec4);"
-
-            "  int bitCount( uint);"
-            "ivec2 bitCount(uvec2);"
-            "ivec3 bitCount(uvec3);"
-            "ivec4 bitCount(uvec4);"
-
-            "  int findMSB(  int);"
-            "ivec2 findMSB(ivec2);"
-            "ivec3 findMSB(ivec3);"
-            "ivec4 findMSB(ivec4);"
-
-            "  int findMSB( uint);"
-            "ivec2 findMSB(uvec2);"
-            "ivec3 findMSB(uvec3);"
-            "ivec4 findMSB(uvec4);"
+            "lowp   int findLSB( uint);"
+            "lowp ivec2 findLSB(uvec2);"
+            "lowp ivec3 findLSB(uvec3);"
+            "lowp ivec4 findLSB(uvec4);"
 
             "\n");
     }
 
-    if (profile == EEsProfile && version >= 310) {
+    if (profile != EEsProfile && version >= 400) {
         commonBuiltins.append(
-            "highp  uint uaddCarry(highp  uint, highp  uint, out lowp  uint carry);"
-            "highp uvec2 uaddCarry(highp uvec2, highp uvec2, out lowp uvec2 carry);"
-            "highp uvec3 uaddCarry(highp uvec3, highp uvec3, out lowp uvec3 carry);"
-            "highp uvec4 uaddCarry(highp uvec4, highp uvec4, out lowp uvec4 carry);"
-
-            "highp  uint usubBorrow(highp  uint, highp  uint, out lowp  uint borrow);"
-            "highp uvec2 usubBorrow(highp uvec2, highp uvec2, out lowp uvec2 borrow);"
-            "highp uvec3 usubBorrow(highp uvec3, highp uvec3, out lowp uvec3 borrow);"
-            "highp uvec4 usubBorrow(highp uvec4, highp uvec4, out lowp uvec4 borrow);"
-
-            "void umulExtended(highp  uint, highp  uint, highp out  uint, out highp  uint lsb);"
-            "void umulExtended(highp uvec2, highp uvec2, highp out uvec2, out highp uvec2 lsb);"
-            "void umulExtended(highp uvec3, highp uvec3, highp out uvec3, out highp uvec3 lsb);"
-            "void umulExtended(highp uvec4, highp uvec4, highp out uvec4, out highp uvec4 lsb);"
-
-            "void imulExtended(highp   int, highp   int, highp out   int, out highp   int lsb);"
-            "void imulExtended(highp ivec2, highp ivec2, highp out ivec2, out highp ivec2 lsb);"
-            "void imulExtended(highp ivec3, highp ivec3, highp out ivec3, out highp ivec3 lsb);"
-            "void imulExtended(highp ivec4, highp ivec4, highp out ivec4, out highp ivec4 lsb);"
-
-            "highp   int bitfieldReverse(highp   int);"
-            "highp ivec2 bitfieldReverse(highp ivec2);"
-            "highp ivec3 bitfieldReverse(highp ivec3);"
-            "highp ivec4 bitfieldReverse(highp ivec4);"
-
-            "highp  uint bitfieldReverse(highp  uint);"
-            "highp uvec2 bitfieldReverse(highp uvec2);"
-            "highp uvec3 bitfieldReverse(highp uvec3);"
-            "highp uvec4 bitfieldReverse(highp uvec4);"
-
             "  int bitCount(  int);"
             "ivec2 bitCount(ivec2);"
             "ivec3 bitCount(ivec3);"
@@ -1491,6 +1443,67 @@
             "ivec2 findMSB(highp uvec2);"
             "ivec3 findMSB(highp uvec3);"
             "ivec4 findMSB(highp uvec4);"
+
+            "\n");
+    }
+
+    if ((profile == EEsProfile && version >= 310) ||
+        (profile != EEsProfile && version >= 400)) {
+        commonBuiltins.append(
+            " uint uaddCarry(highp  uint, highp  uint, out lowp  uint carry);"
+            "uvec2 uaddCarry(highp uvec2, highp uvec2, out lowp uvec2 carry);"
+            "uvec3 uaddCarry(highp uvec3, highp uvec3, out lowp uvec3 carry);"
+            "uvec4 uaddCarry(highp uvec4, highp uvec4, out lowp uvec4 carry);"
+
+            " uint usubBorrow(highp  uint, highp  uint, out lowp  uint borrow);"
+            "uvec2 usubBorrow(highp uvec2, highp uvec2, out lowp uvec2 borrow);"
+            "uvec3 usubBorrow(highp uvec3, highp uvec3, out lowp uvec3 borrow);"
+            "uvec4 usubBorrow(highp uvec4, highp uvec4, out lowp uvec4 borrow);"
+
+            "void umulExtended(highp  uint, highp  uint, highp out  uint, out highp  uint lsb);"
+            "void umulExtended(highp uvec2, highp uvec2, highp out uvec2, out highp uvec2 lsb);"
+            "void umulExtended(highp uvec3, highp uvec3, highp out uvec3, out highp uvec3 lsb);"
+            "void umulExtended(highp uvec4, highp uvec4, highp out uvec4, out highp uvec4 lsb);"
+
+            "void imulExtended(highp   int, highp   int, highp out   int, out highp   int lsb);"
+            "void imulExtended(highp ivec2, highp ivec2, highp out ivec2, out highp ivec2 lsb);"
+            "void imulExtended(highp ivec3, highp ivec3, highp out ivec3, out highp ivec3 lsb);"
+            "void imulExtended(highp ivec4, highp ivec4, highp out ivec4, out highp ivec4 lsb);"
+
+            "  int bitfieldReverse(highp   int);"
+            "ivec2 bitfieldReverse(highp ivec2);"
+            "ivec3 bitfieldReverse(highp ivec3);"
+            "ivec4 bitfieldReverse(highp ivec4);"
+
+            " uint bitfieldReverse(highp  uint);"
+            "uvec2 bitfieldReverse(highp uvec2);"
+            "uvec3 bitfieldReverse(highp uvec3);"
+            "uvec4 bitfieldReverse(highp uvec4);"
+
+            "\n");
+    }
+
+    if (profile == EEsProfile && version >= 310) {
+        commonBuiltins.append(
+            "lowp   int bitCount(  int);"
+            "lowp ivec2 bitCount(ivec2);"
+            "lowp ivec3 bitCount(ivec3);"
+            "lowp ivec4 bitCount(ivec4);"
+
+            "lowp   int bitCount( uint);"
+            "lowp ivec2 bitCount(uvec2);"
+            "lowp ivec3 bitCount(uvec3);"
+            "lowp ivec4 bitCount(uvec4);"
+
+            "lowp   int findMSB(highp   int);"
+            "lowp ivec2 findMSB(highp ivec2);"
+            "lowp ivec3 findMSB(highp ivec3);"
+            "lowp ivec4 findMSB(highp ivec4);"
+
+            "lowp   int findMSB(highp  uint);"
+            "lowp ivec2 findMSB(highp uvec2);"
+            "lowp ivec3 findMSB(highp uvec3);"
+            "lowp ivec4 findMSB(highp uvec4);"
             
             "\n");
     }
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index 31d0b16..bfa2dea 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -44,7 +44,7 @@
 #include "SymbolTable.h"
 #include "propagateNoContraction.h"
 
-#include <float.h>
+#include <cfloat>
 
 namespace glslang {
 
@@ -118,6 +118,10 @@
             return 0;
     }
 
+    // Convert the children's type shape to be compatible.
+    right = addShapeConversion(op,  left->getType(), right);
+    left  = addShapeConversion(op, right->getType(),  left);
+
     //
     // Need a new node holding things together.  Make
     // one and promote it to the right type.
@@ -341,35 +345,11 @@
         node->setOperand(child);
         node->setType(returnType);
 
-        // propagate precision up from child
-        if (profile == EEsProfile && returnType.getQualifier().precision == EpqNone && returnType.getBasicType() != EbtBool)
-            node->getQualifier().precision = child->getQualifier().precision;
-
-        // propagate precision down to child
-        if (node->getQualifier().precision != EpqNone)
-            child->propagatePrecision(node->getQualifier().precision);
-
         return node;
     } else {
         // setAggregateOperater() calls fold() for constant folding
         TIntermTyped* node = setAggregateOperator(childNode, op, returnType, loc);
 
-        // if not folded, we'll still have an aggregate node to propagate precision with
-        if (node->getAsAggregate()) {
-            TPrecisionQualifier correctPrecision = returnType.getQualifier().precision;
-            if (correctPrecision == EpqNone && profile == EEsProfile) {
-                // find the maximum precision from the arguments, for the built-in's return precision
-                TIntermSequence& sequence = node->getAsAggregate()->getSequence();
-                for (unsigned int arg = 0; arg < sequence.size(); ++arg)
-                    correctPrecision = std::max(correctPrecision, sequence[arg]->getAsTyped()->getQualifier().precision);
-            }
-
-            // Propagate precision through this node and its children. That algorithm stops
-            // when a precision is found, so start by clearing this subroot precision
-            node->getQualifier().precision = EpqNone;
-            node->propagatePrecision(correctPrecision);
-        }
-
         return node;
     }
 }
@@ -544,7 +524,7 @@
         if (type.getBasicType() == node->getType().getBasicType())
             return node;
 
-        if (canImplicitlyPromote(node->getType().getBasicType(), type.getBasicType()))
+        if (canImplicitlyPromote(node->getType().getBasicType(), type.getBasicType(), op))
             promoteTo = type.getBasicType();
         else
             return 0;
@@ -718,6 +698,10 @@
     // some operations don't do this
     switch (op) {
     case EOpAssign:
+    case EOpLessThan:
+    case EOpGreaterThan:
+    case EOpLessThanEqual:
+    case EOpGreaterThanEqual:
         break;
     default:
         return node;
@@ -729,7 +713,6 @@
         return node;
 
     // The new node that handles the conversion
-    TIntermTyped* conversionNode = node;
     TOperator constructorOp = mapTypeToConstructorOp(type);
 
     // scalar -> smeared -> vector
@@ -743,11 +726,37 @@
 // 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.
 //
-bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to) const
+bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op) const
 {
     if (profile == EEsProfile || version == 110)
         return false;
 
+    // Some languages allow more general (or potentially, more specific) conversions under some conditions.
+    if (source == EShSourceHlsl) {
+        const bool fromConvertable = (from == EbtFloat || from == EbtDouble || from == EbtInt || from == EbtUint || from == EbtBool);
+        const bool toConvertable = (to == EbtFloat || to == EbtDouble || to == EbtInt || to == EbtUint || to == EbtBool);
+
+        if (fromConvertable && toConvertable) {
+            switch (op) {
+            case EOpAndAssign:               // assignments can perform arbitrary conversions
+            case EOpInclusiveOrAssign:       // ... 
+            case EOpExclusiveOrAssign:       // ... 
+            case EOpAssign:                  // ... 
+            case EOpAddAssign:               // ... 
+            case EOpSubAssign:               // ... 
+            case EOpMulAssign:               // ... 
+            case EOpVectorTimesScalarAssign: // ... 
+            case EOpMatrixTimesScalarAssign: // ... 
+            case EOpDivAssign:               // ... 
+            case EOpModAssign:               // ... 
+            case EOpReturn:                  // function returns can also perform arbitrary conversions
+                return true;
+            default:
+                break;
+            }
+        }
+    }
+
     switch (to) {
     case EbtDouble:
         switch (from) {
@@ -1648,11 +1657,11 @@
     case EOpGreaterThan:
     case EOpLessThanEqual:
     case EOpGreaterThanEqual:
-        // Relational comparisons need matching numeric types and will promote to scalar Boolean.
-        if (left->getBasicType() == EbtBool || left->getType().isVector() || left->getType().isMatrix())
+        // Relational comparisons need numeric types and will promote to scalar Boolean.
+        if (left->getBasicType() == EbtBool)
             return false;
-
-        // Fall through
+        setType(TType(EbtBool));
+        break;
 
     case EOpEqual:
     case EOpNotEqual:
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 2ef0286..7211d4b 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -39,7 +39,7 @@
 #include "Scan.h"
 
 #include "../OSDependent/osinclude.h"
-#include <stdarg.h>
+#include <cstdarg>
 #include <algorithm>
 
 #include "preprocessor/PpContext.h"
@@ -253,7 +253,7 @@
 //
 bool TParseContext::parseVectorFields(const TSourceLoc& loc, const TString& compString, int vecSize, TVectorFields& fields)
 {
-    fields.num = (int) compString.size();
+    fields.num = (int)compString.size();
     if (fields.num > 4) {
         error(loc, "illegal vector field selection", compString.c_str(), "");
         return false;
@@ -761,13 +761,32 @@
 }
 
 // Handle seeing a binary node with a math operation.
+// Returns nullptr if not semantically allowed.
 TIntermTyped* TParseContext::handleBinaryMath(const TSourceLoc& loc, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right)
 {
     rValueErrorCheck(loc, str, left->getAsTyped());
     rValueErrorCheck(loc, str, right->getAsTyped());
 
-    TIntermTyped* result = intermediate.addBinaryMath(op, left, right, loc);
-    if (! result)
+    bool allowed = true;
+    switch (op) {
+    // TODO: Bring more source language-specific checks up from intermediate.cpp
+    // to the specific parse helpers for that source language.
+    case EOpLessThan:
+    case EOpGreaterThan:
+    case EOpLessThanEqual:
+    case EOpGreaterThanEqual:
+        if (! left->isScalar() || ! right->isScalar())
+            allowed = false;
+        break;
+    default:
+        break;
+    }
+
+    TIntermTyped* result = nullptr;
+    if (allowed)
+        result = intermediate.addBinaryMath(op, left, right, loc);
+
+    if (result == nullptr)
         binaryOpError(loc, str, left->getCompleteString(), right->getCompleteString());
 
     return result;
@@ -865,7 +884,7 @@
                 TString vectorString = field;
                 TIntermTyped* index = intermediate.addSwizzle(fields, loc);
                 result = intermediate.addIndex(EOpVectorSwizzle, base, index, loc);
-                result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, (int) vectorString.size()));
+                result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, (int)vectorString.size()));
             }
             // Swizzle operations propagate specialization-constantness
             if (base->getType().getQualifier().isSpecConstant())
@@ -1078,17 +1097,16 @@
 {
     TIntermTyped* result = nullptr;
 
-    TOperator op = function->getBuiltInOp();
-    if (op == EOpArrayLength)
+    if (function->getBuiltInOp() == EOpArrayLength)
         result = handleLengthMethod(loc, function, arguments);
-    else if (op != EOpNull) {
+    else if (function->getBuiltInOp() != EOpNull) {
         //
         // Then this should be a constructor.
         // Don't go through the symbol table for constructors.
         // Their parameters will be verified algorithmically.
         //
         TType type(EbtVoid);  // use this to get the type back
-        if (! constructorError(loc, arguments, *function, op, type)) {
+        if (! constructorError(loc, arguments, *function, function->getBuiltInOp(), type)) {
             //
             // It's a constructor, of type 'type'.
             //
@@ -1149,18 +1167,9 @@
                 addInputArgumentConversions(*fnCandidate, arguments);  // arguments may be modified if it's just a single argument node
             }
 
-            op = fnCandidate->getBuiltInOp();
-            if (builtIn && op != EOpNull) {
+            if (builtIn && fnCandidate->getBuiltInOp() != EOpNull) {
                 // A function call mapped to a built-in operation.
-                checkLocation(loc, op);
-                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",
-                                               static_cast<TIntermTyped*>(arguments)->getCompleteString().c_str());
-                } else if (result->getAsOperator()) {
-                    builtInOpCheck(loc, *fnCandidate, *result->getAsOperator());
-                }
+                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.
@@ -1207,6 +1216,118 @@
     return result;
 }
 
+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());
+    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());
+    } else if (result->getAsOperator())
+        builtInOpCheck(loc, function, *result->getAsOperator());
+
+    return result;
+}
+
+// "The operation of a built-in function can have a different precision
+// qualification than the precision qualification of the resulting value.
+// These two precision qualifications are established as follows.
+//
+// The precision qualification of the operation of a built-in function is
+// based on the precision qualification of its input arguments and formal
+// parameters:  When a formal parameter specifies a precision qualifier,
+// that is used, otherwise, the precision qualification of the calling
+// argument is used.  The highest precision of these will be the precision
+// qualification of the operation of the built-in function. Generally,
+// this is applied across all arguments to a built-in function, with the
+// exceptions being:
+//   - bitfieldExtract and bitfieldInsert ignore the 'offset' and 'bits'
+//     arguments.
+//   - interpolateAt* functions only look at the 'interpolant' argument.
+//
+// The precision qualification of the result of a built-in function is
+// determined in one of the following ways:
+//
+//   - For the texture sampling, image load, and image store functions,
+//     the precision of the return type matches the precision of the
+//     sampler type
+//
+//   Otherwise:
+//
+//   - For prototypes that do not specify a resulting precision qualifier,
+//     the precision will be the same as the precision of the operation.
+//
+//   - For prototypes that do specify a resulting precision qualifier,
+//     the specified precision qualifier is the precision qualification of
+//     the result."
+//
+void TParseContext::computeBuiltinPrecisions(TIntermTyped& node, const TFunction& function)
+{
+    TPrecisionQualifier operationPrecision = EpqNone;
+    TPrecisionQualifier resultPrecision = EpqNone;
+
+    if (profile != EEsProfile)
+        return;
+
+    TIntermOperator* opNode = node.getAsOperator();
+    if (opNode == nullptr)
+        return;
+
+    if (TIntermUnary* unaryNode = node.getAsUnaryNode()) {
+        operationPrecision = std::max(function[0].type->getQualifier().precision,
+                                      unaryNode->getOperand()->getType().getQualifier().precision);
+        if (function.getType().getBasicType() != EbtBool)
+            resultPrecision = function.getType().getQualifier().precision == EpqNone ? 
+                                        operationPrecision :
+                                        function.getType().getQualifier().precision;
+    } else if (TIntermAggregate* agg = node.getAsAggregate()) {
+        TIntermSequence& sequence = agg->getSequence();
+        int numArgs = (int)sequence.size();
+        switch (agg->getOp()) {
+        case EOpBitfieldExtract:
+            numArgs = 1;
+            break;
+        case EOpBitfieldInsert:
+            numArgs = 2;
+            break;
+        case EOpInterpolateAtCentroid:
+        case EOpInterpolateAtOffset:
+        case EOpInterpolateAtSample:
+            numArgs = 1;
+            break;
+        default:
+            break;
+        }
+        // find the maximum precision from the arguments and parameters
+        for (unsigned int arg = 0; arg < sequence.size(); ++arg) {
+            operationPrecision = std::max(operationPrecision, sequence[arg]->getAsTyped()->getQualifier().precision);
+            operationPrecision = std::max(operationPrecision, function[arg].type->getQualifier().precision);
+        }
+        // compute the result precision
+        if (agg->isSampling() || agg->getOp() == EOpImageLoad || agg->getOp() == EOpImageStore)
+            resultPrecision = sequence[0]->getAsTyped()->getQualifier().precision;
+        else if (function.getType().getBasicType() != EbtBool)
+            resultPrecision = function.getType().getQualifier().precision == EpqNone ? 
+                                        operationPrecision :
+                                        function.getType().getQualifier().precision;
+    }
+
+    // Propagate precision through this node and its children. That algorithm stops
+    // when a precision is found, so start by clearing this subroot precision
+    opNode->getQualifier().precision = EpqNone;
+    if (operationPrecision != EpqNone) {
+        opNode->propagatePrecision(operationPrecision);
+        opNode->setOperationPrecision(operationPrecision);
+    }
+    // Now, set the result precision, which might not match
+    opNode->getQualifier().precision = resultPrecision;
+}
+
 TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value)
 {
     functionReturnsValue = true;
@@ -1433,11 +1554,6 @@
     }
     const TIntermSequence& aggArgs = *argp;  // only valid when unaryArg is nullptr
 
-    // built-in texturing functions get their return value precision from the precision of the sampler
-    if (fnCandidate.getType().getQualifier().precision == EpqNone &&
-        fnCandidate.getParamCount() > 0 && fnCandidate[0].type->getBasicType() == EbtSampler)
-        callNode.getQualifier().precision = arg0->getQualifier().precision;
-
     switch (callNode.getOp()) {
     case EOpTextureGather:
     case EOpTextureGatherOffset:
@@ -1569,11 +1685,6 @@
     case EOpInterpolateAtCentroid:
     case EOpInterpolateAtSample:
     case EOpInterpolateAtOffset:
-        // "For the interpolateAt* functions, the call will return a precision
-        // qualification matching the precision of the 'interpolant' argument to
-        // the function call."
-        callNode.getQualifier().precision = arg0->getQualifier().precision;
-
         // 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.
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index a5e6f65..544c3d3 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -197,6 +197,8 @@
     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);
+    void computeBuiltinPrecisions(TIntermTyped&, const TFunction&);
     TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
     void checkLocation(const TSourceLoc&, TOperator);
     TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*);
diff --git a/glslang/MachineIndependent/PoolAlloc.cpp b/glslang/MachineIndependent/PoolAlloc.cpp
index d56979b..9dfcd30 100644
--- a/glslang/MachineIndependent/PoolAlloc.cpp
+++ b/glslang/MachineIndependent/PoolAlloc.cpp
@@ -53,7 +53,7 @@
     TThreadMemoryPools* threadData = new TThreadMemoryPools();
     
     threadData->threadPoolAllocator = threadPoolAllocator;
-    	
+
     OS_SetTLSValue(PoolIndex, threadData);
 }
 
@@ -63,7 +63,7 @@
     TThreadMemoryPools* globalPools = static_cast<TThreadMemoryPools*>(OS_GetTLSValue(PoolIndex));    
     if (! globalPools)
         return;
-	
+
     GetThreadPoolAllocator().popAll();
     delete &GetThreadPoolAllocator();       
     delete globalPools;
@@ -149,12 +149,12 @@
 
 TPoolAllocator::~TPoolAllocator()
 {
-	while (inUseList) {
-	    tHeader* next = inUseList->nextPage;
+    while (inUseList) {
+        tHeader* next = inUseList->nextPage;
         inUseList->~tHeader();
         delete [] reinterpret_cast<char*>(inUseList);
-	    inUseList = next;
-	}
+        inUseList = next;
+    }
 
     //
     // Always delete the free list memory - it can't be being
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index e297e34..ee0dbb4 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -38,7 +38,7 @@
 // GLSL scanning, leveraging the scanning done by the preprocessor.
 //
 
-#include <string.h>
+#include <cstring>
 #include <unordered_map>
 #include <unordered_set>
 
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index dccc1f0..97c3940 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -41,7 +41,7 @@
 // This is the platform independent interface between an OGL driver
 // and the shading language compiler/linker.
 //
-#include <string.h>
+#include <cstring>
 #include <iostream>
 #include <sstream>
 #include <memory>
@@ -146,6 +146,23 @@
     return index;
 }
 
+const int SourceCount = 2;
+
+int MapSourceToIndex(EShSource source)
+{
+    int index = 0;
+
+    switch (source) {
+    case EShSourceGlsl: index = 0; break;
+    case EShSourceHlsl: index = 1; break;
+    default:                       break;
+    }
+
+    assert(index < SourceCount);
+
+    return index;
+}
+
 // only one of these needed for non-ES; ES needs 2 for different precision defaults of built-ins
 enum EPrecisionClass {
     EPcGeneral,
@@ -161,8 +178,8 @@
 // Each has a different set of built-ins, and we want to preserve that from
 // compile to compile.
 //
-TSymbolTable* CommonSymbolTable[VersionCount][SpvVersionCount][ProfileCount][EPcCount] = {};
-TSymbolTable* SharedSymbolTables[VersionCount][SpvVersionCount][ProfileCount][EShLangCount] = {};
+TSymbolTable* CommonSymbolTable[VersionCount][SpvVersionCount][ProfileCount][SourceCount][EPcCount] = {};
+TSymbolTable* SharedSymbolTables[VersionCount][SpvVersionCount][ProfileCount][SourceCount][EShLangCount] = {};
 
 TPoolAllocator* PerProcessGPA = 0;
 
@@ -305,7 +322,8 @@
     int versionIndex = MapVersionToIndex(version);
     int spvVersionIndex = MapSpvVersionToIndex(spvVersion);
     int profileIndex = MapProfileToIndex(profile);
-    if (CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][EPcGeneral]) {
+    int sourceIndex = MapSourceToIndex(source);
+    if (CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][EPcGeneral]) {
         glslang::ReleaseGlobalLock();
 
         return;
@@ -333,18 +351,18 @@
     // 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) {
         if (! commonTable[precClass]->isEmpty()) {
-            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][precClass] = new TSymbolTable;
-            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][precClass]->copyTable(*commonTable[precClass]);
-            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][precClass]->readOnly();
+            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][precClass] = new TSymbolTable;
+            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][precClass]->copyTable(*commonTable[precClass]);
+            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][precClass]->readOnly();
         }
     }
     for (int stage = 0; stage < EShLangCount; ++stage) {
         if (! stageTables[stage]->isEmpty()) {
-            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][stage] = new TSymbolTable;
-            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][stage]->adoptLevels(*CommonSymbolTable
-                              [versionIndex][spvVersionIndex][profileIndex][CommonIndex(profile, (EShLanguage)stage)]);
-            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][stage]->copyTable(*stageTables[stage]);
-            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][stage]->readOnly();
+            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage] = new TSymbolTable;
+            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage]->adoptLevels(*CommonSymbolTable
+                              [versionIndex][spvVersionIndex][profileIndex][sourceIndex][CommonIndex(profile, (EShLanguage)stage)]);
+            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage]->copyTable(*stageTables[stage]);
+            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage]->readOnly();
         }    
     }
 
@@ -656,6 +674,7 @@
     TSymbolTable* cachedTable = SharedSymbolTables[MapVersionToIndex(version)]
                                                   [MapSpvVersionToIndex(spvVersion)]
                                                   [MapProfileToIndex(profile)]
+                                                  [MapSourceToIndex(source)]
                                                   [compiler->getLanguage()];
     
     // Dynamically allocate the symbol table so we can control when it is deallocated WRT the pool.
@@ -1092,9 +1111,11 @@
     for (int version = 0; version < VersionCount; ++version) {
         for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {
             for (int p = 0; p < ProfileCount; ++p) {
-                for (int lang = 0; lang < EShLangCount; ++lang) {
-                    delete SharedSymbolTables[version][spvVersion][p][lang];
-                    SharedSymbolTables[version][spvVersion][p][lang] = 0;
+                for (int source = 0; source < SourceCount; ++source) {
+                    for (int stage = 0; stage < EShLangCount; ++stage) {
+                        delete SharedSymbolTables[version][spvVersion][p][source][stage];
+                        SharedSymbolTables[version][spvVersion][p][source][stage] = 0;
+                    }
                 }
             }
         }
@@ -1103,9 +1124,11 @@
     for (int version = 0; version < VersionCount; ++version) {
         for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {
             for (int p = 0; p < ProfileCount; ++p) {
-                for (int pc = 0; pc < EPcCount; ++pc) {
-                    delete CommonSymbolTable[version][spvVersion][p][pc];
-                    CommonSymbolTable[version][spvVersion][p][pc] = 0;
+                for (int source = 0; source < SourceCount; ++source) {
+                    for (int pc = 0; pc < EPcCount; ++pc) {
+                        delete CommonSymbolTable[version][spvVersion][p][source][pc];
+                        CommonSymbolTable[version][spvVersion][p][source][pc] = 0;
+                    }
                 }
             }
         }
diff --git a/glslang/MachineIndependent/SymbolTable.cpp b/glslang/MachineIndependent/SymbolTable.cpp
index bf0f1f9..630053a 100644
--- a/glslang/MachineIndependent/SymbolTable.cpp
+++ b/glslang/MachineIndependent/SymbolTable.cpp
@@ -250,7 +250,7 @@
 }
 
 TVariable::TVariable(const TVariable& copyOf) : TSymbol(copyOf)
-{	
+{
     type.deepCopy(copyOf.type);
     userType = copyOf.userType;
     numExtensions = 0;
@@ -276,7 +276,7 @@
 }
 
 TFunction::TFunction(const TFunction& copyOf) : TSymbol(copyOf)
-{	
+{
     for (unsigned int i = 0; i < copyOf.parameters.size(); ++i) {
         TParameter param;
         parameters.push_back(param);
diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp
index 893f42b..0ef37c4 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -38,11 +38,9 @@
 #include "../Include/InfoSink.h"
 
 #ifdef _MSC_VER
-#include <float.h>
-#elif defined __ANDROID__ || defined __linux__ || __MINGW32__ || __MINGW64__
-#include <cmath>
+#include <cfloat>
 #else
-#include <math.h>
+#include <cmath>
 #endif
 
 namespace {
@@ -50,10 +48,8 @@
 bool is_positive_infinity(double x) {
 #ifdef _MSC_VER
   return _fpclass(x) == _FPCLASS_PINF;
-#elif defined __ANDROID__ || defined __linux__ || __MINGW32__ || __MINGW64__
-  return std::isinf(x) && (x >= 0);
 #else
-  return isinf(x) && (x >= 0);
+  return std::isinf(x) && (x >= 0);
 #endif
 }
 
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index 0bc1d91..dbd2f92 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -664,37 +664,93 @@
             size = computeTypeLocationSize(type);
     }
 
-    // locations...
-    TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation + size - 1);
+    // Locations, and components within locations.
+    //
+    // Almost always, dealing with components means a single location is involved.
+    // The exception is a dvec3. From the spec:
+    //
+    // "A dvec3 will consume all four components of the first location and components 0 and 1 of
+    // the second location. This leaves components 2 and 3 available for other component-qualified
+    // declarations."
+    //
+    // That means, without ever mentioning a component, a component range
+    // for a different location gets specified, if it's not a vertex shader input. (!)
+    // (A vertex shader input will show using only one location, even for a dvec3/4.)
+    //
+    // So, for the case of dvec3, we need two independent ioRanges.
 
-    // components in this location slot...    
-    TRange componentRange(0, 3);
-    if (qualifier.hasComponent() || type.getVectorSize() > 0) {
-        int consumedComponents = type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1);
-        if (qualifier.hasComponent())
-            componentRange.start = qualifier.layoutComponent;
-        componentRange.last  = componentRange.start + consumedComponents - 1;
+    int collision = -1; // no collision
+    if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 &&
+        (qualifier.isPipeInput() || qualifier.isPipeOutput())) {
+        // Dealing with dvec3 in/out split across two locations.
+        // Need two io-ranges.
+        // The case where the dvec3 doesn't start at component 0 was previously caught as overflow.
+
+        // First range:
+        TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation);
+        TRange componentRange(0, 3);
+        TIoRange range(locationRange, componentRange, type.getBasicType(), 0);
+
+        // check for collisions
+        collision = checkLocationRange(set, range, type, typeCollision);
+        if (collision < 0) {
+            usedIo[set].push_back(range);
+
+            // Second range:
+            TRange locationRange2(qualifier.layoutLocation + 1, qualifier.layoutLocation + 1);
+            TRange componentRange2(0, 1);
+            TIoRange range2(locationRange2, componentRange2, type.getBasicType(), 0);
+
+            // check for collisions
+            collision = checkLocationRange(set, range2, type, typeCollision);
+            if (collision < 0)
+                usedIo[set].push_back(range2);
+        }
+    } else {
+        // Not a dvec3 in/out split across two locations, generic path.
+        // Need a single IO-range block.
+
+        TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation + size - 1);
+        TRange componentRange(0, 3);
+        if (qualifier.hasComponent() || type.getVectorSize() > 0) {
+            int consumedComponents = type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1);
+            if (qualifier.hasComponent())
+                componentRange.start = qualifier.layoutComponent;
+            componentRange.last  = componentRange.start + consumedComponents - 1;
+        }
+
+        // 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()))
+            collision = checkLocationRange(set, range, type, typeCollision);
+
+        if (collision < 0)
+            usedIo[set].push_back(range);
     }
 
-    // both...
-    TIoRange range(locationRange, componentRange, type.getBasicType(), qualifier.hasIndex() ? qualifier.layoutIndex : 0);
+    return collision;
+}
 
-    // check for collisions, except for vertex inputs on desktop
-    if (! (profile != EEsProfile && language == EShLangVertex && qualifier.isPipeInput())) {
-        for (size_t r = 0; r < usedIo[set].size(); ++r) {
-            if (range.overlap(usedIo[set][r])) {
-                // there is a collision; pick one
-                return std::max(locationRange.start, usedIo[set][r].location.start);
-            } else if (locationRange.overlap(usedIo[set][r].location) && type.getBasicType() != usedIo[set][r].basicType) {
-                // aliased-type mismatch
-                typeCollision = true;
-                return std::max(locationRange.start, usedIo[set][r].location.start);
-            }
+// Compare a new (the passed in) 'range' against the existing set, and see
+// if there are any collisions.
+//
+// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
+//
+int TIntermediate::checkLocationRange(int set, const TIoRange& range, const TType& type, bool& typeCollision)
+{
+    for (size_t r = 0; r < usedIo[set].size(); ++r) {
+        if (range.overlap(usedIo[set][r])) {
+            // there is a collision; pick one
+            return std::max(range.location.start, usedIo[set][r].location.start);
+        } else if (range.location.overlap(usedIo[set][r].location) && type.getBasicType() != usedIo[set][r].basicType) {
+            // aliased-type mismatch
+            typeCollision = true;
+            return std::max(range.location.start, usedIo[set][r].location.start);
         }
     }
 
-    usedIo[set].push_back(range);
-
     return -1; // no collision
 }
 
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 7bd457d..80deabe 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -189,7 +189,7 @@
     TIntermTyped* addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index, TSourceLoc);
     TIntermTyped* addUnaryMath(TOperator, TIntermTyped* child, TSourceLoc);
     TIntermTyped* addBuiltInFunctionCall(const TSourceLoc& line, TOperator, bool unary, TIntermNode*, const TType& returnType);
-    bool canImplicitlyPromote(TBasicType from, TBasicType to) const;
+    bool canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op = EOpNull) const;
     TOperator mapTypeToConstructorOp(const TType&) const;
     TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right);
     TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&);
@@ -331,6 +331,7 @@
     bool inIoAccessed(const TString& name) const { return ioAccessed.find(name) != ioAccessed.end(); }
 
     int addUsedLocation(const TQualifier&, const TType&, bool& typeCollision);
+    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;
diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp
index d771010..d28e7be 100644
--- a/glslang/MachineIndependent/preprocessor/Pp.cpp
+++ b/glslang/MachineIndependent/preprocessor/Pp.cpp
@@ -81,12 +81,10 @@
 
 #define _CRT_SECURE_NO_WARNINGS
 
-#include <stdarg.h>
-#include <stdio.h>
 #include <sstream>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
+#include <cstdlib>
+#include <cstring>
+#include <cctype>
 
 #include "PpContext.h"
 #include "PpTokens.h"
diff --git a/glslang/MachineIndependent/preprocessor/PpAtom.cpp b/glslang/MachineIndependent/preprocessor/PpAtom.cpp
index 763b6b4..2b21193 100644
--- a/glslang/MachineIndependent/preprocessor/PpAtom.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpAtom.cpp
@@ -82,10 +82,9 @@
 
 #define _CRT_SECURE_NO_WARNINGS
 
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
 
 #include "PpContext.h"
 #include "PpTokens.h"
@@ -98,6 +97,32 @@
     int val;
     const char* str;
 } tokens[] = {
+
+    { PpAtomAdd,            "+=" },
+    { PpAtomSub,            "-=" },
+    { PpAtomMul,            "*=" },
+    { PpAtomDiv,            "/=" },
+    { PpAtomMod,            "%=" },
+    { PpAtomRight,          ">>" },
+    { PpAtomLeft,           "<<" },
+    { PpAtomAnd,            "&&" },
+    { PpAtomOr,             "||" },
+    { PpAtomXor,            "^^" },
+
+    { PpAtomRightAssign,    ">>=" },
+    { PpAtomLeftAssign,     "<<=" },
+    { PpAtomAndAssign,      "&=" },
+    { PpAtomOrAssign,       "|=" },
+    { PpAtomXorAssign,      "^=" },
+
+    { PpAtomEQ,             "==" },
+    { PpAtomNE,             "!=" },
+    { PpAtomGE,             ">=" },
+    { PpAtomLE,             "<=" },
+
+    { PpAtomDecrement,      "--" },
+    { PpAtomIncrement,      "++" },
+
     { PpAtomDefine,         "define" },
     { PpAtomDefined,        "defined" },
     { PpAtomUndef,          "undef" },
@@ -121,8 +146,7 @@
     { PpAtomFileMacro,       "__FILE__" },
     { PpAtomVersionMacro,    "__VERSION__" },
 
-    { PpAtomInclude,        "include" },
-
+    { PpAtomInclude,         "include" },
 };
 
 } // end anonymous namespace
diff --git a/glslang/MachineIndependent/preprocessor/PpContext.cpp b/glslang/MachineIndependent/preprocessor/PpContext.cpp
index 6f0b8a9..6791fef 100644
--- a/glslang/MachineIndependent/preprocessor/PpContext.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpContext.cpp
@@ -76,8 +76,7 @@
 NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \****************************************************************************/
 
-#include <stdio.h>
-#include <stdlib.h>
+#include <cstdlib>
 
 #include "PpContext.h"
 
diff --git a/glslang/MachineIndependent/preprocessor/PpMemory.cpp b/glslang/MachineIndependent/preprocessor/PpMemory.cpp
index 57a49fb..6158a38 100644
--- a/glslang/MachineIndependent/preprocessor/PpMemory.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpMemory.cpp
@@ -76,10 +76,9 @@
 NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \****************************************************************************/
 
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
+#include <cstddef>
+#include <cstdlib>
+#include <cstring>
 
 #include "PpContext.h"
 
diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
index 5ce5a03..fc1c301 100644
--- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
@@ -81,10 +81,8 @@
 
 #define _CRT_SECURE_NO_WARNINGS
 
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <cstdlib>
+#include <cstring>
 
 #include "PpContext.h"
 #include "PpTokens.h"
diff --git a/glslang/MachineIndependent/preprocessor/PpSymbols.cpp b/glslang/MachineIndependent/preprocessor/PpSymbols.cpp
index c2ab7c0..b7f1df5 100644
--- a/glslang/MachineIndependent/preprocessor/PpSymbols.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpSymbols.cpp
@@ -79,10 +79,9 @@
 // symbols.c
 //
 
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
 
 #include "PpContext.h"
 
diff --git a/glslang/MachineIndependent/preprocessor/PpTokens.cpp b/glslang/MachineIndependent/preprocessor/PpTokens.cpp
index 61883c9..1e1b0a2 100644
--- a/glslang/MachineIndependent/preprocessor/PpTokens.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpTokens.cpp
@@ -85,11 +85,10 @@
 #define snprintf sprintf_s
 #endif
 
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+#include <cctype>
 
 #include "PpContext.h"
 #include "PpTokens.h"
diff --git a/glslang/OSDependent/Windows/ossource.cpp b/glslang/OSDependent/Windows/ossource.cpp
index 1d09fd3..f71fac9 100644
--- a/glslang/OSDependent/Windows/ossource.cpp
+++ b/glslang/OSDependent/Windows/ossource.cpp
@@ -37,14 +37,14 @@
 #define STRICT
 #define VC_EXTRALEAN 1
 #include <windows.h>
-#include <assert.h>
+#include <cassert>
 #include <process.h>
 #include <psapi.h>
-#include <stdio.h>
-#include <stdint.h>
+#include <cstdio>
+#include <cstdint>
 
 //
-// This file contains contains the Window-OS-specific functions
+// This file contains the Window-OS-specific functions
 //
 
 #if !(defined(_WIN32) || defined(_WIN64))
@@ -55,12 +55,12 @@
 
 inline OS_TLSIndex ToGenericTLSIndex (DWORD handle)
 {
-	return (OS_TLSIndex)((uintptr_t)handle + 1);
+    return (OS_TLSIndex)((uintptr_t)handle + 1);
 }
 
 inline DWORD ToNativeTLSIndex (OS_TLSIndex nIndex)
 {
-	return (DWORD)((uintptr_t)nIndex - 1);
+    return (DWORD)((uintptr_t)nIndex - 1);
 }
 
 //
@@ -68,46 +68,46 @@
 //
 OS_TLSIndex OS_AllocTLSIndex()
 {
-	DWORD dwIndex = TlsAlloc();
-	if (dwIndex == TLS_OUT_OF_INDEXES) {
-		assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage");
-		return OS_INVALID_TLS_INDEX;
-	}
+    DWORD dwIndex = TlsAlloc();
+    if (dwIndex == TLS_OUT_OF_INDEXES) {
+        assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage");
+        return OS_INVALID_TLS_INDEX;
+    }
 
-	return ToGenericTLSIndex(dwIndex);
+    return ToGenericTLSIndex(dwIndex);
 }
 
 
 bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue)
 {
-	if (nIndex == OS_INVALID_TLS_INDEX) {
-		assert(0 && "OS_SetTLSValue(): Invalid TLS Index");
-		return false;
-	}
+    if (nIndex == OS_INVALID_TLS_INDEX) {
+        assert(0 && "OS_SetTLSValue(): Invalid TLS Index");
+        return false;
+    }
 
-	if (TlsSetValue(ToNativeTLSIndex(nIndex), lpvValue))
-		return true;
-	else
-		return false;
+    if (TlsSetValue(ToNativeTLSIndex(nIndex), lpvValue))
+        return true;
+    else
+        return false;
 }
 
 void* OS_GetTLSValue(OS_TLSIndex nIndex)
 {
-	assert(nIndex != OS_INVALID_TLS_INDEX);
-	return TlsGetValue(ToNativeTLSIndex(nIndex));
+    assert(nIndex != OS_INVALID_TLS_INDEX);
+    return TlsGetValue(ToNativeTLSIndex(nIndex));
 }
 
 bool OS_FreeTLSIndex(OS_TLSIndex nIndex)
 {
-	if (nIndex == OS_INVALID_TLS_INDEX) {
-		assert(0 && "OS_SetTLSValue(): Invalid TLS Index");
-		return false;
-	}
+    if (nIndex == OS_INVALID_TLS_INDEX) {
+        assert(0 && "OS_SetTLSValue(): Invalid TLS Index");
+        return false;
+    }
 
-	if (TlsFree(ToNativeTLSIndex(nIndex)))
-		return true;
-	else
-		return false;
+    if (TlsFree(ToNativeTLSIndex(nIndex)))
+        return true;
+    else
+        return false;
 }
 
 HANDLE GlobalLock;
@@ -129,7 +129,7 @@
 
 unsigned int __stdcall EnterGenericThread (void* entry)
 {
-	return ((TThreadEntrypoint)entry)(0);
+    return ((TThreadEntrypoint)entry)(0);
 }
 
 void* OS_CreateThread(TThreadEntrypoint entry)
diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
index 4b4d0fc..d112159 100644
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -37,7 +37,7 @@
 #include "../Include/ResourceLimits.h"
 #include "../MachineIndependent/Versions.h"
 
-#include <string.h>
+#include <cstring>
 
 #ifdef _WIN32
 #define C_DECL __cdecl
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
index 55c7139..3e3b6b4 100644
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -91,6 +91,10 @@
         {"hlsl.gather.basic.dx10.vert", "main"},
         {"hlsl.gather.offset.dx10.frag", "main"},
         {"hlsl.gather.offsetarray.dx10.frag", "main"},
+        {"hlsl.gatherRGBA.array.dx10.frag", "main"},
+        {"hlsl.gatherRGBA.basic.dx10.frag", "main"},
+        {"hlsl.gatherRGBA.offset.dx10.frag", "main"},
+        {"hlsl.gatherRGBA.offsetarray.dx10.frag", "main"},
         {"hlsl.getdimensions.dx10.frag", "main"},
         {"hlsl.getdimensions.dx10.vert", "main"},
         {"hlsl.getsampleposition.dx10.frag", "main"},
@@ -117,6 +121,7 @@
         {"hlsl.load.offsetarray.dx10.frag", "main"},
         {"hlsl.numericsuffixes.frag", "main"},
         {"hlsl.pp.line.frag", "main"},
+        {"hlsl.promotions.frag", "main"},
         {"hlsl.sample.array.dx10.frag", "main"},
         {"hlsl.sample.basic.dx10.frag", "main"},
         {"hlsl.sample.offset.dx10.frag", "main"},
@@ -143,6 +148,7 @@
         {"hlsl.samplelevel.basic.dx10.vert", "main"},
         {"hlsl.samplelevel.offset.dx10.frag", "main"},
         {"hlsl.samplelevel.offsetarray.dx10.frag", "main"},
+        {"hlsl.semicolons.frag", "main"},
         {"hlsl.shapeConv.frag", "main"},
         {"hlsl.intrinsics.vert", "VertexShaderFunction"},
         {"hlsl.matType.frag", "PixelShaderFunction"},
diff --git a/gtests/Initializer.h b/gtests/Initializer.h
index 34af9ad..b46b3f5 100644
--- a/gtests/Initializer.h
+++ b/gtests/Initializer.h
@@ -40,46 +40,14 @@
 namespace glslangtest {
 
 // Initializes glslang on creation, and destroys it on completion.
-// And provides .Acquire() as a way to reinitialize glslang if semantics change.
 // This object is expected to be a singleton, so that internal glslang state
 // can be correctly handled.
 //
-// TODO(antiagainst): It's a known bug that some of the internal states need to
-// be reset if semantics change:
-//   https://github.com/KhronosGroup/glslang/issues/166
-// Therefore, the following mechanism is needed. Remove this once the above bug
-// gets fixed.
 class GlslangInitializer {
 public:
-    GlslangInitializer() : lastMessages(EShMsgCascadingErrors)
-    {
-        glslang::InitializeProcess();
-    }
+    GlslangInitializer()  { glslang::InitializeProcess(); }
 
     ~GlslangInitializer() { glslang::FinalizeProcess(); }
-
-    // A token indicates that the glslang is reinitialized (if necessary) to the
-    // required semantics. And that won't change until the token is destroyed.
-    class InitializationToken {
-    };
-
-    // Re-initializes glsl state iff the previous messages and the current
-    // messages are incompatible.  We assume external synchronization, i.e.
-    // there is at most one acquired token at any one time.
-    InitializationToken acquire(EShMessages new_messages)
-    {
-        if ((lastMessages ^ new_messages) &
-            (EShMsgVulkanRules | EShMsgSpvRules | EShMsgReadHlsl)) {
-            glslang::FinalizeProcess();
-            glslang::InitializeProcess();
-        }
-        lastMessages = new_messages;
-        return InitializationToken();
-    }
-
-private:
-
-    EShMessages lastMessages;
 };
 
 }  // namespace glslangtest
diff --git a/gtests/TestFixture.h b/gtests/TestFixture.h
index 8dffb80..4f916e7 100644
--- a/gtests/TestFixture.h
+++ b/gtests/TestFixture.h
@@ -35,7 +35,7 @@
 #ifndef GLSLANG_GTESTS_TEST_FIXTURE_H
 #define GLSLANG_GTESTS_TEST_FIXTURE_H
 
-#include <stdint.h>
+#include <cstdint>
 #include <fstream>
 #include <sstream>
 #include <streambuf>
@@ -179,8 +179,6 @@
 
         shader->setStringsWithLengths(&shaderStrings, &shaderLengths, 1);
         if (!entryPointName.empty()) shader->setEntryPoint(entryPointName.c_str());
-        // Reinitialize glslang if the semantics change.
-        GlobalTestSettings.initializer->acquire(controls);
         return shader->parse(
                 (resources ? resources : &glslang::DefaultTBuiltInResource),
                 defaultVersion, isForwardCompatible, controls);
diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp
index 37919c3..582b1d0 100755
--- a/hlsl/hlslGrammar.cpp
+++ b/hlsl/hlslGrammar.cpp
@@ -89,12 +89,17 @@
 
 // compilationUnit
 //      : list of externalDeclaration
+//      |   SEMICOLONS
 //
 bool HlslGrammar::acceptCompilationUnit()
 {
     TIntermNode* unitNode = nullptr;
 
     while (! peekTokenClass(EHTokNone)) {
+        // HLSL allows semicolons between global declarations, e.g, between functions.
+        if (acceptTokenClass(EHTokSemicolon))
+            continue;
+
         // externalDeclaration
         TIntermNode* declarationNode;
         if (! acceptDeclaration(declarationNode))
@@ -269,8 +274,14 @@
     TType type;
 
     // DX9 sampler declaration use a different syntax
-    if (acceptSamplerDeclarationDX9(type))
-        return true;
+    // DX9 shaders need to run through HLSL compiler (fxc) via a back compat mode, it isn't going to
+    // be possible to simultaneously compile D3D10+ style shaders and DX9 shaders. If we want to compile DX9
+    // HLSL shaders, this will have to be a master level switch
+    // As such, the sampler keyword in D3D10+ turns into an automatic sampler type, and is commonly used
+    // For that reason, this line is commented out 
+
+   // if (acceptSamplerDeclarationDX9(type))
+   //     return true;
 
     // fully_specified_type
     if (! acceptFullySpecifiedType(type))
@@ -2435,7 +2446,7 @@
         TIntermTyped* node;
         if (acceptExpression(node)) {
             // hook it up
-            statement = intermediate.addBranch(EOpReturn, node, token.loc);
+            statement = parseContext.handleReturnValue(token.loc, node);
         } else
             statement = intermediate.addBranch(EOpReturn, token.loc);
         break;
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index d509e1f..2a79375 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -43,7 +43,7 @@
 
 #include "../glslang/OSDependent/osinclude.h"
 
-#include <stdarg.h>
+#include <cstdarg>
 #include <algorithm>
 
 namespace glslang {
@@ -581,6 +581,15 @@
     } else if (field == "CalculateLevelOfDetail"          ||
                field == "CalculateLevelOfDetailUnclamped" ||
                field == "Gather"                          ||
+               field == "GatherRed"                       ||
+               field == "GatherGreen"                     ||
+               field == "GatherBlue"                      ||
+               field == "GatherAlpha"                     ||
+               field == "GatherCmp"                       ||
+               field == "GatherCmpRed"                    ||
+               field == "GatherCmpGreen"                  ||
+               field == "GatherCmpBlue"                   ||
+               field == "GatherCmpAlpha"                  ||
                field == "GetDimensions"                   ||
                field == "GetSamplePosition"               ||
                field == "Load"                            ||
@@ -634,7 +643,7 @@
             if (fields.num == 1) {
                 TIntermTyped* index = intermediate.addConstantUnion(fields.offsets[0], loc);
                 result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
-                result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision));
+                result->setType(TType(base->getBasicType(), EvqTemporary));
             } else {
                 TString vectorString = field;
                 TIntermTyped* index = intermediate.addSwizzle(fields, loc);
@@ -787,6 +796,25 @@
     return paramNodes;
 }
 
+// Handle function returns, including type conversions to the function return type
+// if necessary.
+TIntermNode* HlslParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value)
+{
+    if (currentFunctionType->getBasicType() == EbtVoid) {
+        error(loc, "void function cannot return a value", "return", "");
+        return intermediate.addBranch(EOpReturn, loc);
+    } else if (*currentFunctionType != value->getType()) {
+        TIntermTyped* converted = intermediate.addConversion(EOpReturn, *currentFunctionType, value);
+        if (converted) {
+            return intermediate.addBranch(EOpReturn, converted, loc);
+        } else {
+            error(loc, "type does not match, or is not convertible to, the function's return type", "return", "");
+            return intermediate.addBranch(EOpReturn, value, loc);
+        }
+    } else
+        return intermediate.addBranch(EOpReturn, value, loc);
+}
+
 void HlslParseContext::handleFunctionArgument(TFunction* function, TIntermTyped*& arguments, TIntermTyped* newArg)
 {
     TParameter param = { 0, new TType };
@@ -989,7 +1017,7 @@
 
             const TSampler& texSampler = texType.getSampler();
             const TSamplerDim dim = texSampler.dim;
-            const int numArgs = argAggregate->getSequence().size();
+            const int numArgs = (int)argAggregate->getSequence().size();
 
             int numDims = 0;
 
@@ -1175,7 +1203,7 @@
                 lodComponent->setType(TType(coordBaseType, EvqTemporary, 1));
             }
 
-            const int numArgs    = argAggregate->getSequence().size();
+            const int numArgs    = (int)argAggregate->getSequence().size();
             const bool hasOffset = ((!isMS && numArgs == 3) || (isMS && numArgs == 4));
 
             // Create texel fetch
@@ -1219,7 +1247,7 @@
             TIntermTyped* argLod    = argAggregate->getSequence()[3]->getAsTyped();
             TIntermTyped* argOffset = nullptr;
 
-            const int  numArgs = argAggregate->getSequence().size();
+            const int  numArgs = (int)argAggregate->getSequence().size();
 
             if (numArgs == 5) // offset, if present
                 argOffset = argAggregate->getSequence()[4]->getAsTyped();
@@ -1251,7 +1279,7 @@
             TIntermTyped* argOffset = nullptr;
 
             // Offset is optional
-            if (argAggregate->getSequence().size() == 4)
+            if (argAggregate->getSequence().size() > 3)
                 argOffset = argAggregate->getSequence()[3]->getAsTyped();
 
             const TOperator textureOp = (argOffset == nullptr ? EOpTextureGather : EOpTextureGatherOffset);
@@ -1261,6 +1289,7 @@
 
             txgather->getSequence().push_back(txcombine);
             txgather->getSequence().push_back(argCoord);
+            // Offset if not given is implicitly channel 0 (red)
 
             if (argOffset != nullptr)
                 txgather->getSequence().push_back(argOffset);
@@ -1272,6 +1301,131 @@
             break;
         }
         
+    case EOpMethodGatherRed:      // fall through...
+    case EOpMethodGatherGreen:    // ...
+    case EOpMethodGatherBlue:     // ...
+    case EOpMethodGatherAlpha:    // ...
+    case EOpMethodGatherCmpRed:   // ...
+    case EOpMethodGatherCmpGreen: // ...
+    case EOpMethodGatherCmpBlue:  // ...
+    case EOpMethodGatherCmpAlpha: // ...
+        {
+            int channel = 0;    // the channel we are gathering
+            int cmpValues = 0;  // 1 if there is a compare value (handier than a bool below)
+
+            switch (op) {
+            case EOpMethodGatherCmpRed:   cmpValues = 1;  // fall through
+            case EOpMethodGatherRed:      channel = 0; break;
+            case EOpMethodGatherCmpGreen: cmpValues = 1;  // fall through
+            case EOpMethodGatherGreen:    channel = 1; break;
+            case EOpMethodGatherCmpBlue:  cmpValues = 1;  // fall through
+            case EOpMethodGatherBlue:     channel = 2; break;
+            case EOpMethodGatherCmpAlpha: cmpValues = 1;  // fall through
+            case EOpMethodGatherAlpha:    channel = 3; break;
+            default:                      assert(0);   break;
+            }
+
+            // For now, we have nothing to map the component-wise comparison forms
+            // to, because neither GLSL nor SPIR-V has such an opcode.  Issue an
+            // unimplemented error instead.  Most of the machinery is here if that
+            // should ever become available.
+            if (cmpValues) {
+                error(loc, "unimplemented: component-level gather compare", "", "");
+                return;
+            }
+
+            int arg = 0;
+
+            TIntermTyped* argTex        = argAggregate->getSequence()[arg++]->getAsTyped();
+            TIntermTyped* argSamp       = argAggregate->getSequence()[arg++]->getAsTyped();
+            TIntermTyped* argCoord      = argAggregate->getSequence()[arg++]->getAsTyped();
+            TIntermTyped* argOffset     = nullptr;
+            TIntermTyped* argOffsets[4] = { nullptr, nullptr, nullptr, nullptr };
+            // TIntermTyped* argStatus     = nullptr; // TODO: residency
+            TIntermTyped* argCmp        = nullptr;
+
+            const TSamplerDim dim = argTex->getType().getSampler().dim;
+
+            const int  argSize = argAggregate->getSequence().size();
+            bool hasStatus     = (argSize == (5+cmpValues) || argSize == (8+cmpValues));
+            bool hasOffset1    = false;
+            bool hasOffset4    = false;
+
+            // Only 2D forms can have offsets.  Discover if we have 0, 1 or 4 offsets.
+            if (dim == Esd2D) {
+                hasOffset1 = (argSize == (4+cmpValues) || argSize == (5+cmpValues));
+                hasOffset4 = (argSize == (7+cmpValues) || argSize == (8+cmpValues));
+            }
+
+            assert(!(hasOffset1 && hasOffset4));
+
+            TOperator textureOp = EOpTextureGather;
+
+            // Compare forms have compare value
+            if (cmpValues != 0)
+                argCmp = argOffset = argAggregate->getSequence()[arg++]->getAsTyped();
+
+            // Some forms have single offset
+            if (hasOffset1) {
+                textureOp = EOpTextureGatherOffset;   // single offset form
+                argOffset = argAggregate->getSequence()[arg++]->getAsTyped();
+            }
+
+            // Some forms have 4 gather offsets
+            if (hasOffset4) {
+                textureOp = EOpTextureGatherOffsets;  // note plural, for 4 offset form
+                for (int offsetNum = 0; offsetNum < 4; ++offsetNum)
+                    argOffsets[offsetNum] = argAggregate->getSequence()[arg++]->getAsTyped();
+            }
+
+            // Residency status
+            if (hasStatus) {
+                // argStatus = argAggregate->getSequence()[arg++]->getAsTyped();
+                error(loc, "unimplemented: residency status", "", "");
+                return;
+            }
+
+            TIntermAggregate* txgather = new TIntermAggregate(textureOp);
+            TIntermAggregate* txcombine = handleSamplerTextureCombine(loc, argTex, argSamp);
+
+            TIntermTyped* argChannel = intermediate.addConstantUnion(channel, loc, true);
+
+            txgather->getSequence().push_back(txcombine);
+            txgather->getSequence().push_back(argCoord);
+
+            // AST wants an array of 4 offsets, where HLSL has separate args.  Here
+            // we construct an array from the separate args.
+            if (hasOffset4) {
+                TType arrayType(EbtInt, EvqTemporary, 2);
+                TArraySizes arraySizes;
+                arraySizes.addInnerSize(4);
+                arrayType.newArraySizes(arraySizes);
+
+                TIntermAggregate* initList = new TIntermAggregate(EOpNull);
+
+                for (int offsetNum = 0; offsetNum < 4; ++offsetNum)
+                    initList->getSequence().push_back(argOffsets[offsetNum]);
+
+                argOffset = addConstructor(loc, initList, arrayType);
+            }
+
+            // Add comparison value if we have one
+            if (argTex->getType().getSampler().isShadow())
+                txgather->getSequence().push_back(argCmp);
+
+            // Add offset (either 1, or an array of 4) if we have one
+            if (argOffset != nullptr)
+                txgather->getSequence().push_back(argOffset);
+
+            txgather->getSequence().push_back(argChannel);
+
+            txgather->setType(node->getType());
+            txgather->setLoc(loc);
+            node = txgather;
+
+            break;
+        }
+
     case EOpMethodCalculateLevelOfDetail:
     case EOpMethodCalculateLevelOfDetailUnclamped:
         {
@@ -1953,11 +2107,6 @@
     }
     const TIntermSequence& aggArgs = *argp;  // only valid when unaryArg is nullptr
 
-    // built-in texturing functions get their return value precision from the precision of the sampler
-    if (fnCandidate.getType().getQualifier().precision == EpqNone &&
-        fnCandidate.getParamCount() > 0 && fnCandidate[0].type->getBasicType() == EbtSampler)
-        callNode.getQualifier().precision = arg0->getQualifier().precision;
-
     switch (callNode.getOp()) {
     case EOpTextureGather:
     case EOpTextureGatherOffset:
@@ -2060,11 +2209,6 @@
     case EOpInterpolateAtCentroid:
     case EOpInterpolateAtSample:
     case EOpInterpolateAtOffset:
-        // "For the interpolateAt* functions, the call will return a precision
-        // qualification matching the precision of the 'interpolant' argument to
-        // the function call."
-        callNode.getQualifier().precision = arg0->getQualifier().precision;
-
         // 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.
@@ -2580,10 +2724,6 @@
     else if (src.storage != EvqTemporary && src.storage != EvqGlobal)
         error(loc, "too many storage qualifiers", GetStorageQualifierString(src.storage), "");
 
-    // Precision qualifiers
-    if (dst.precision == EpqNone || (force && src.precision != EpqNone))
-        dst.precision = src.precision;
-
     // Layout qualifiers
     mergeObjectLayoutQualifiers(dst, src, false);
 
diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h
index 92641a8..f45a874 100755
--- a/hlsl/hlslParseHelper.h
+++ b/hlsl/hlslParseHelper.h
@@ -85,6 +85,7 @@
     TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
     TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
     TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
+    TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
     void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);
     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
diff --git a/hlsl/hlslParseables.cpp b/hlsl/hlslParseables.cpp
index 25e8fe8..868a41e 100755
--- a/hlsl/hlslParseables.cpp
+++ b/hlsl/hlslParseables.cpp
@@ -101,12 +101,29 @@
             return true;
     }
 
+    const bool isGather = 
+        (name == "Gather" || 
+         name == "GatherRed" ||
+         name == "GatherGreen" || 
+         name == "GatherBlue"  ||
+         name == "GatherAlpha");
+
+    const bool isGatherCmp = 
+        (name == "GatherCmpRed"   ||
+         name == "GatherCmpGreen" ||
+         name == "GatherCmpBlue"  ||
+         name == "GatherCmpAlpha");
+
     // Reject invalid Gathers
-    if (name == "Gather") {
+    if (isGather || isGatherCmp) {
         if (dim0 == 1 || dim0 == 3)   // there are no 1D or 3D gathers
             return true;
-        if (dim0 == 4 && numArgs == 4) // there are no Cube gathers with offset
-            return true;
+
+        // no offset on cube or cube array gathers
+        if (dim0 == 4) {
+            if ((isGather && numArgs > 3) || (isGatherCmp && numArgs > 4))
+                return true;
+        }
     }
 
     // Reject invalid Loads
@@ -436,8 +453,24 @@
 void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, const SpvVersion& /*spvVersion*/)
 {
     static const EShLanguageMask EShLangAll    = EShLanguageMask(EShLangCount - 1);
-    static const EShLanguageMask EShLangPSCS   = EShLanguageMask(EShLangFragmentMask | EShLangComputeMask);
-    static const EShLanguageMask EShLangVSPSGS = EShLanguageMask(EShLangVertexMask | EShLangFragmentMask | EShLangGeometryMask);
+
+    // 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
+    // to EShLangAll, to allow any intrinsic to be used in any shader, which is legal
+    // if it is not called.
+    // 
+    // static const EShLanguageMask EShLangPSCS   = EShLanguageMask(EShLangFragmentMask | EShLangComputeMask);
+    // static const EShLanguageMask EShLangVSPSGS = EShLanguageMask(EShLangVertexMask | EShLangFragmentMask | EShLangGeometryMask);
+    // static const EShLanguageMask EShLangCS     = EShLangComputeMask;
+    // static const EShLanguageMask EShLangPS     = EShLangFragmentMask;
+    // static const EShLanguageMask EShLangHS     = EShLangTessControlMask;
+
+    // This set uses EShLangAll for everything.
+    static const EShLanguageMask EShLangPSCS   = EShLangAll;
+    static const EShLanguageMask EShLangVSPSGS = EShLangAll;
+    static const EShLanguageMask EShLangCS     = EShLangAll;
+    static const EShLanguageMask EShLangPS     = EShLangAll;
+    static const EShLanguageMask EShLangHS     = EShLangAll;
 
     // This structure encodes the prototype information for each HLSL intrinsic.
     // Because explicit enumeration would be cumbersome, it's procedurally generated.
@@ -469,8 +502,8 @@
         { "abs",                              nullptr, nullptr,   "SVM",            "DFUI",          EShLangAll },
         { "acos",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "all",                              "S",    "B",        "SVM",            "BFI",           EShLangAll },
-        { "AllMemoryBarrier",                 nullptr, nullptr,   "-",              "-",             EShLangComputeMask },
-        { "AllMemoryBarrierWithGroupSync",    nullptr, nullptr,   "-",              "-",             EShLangComputeMask },
+        { "AllMemoryBarrier",                 nullptr, nullptr,   "-",              "-",             EShLangCS },
+        { "AllMemoryBarrierWithGroupSync",    nullptr, nullptr,   "-",              "-",             EShLangCS },
         { "any",                              "S",     "B",       "SVM",            "BFI",           EShLangAll },
         { "asdouble",                         "S",     "D",       "S,",             "U,",            EShLangAll },
         { "asdouble",                         "V2",    "D",       "V2,",            "U,",            EShLangAll },
@@ -483,29 +516,29 @@
         { "ceil",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "CheckAccessFullyMapped",           "S",     "B" ,      "S",              "U",             EShLangPSCS },
         { "clamp",                            nullptr, nullptr,   "SVM,,",          "FUI,,",         EShLangAll },
-        { "clip",                             "-",     "-",       "SVM",            "F",             EShLangFragmentMask },
+        { "clip",                             "-",     "-",       "SVM",            "F",             EShLangPS },
         { "cos",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "cosh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "countbits",                        nullptr, nullptr,   "SV",             "U",             EShLangAll },
         { "cross",                            nullptr, nullptr,   "V3,",            "F,",            EShLangAll },
         { "D3DCOLORtoUBYTE4",                 "V4",    "I",       "V4",             "F",             EShLangAll },
-        { "ddx",                              nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
-        { "ddx_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
-        { "ddx_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
-        { "ddy",                              nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
-        { "ddy_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
-        { "ddy_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
+        { "ddx",                              nullptr, nullptr,   "SVM",            "F",             EShLangPS },
+        { "ddx_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangPS },
+        { "ddx_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangPS },
+        { "ddy",                              nullptr, nullptr,   "SVM",            "F",             EShLangPS },
+        { "ddy_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangPS },
+        { "ddy_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangPS },
         { "degrees",                          nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "determinant",                      "S",     "F",       "M",              "F",             EShLangAll },
         { "DeviceMemoryBarrier",              nullptr, nullptr,   "-",              "-",             EShLangPSCS },
-        { "DeviceMemoryBarrierWithGroupSync", nullptr, nullptr,   "-",              "-",             EShLangComputeMask },
+        { "DeviceMemoryBarrierWithGroupSync", nullptr, nullptr,   "-",              "-",             EShLangCS },
         { "distance",                         "S",     "F",       "V,",             "F,",            EShLangAll },
         { "dot",                              "S",     nullptr,   "V,",             "FI,",           EShLangAll },
         { "dst",                              nullptr, nullptr,   "V4,",            "F,",            EShLangAll },
         // { "errorf",                           "-",     "-",       "",             "",             EShLangAll }, TODO: varargs
-        { "EvaluateAttributeAtCentroid",      nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
-        { "EvaluateAttributeAtSample",        nullptr, nullptr,   "SVM,S",          "F,U",           EShLangFragmentMask },
-        { "EvaluateAttributeSnapped",         nullptr, nullptr,   "SVM,V2",         "F,I",           EShLangFragmentMask },
+        { "EvaluateAttributeAtCentroid",      nullptr, nullptr,   "SVM",            "F",             EShLangPS },
+        { "EvaluateAttributeAtSample",        nullptr, nullptr,   "SVM,S",          "F,U",           EShLangPS },
+        { "EvaluateAttributeSnapped",         nullptr, nullptr,   "SVM,V2",         "F,I",           EShLangPS },
         { "exp",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "exp2",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "f16tof32",                         nullptr, "F",       "SV",             "U",             EShLangAll },
@@ -518,11 +551,11 @@
         { "fmod",                             nullptr, nullptr,   "SVM,",           "F,",            EShLangAll },
         { "frac",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "frexp",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll },
-        { "fwidth",                           nullptr, nullptr,   "SVM",            "F",             EShLangFragmentMask },
+        { "fwidth",                           nullptr, nullptr,   "SVM",            "F",             EShLangPS },
         { "GetRenderTargetSampleCount",       "S",     "U",       "-",              "-",             EShLangAll },
         { "GetRenderTargetSamplePosition",    "V2",    "F",       "V1",             "I",             EShLangAll },
-        { "GroupMemoryBarrier",               nullptr, nullptr,   "-",              "-",             EShLangComputeMask },
-        { "GroupMemoryBarrierWithGroupSync",  nullptr, nullptr,   "-",              "-",             EShLangComputeMask },
+        { "GroupMemoryBarrier",               nullptr, nullptr,   "-",              "-",             EShLangCS },
+        { "GroupMemoryBarrierWithGroupSync",  nullptr, nullptr,   "-",              "-",             EShLangCS },
         { "InterlockedAdd",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS },
         { "InterlockedAdd",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS },
         { "InterlockedAnd",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS },
@@ -563,20 +596,20 @@
         { "mul",                              "M",     nullptr,   "M,S",            "FI,",           EShLangAll },
         { "mul",                              "V",     nullptr,   "M,#V",           "FI,",           EShLangAll },
         // mat*mat form of mul is handled in createMatTimesMat()
-        { "noise",                            "S",     "F",       "V",              "F",             EShLangFragmentMask },
+        { "noise",                            "S",     "F",       "V",              "F",             EShLangPS },
         { "normalize",                        nullptr, nullptr,   "V",              "F",             EShLangAll },
         { "pow",                              nullptr, nullptr,   "SVM,",           "F,",            EShLangAll },
         // { "printf",                           "-",     "-",       "",            "",              EShLangAll }, TODO: varargs
-        { "Process2DQuadTessFactorsAvg",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangTessControlMask },
-        { "Process2DQuadTessFactorsMax",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangTessControlMask },
-        { "Process2DQuadTessFactorsMin",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangTessControlMask },
-        { "ProcessIsolineTessFactors",        "-",     "-",       "S,,>,>",         "F,,,",          EShLangTessControlMask },
-        { "ProcessQuadTessFactorsAvg",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangTessControlMask },
-        { "ProcessQuadTessFactorsMax",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangTessControlMask },
-        { "ProcessQuadTessFactorsMin",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangTessControlMask },
-        { "ProcessTriTessFactorsAvg",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangTessControlMask },
-        { "ProcessTriTessFactorsMax",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangTessControlMask },
-        { "ProcessTriTessFactorsMin",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangTessControlMask },
+        { "Process2DQuadTessFactorsAvg",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS },
+        { "Process2DQuadTessFactorsMax",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS },
+        { "Process2DQuadTessFactorsMin",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS },
+        { "ProcessIsolineTessFactors",        "-",     "-",       "S,,>,>",         "F,,,",          EShLangHS },
+        { "ProcessQuadTessFactorsAvg",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS },
+        { "ProcessQuadTessFactorsMax",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS },
+        { "ProcessQuadTessFactorsMin",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS },
+        { "ProcessTriTessFactorsAvg",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS },
+        { "ProcessTriTessFactorsMax",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS },
+        { "ProcessTriTessFactorsMin",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS },
         { "radians",                          nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "rcp",                              nullptr, nullptr,   "SVM",            "FD",            EShLangAll },
         { "reflect",                          nullptr, nullptr,   "V,",             "F,",            EShLangAll },
@@ -594,48 +627,48 @@
         { "step",                             nullptr, nullptr,   "SVM,",           "F,",            EShLangAll },
         { "tan",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll },
         { "tanh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll },
-        { "tex1D",                            "V4",    "F",       "V1,S",           "S,F",           EShLangFragmentMask },
-        { "tex1D",                            "V4",    "F",       "V1,S,V1,",       "S,F,,",         EShLangFragmentMask },
-        { "tex1Dbias",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangFragmentMask },
-        { "tex1Dgrad",                        "V4",    "F",       "V1,,,",          "S,F,,",         EShLangFragmentMask },
-        { "tex1Dlod",                         "V4",    "F",       "V1,V4",          "S,F",           EShLangFragmentMask },
-        { "tex1Dproj",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangFragmentMask },
-        { "tex2D",                            "V4",    "F",       "V2,",            "S,F",           EShLangFragmentMask },
-        { "tex2D",                            "V4",    "F",       "V2,,,",          "S,F,,",         EShLangFragmentMask },
-        { "tex2Dbias",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangFragmentMask },
-        { "tex2Dgrad",                        "V4",    "F",       "V2,,,",          "S,F,,",         EShLangFragmentMask },
-        { "tex2Dlod",                         "V4",    "F",       "V2,V4",          "S,F",           EShLangFragmentMask },
-        { "tex2Dproj",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangFragmentMask },
-        { "tex3D",                            "V4",    "F",       "V3,",            "S,F",           EShLangFragmentMask },
-        { "tex3D",                            "V4",    "F",       "V3,,,",          "S,F,,",         EShLangFragmentMask },
-        { "tex3Dbias",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangFragmentMask },
-        { "tex3Dgrad",                        "V4",    "F",       "V3,,,",          "S,F,,",         EShLangFragmentMask },
-        { "tex3Dlod",                         "V4",    "F",       "V3,V4",          "S,F",           EShLangFragmentMask },
-        { "tex3Dproj",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangFragmentMask },
-        { "texCUBE",                          "V4",    "F",       "V4,V3",          "S,F",           EShLangFragmentMask },
-        { "texCUBE",                          "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangFragmentMask },
-        { "texCUBEbias",                      "V4",    "F",       "V4,",            "S,F",           EShLangFragmentMask },
-        { "texCUBEgrad",                      "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangFragmentMask },
-        { "texCUBElod",                       "V4",    "F",       "V4,",            "S,F",           EShLangFragmentMask },
-        { "texCUBEproj",                      "V4",    "F",       "V4,",            "S,F",           EShLangFragmentMask },
+        { "tex1D",                            "V4",    "F",       "V1,S",           "S,F",           EShLangPS },
+        { "tex1D",                            "V4",    "F",       "V1,S,V1,",       "S,F,,",         EShLangPS },
+        { "tex1Dbias",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS },
+        { "tex1Dgrad",                        "V4",    "F",       "V1,,,",          "S,F,,",         EShLangPS },
+        { "tex1Dlod",                         "V4",    "F",       "V1,V4",          "S,F",           EShLangPS },
+        { "tex1Dproj",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS },
+        { "tex2D",                            "V4",    "F",       "V2,",            "S,F",           EShLangPS },
+        { "tex2D",                            "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS },
+        { "tex2Dbias",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS },
+        { "tex2Dgrad",                        "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS },
+        { "tex2Dlod",                         "V4",    "F",       "V2,V4",          "S,F",           EShLangPS },
+        { "tex2Dproj",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS },
+        { "tex3D",                            "V4",    "F",       "V3,",            "S,F",           EShLangPS },
+        { "tex3D",                            "V4",    "F",       "V3,,,",          "S,F,,",         EShLangPS },
+        { "tex3Dbias",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangPS },
+        { "tex3Dgrad",                        "V4",    "F",       "V3,,,",          "S,F,,",         EShLangPS },
+        { "tex3Dlod",                         "V4",    "F",       "V3,V4",          "S,F",           EShLangPS },
+        { "tex3Dproj",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangPS },
+        { "texCUBE",                          "V4",    "F",       "V4,V3",          "S,F",           EShLangPS },
+        { "texCUBE",                          "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangPS },
+        { "texCUBEbias",                      "V4",    "F",       "V4,",            "S,F",           EShLangPS },
+        { "texCUBEgrad",                      "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangPS },
+        { "texCUBElod",                       "V4",    "F",       "V4,",            "S,F",           EShLangPS },
+        { "texCUBEproj",                      "V4",    "F",       "V4,",            "S,F",           EShLangPS },
         { "transpose",                        "^M",    nullptr,   "M",              "F",             EShLangAll },
         { "trunc",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll },
 
         // Texture object methods.  Return type can be overridden by shader declaration.
         // !O = no offset, O = offset
-        { "Sample",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangFragmentMask },
-        { "Sample",             /* O*/        "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangFragmentMask },
+        { "Sample",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangPS },
+        { "Sample",             /* O*/        "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangPS },
 
-        { "SampleBias",         /*!O*/        "V4",    nullptr,   "%@,S,V,S",       "FIU,S,F,",      EShLangFragmentMask },
-        { "SampleBias",         /* O*/        "V4",    nullptr,   "%@,S,V,S,V",     "FIU,S,F,,I",    EShLangFragmentMask },
+        { "SampleBias",         /*!O*/        "V4",    nullptr,   "%@,S,V,S",       "FIU,S,F,",      EShLangPS },
+        { "SampleBias",         /* O*/        "V4",    nullptr,   "%@,S,V,S,V",     "FIU,S,F,,I",    EShLangPS },
 
         // TODO: FXC accepts int/uint samplers here.  unclear what that means.
-        { "SampleCmp",          /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,",      EShLangFragmentMask },
-        { "SampleCmp",          /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,,I",    EShLangFragmentMask },
+        { "SampleCmp",          /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,",      EShLangPS },
+        { "SampleCmp",          /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,,I",    EShLangPS },
 
         // TODO: FXC accepts int/uint samplers here.  unclear what that means.
-        { "SampleCmpLevelZero", /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,F",     EShLangFragmentMask },
-        { "SampleCmpLevelZero", /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,F,I",   EShLangFragmentMask },
+        { "SampleCmpLevelZero", /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,F",     EShLangPS },
+        { "SampleCmpLevelZero", /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,F,I",   EShLangPS },
 
         { "SampleGrad",         /*!O*/        "V4",    nullptr,   "%@,S,V,,",       "FIU,S,F,,",     EShLangAll },
         { "SampleGrad",         /* O*/        "V4",    nullptr,   "%@,S,V,,,",      "FIU,S,F,,,I",   EShLangAll },
@@ -648,15 +681,14 @@
         { "Load", /* +sampleidex*/            "V4",    nullptr,   "$&,V,S",         "FIU,I,I",       EShLangAll },
         { "Load", /* +samplindex, offset*/    "V4",    nullptr,   "$&,V,S,V",       "FIU,I,I,I",     EShLangAll },
 
-        { "Gather",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangVSPSGS },
-        { "Gather",             /* O*/        "V4",    nullptr,   "%@,S,V,V",       "FIU,S,F,I",     EShLangVSPSGS },
+        { "Gather",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll },
+        { "Gather",             /* O*/        "V4",    nullptr,   "%@,S,V,V",       "FIU,S,F,I",     EShLangAll },
 
-        { "CalculateLevelOfDetail",           "S",     "F",       "%@,S,V",         "FUI,S,F",       EShLangFragmentMask },
-        { "CalculateLevelOfDetailUnclamped",  "S",     "F",       "%@,S,V",         "FUI,S,F",       EShLangFragmentMask },
+        { "CalculateLevelOfDetail",           "S",     "F",       "%@,S,V",         "FUI,S,F",       EShLangPS },
+        { "CalculateLevelOfDetailUnclamped",  "S",     "F",       "%@,S,V",         "FUI,S,F",       EShLangPS },
 
         { "GetSamplePosition",                "V2",    "F",       "$&2,S",          "FUI,I",         EShLangVSPSGS },
 
-        // table of overloads from: https://msdn.microsoft.com/en-us/library/windows/desktop/bb509693(v=vs.85).aspx
         // 
         // UINT Width
         // UINT MipLevel, UINT Width, UINT NumberOfLevels
@@ -709,10 +741,61 @@
 
         // UINT Width, UINT Height, UINT Samples
         // UINT Width, UINT Height, UINT Elements, UINT Samples
-        { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",        EShLangAll },
-        { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",        EShLangAll },
-        { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",       EShLangAll },
-        { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",       EShLangAll },
+        { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",       EShLangAll },
+        { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",       EShLangAll },
+        { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",      EShLangAll },
+        { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",      EShLangAll },
+
+        // SM5 texture methods
+        { "GatherRed",       /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll },
+        { "GatherRed",       /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll },
+        { "GatherRed",       /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll },
+        { "GatherRed",       /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll },
+        { "GatherRed",       /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll },
+
+        { "GatherGreen",     /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll },
+        { "GatherGreen",     /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll },
+        { "GatherGreen",     /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll },
+        { "GatherGreen",     /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll },
+        { "GatherGreen",     /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll },
+
+        { "GatherBlue",      /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll },
+        { "GatherBlue",      /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll },
+        { "GatherBlue",      /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll },
+        { "GatherBlue",      /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll },
+        { "GatherBlue",      /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll },
+
+        { "GatherAlpha",     /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll },
+        { "GatherAlpha",     /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll },
+        { "GatherAlpha",     /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll },
+        { "GatherAlpha",     /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll },
+        { "GatherAlpha",     /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll },
+
+        { "GatherCmpRed",    /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll },
+        { "GatherCmpRed",    /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll },
+        { "GatherCmpRed",    /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll },
+        { "GatherCmpRed",    /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll },
+        { "GatherCmpRed",    /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,V,S","FIU,s,F,,I,,,,U",EShLangAll },
+
+        { "GatherCmpGreen",  /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll },
+        { "GatherCmpGreen",  /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll },
+        { "GatherCmpGreen",  /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll },
+        { "GatherCmpGreen",  /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll },
+        { "GatherCmpGreen",  /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll },
+
+        { "GatherCmpBlue",   /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll },
+        { "GatherCmpBlue",   /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll },
+        { "GatherCmpBlue",   /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll },
+        { "GatherCmpBlue",   /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll },
+        { "GatherCmpBlue",   /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll },
+
+        { "GatherCmpAlpha",  /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll },
+        { "GatherCmpAlpha",  /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll },
+        { "GatherCmpAlpha",  /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll },
+        { "GatherCmpAlpha",  /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll },
+        { "GatherCmpAlpha",  /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll },
+
+        // TODO: Cmp forms
 
         // 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 },
@@ -1012,6 +1095,16 @@
     symbolTable.relateToOperator("Gather",                      EOpMethodGather);
     symbolTable.relateToOperator("CalculateLevelOfDetail",      EOpMethodCalculateLevelOfDetail);
     symbolTable.relateToOperator("CalculateLevelOfDetailUnclamped", EOpMethodCalculateLevelOfDetailUnclamped);
+
+    // SM5 Texture methods
+    symbolTable.relateToOperator("GatherRed",                   EOpMethodGatherRed);
+    symbolTable.relateToOperator("GatherGreen",                 EOpMethodGatherGreen);
+    symbolTable.relateToOperator("GatherBlue",                  EOpMethodGatherBlue);
+    symbolTable.relateToOperator("GatherAlpha",                 EOpMethodGatherAlpha);
+    symbolTable.relateToOperator("GatherCmpRed",                EOpMethodGatherCmpRed);
+    symbolTable.relateToOperator("GatherCmpGreen",              EOpMethodGatherCmpGreen);
+    symbolTable.relateToOperator("GatherCmpBlue",               EOpMethodGatherCmpBlue);
+    symbolTable.relateToOperator("GatherCmpAlpha",              EOpMethodGatherCmpAlpha);
 }
 
 //
diff --git a/hlsl/hlslScanContext.cpp b/hlsl/hlslScanContext.cpp
index da39321..36dea5c 100755
--- a/hlsl/hlslScanContext.cpp
+++ b/hlsl/hlslScanContext.cpp
@@ -38,7 +38,7 @@
 // HLSL scanning, leveraging the scanning done by the preprocessor.
 //
 
-#include <string.h>
+#include <cstring>
 #include <unordered_map>
 #include <unordered_set>