Merge remote-tracking branch 'aosp/master' into update
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a7f09fb..c03edd7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 2.8.12)
+cmake_minimum_required(VERSION 2.8.11)
 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
 
 option(ENABLE_AMD_EXTENSIONS "Enables support of AMD-specific extensions" OFF)
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/README-spirv-remap.txt b/README-spirv-remap.txt
index 8e3259f..3e5288a 100644
--- a/README-spirv-remap.txt
+++ b/README-spirv-remap.txt
@@ -98,7 +98,7 @@
 On error, the function supplied to registerErrorHandler() will be invoked.
 This can be a standard C/C++ function, a lambda function, or a functor.
 The default handler simply calls exit(5); The error handler is a static
-members, so need only be set up once, not once per spirvbin_t instance.
+member, so need only be set up once, not once per spirvbin_t instance.
 
 Log messages are supplied to registerLogHandler().  By default, log
 messages are eaten silently.  The log handler is also a static member.
diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt
index 9628a82..48a6c46 100755
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -3,21 +3,27 @@
     InReadableOrder.cpp
     Logger.cpp
     SpvBuilder.cpp
-    SPVRemapper.cpp
     doc.cpp
     disassemble.cpp)
 
+set(SPVREMAP_SOURCES
+    SPVRemapper.cpp
+    doc.cpp)
+
 set(HEADERS
     spirv.hpp
     GLSL.std.450.h
     GlslangToSpv.h
     Logger.h
     SpvBuilder.h
-    SPVRemapper.h
     spvIR.h
     doc.h
     disassemble.h)
 
+set(SPVREMAP_HEADERS
+    SPVRemapper.h
+    doc.h)
+
 if(ENABLE_AMD_EXTENSIONS)
     set(HEADERS
         GLSL.ext.AMD.h)
@@ -26,9 +32,13 @@
 add_library(SPIRV STATIC ${SOURCES} ${HEADERS})
 set_property(TARGET SPIRV PROPERTY FOLDER glslang)
 
+add_library(SPVRemapper STATIC ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
+set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
+
 if(WIN32)
     source_group("Source" FILES ${SOURCES} ${HEADERS})
+    source_group("Source" FILES ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
 endif(WIN32)
 
-install(TARGETS SPIRV
+install(TARGETS SPIRV SPVRemapper
         ARCHIVE DESTINATION lib)
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 6aec9e6..7286588 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -130,13 +130,14 @@
     spv::Id makeArraySizeId(const glslang::TArraySizes&, int dim);
     spv::Id accessChainLoad(const glslang::TType& type);
     void    accessChainStore(const glslang::TType& type, spv::Id rvalue);
+    void multiTypeStore(const glslang::TType&, spv::Id rValue);
     glslang::TLayoutPacking getExplicitLayout(const glslang::TType& type) const;
     int getArrayStride(const glslang::TType& arrayType, glslang::TLayoutPacking, glslang::TLayoutMatrix);
     int getMatrixStride(const glslang::TType& matrixType, glslang::TLayoutPacking, glslang::TLayoutMatrix);
     void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset, int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix);
     void declareUseOfStructMember(const glslang::TTypeList& members, int glslangMember);
 
-    bool isShaderEntrypoint(const glslang::TIntermAggregate* node);
+    bool isShaderEntryPoint(const glslang::TIntermAggregate* node);
     void makeFunctions(const glslang::TIntermSequence&);
     void makeGlobalInitializers(const glslang::TIntermSequence&);
     void visitFunctions(const glslang::TIntermSequence&);
@@ -149,11 +150,14 @@
     spv::Id createBinaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right, glslang::TBasicType typeProxy, bool reduceComparison = true);
     spv::Id createBinaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right);
     spv::Id createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy);
-    spv::Id createUnaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy);
+    spv::Id createUnaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy);
     spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy);
     spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);
     spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
-    spv::Id createInvocationsOperation(glslang::TOperator, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy);
+    spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy);
+#ifdef AMD_EXTENSIONS
+    spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, spv::Id operand);
+#endif
     spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId);
     spv::Id getSymbolId(const glslang::TIntermSymbol* node);
@@ -185,7 +189,7 @@
     std::unordered_map<const char*, spv::Id> extBuiltinMap;
 
     std::unordered_map<int, spv::Id> symbolValues;
-    std::unordered_set<int> constReadOnlyParameters;  // set of formal function parameters that have glslang qualifier constReadOnly, so we know they are not local function "const" that are write-once
+    std::unordered_set<int> rValueParameters;  // set of formal function parameters passed as rValues, rather than a pointer
     std::unordered_map<std::string, spv::Function*> functionMap;
     std::unordered_map<const glslang::TTypeList*, spv::Id> structMap[glslang::ElpCount][glslang::ElmCount];
     std::unordered_map<const glslang::TTypeList*, std::vector<int> > memberRemapper;  // for mapping glslang block indices to spv indices (e.g., due to hidden members)
@@ -212,7 +216,8 @@
             return spv::SourceLanguageUnknown;
         }
     case glslang::EShSourceHlsl:
-        return spv::SourceLanguageHLSL;
+        //Use SourceLanguageUnknown instead of SourceLanguageHLSL for now, until Vulkan knows what HLSL is
+        return spv::SourceLanguageUnknown;
     default:
         return spv::SourceLanguageUnknown;
     }
@@ -679,13 +684,17 @@
         child.writeonly = true;
 }
 
-bool HasNonLayoutQualifiers(const glslang::TQualifier& qualifier)
+bool HasNonLayoutQualifiers(const glslang::TType& type, const glslang::TQualifier& qualifier)
 {
     // This should list qualifiers that simultaneous satisfy:
-    // - struct members can inherit from a struct declaration
-    // - affect decorations on the struct members (note smooth does not, and expecting something like volatile to effect the whole object)
+    // - struct members might inherit from a struct declaration
+    //     (note that non-block structs don't explicitly inherit,
+    //      only implicitly, meaning no decoration involved)
+    // - affect decorations on the struct members
+    //     (note smooth does not, and expecting something like volatile
+    //      to effect the whole object)
     // - are not part of the offset/st430/etc or row/column-major layout
-    return qualifier.invariant || qualifier.hasLocation();
+    return qualifier.invariant || (qualifier.hasLocation() && type.getBasicType() == glslang::EbtBlock);
 }
 
 //
@@ -704,8 +713,8 @@
     builder.setSource(TranslateSourceLanguage(glslangIntermediate->getSource(), glslangIntermediate->getProfile()), glslangIntermediate->getVersion());
     stdBuiltins = builder.import("GLSL.std.450");
     builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);
-    shaderEntry = builder.makeEntrypoint(glslangIntermediate->getEntryPoint().c_str());
-    entryPoint = builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPoint().c_str());
+    shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str());
+    entryPoint = builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str());
 
     // Add the source extensions
     const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();
@@ -889,13 +898,12 @@
 
         // For now, we consider all user variables as being in memory, so they are pointers,
         // except for
-        // A) "const in" arguments to a function, which are an intermediate object.
+        // A) R-Value arguments to a function, which are an intermediate object.
         //    See comments in handleUserFunctionCall().
-        // B) Specialization constants (normal constant don't even come in as a variable),
+        // B) Specialization constants (normal constants don't even come in as a variable),
         //    These are also pure R-values.
         glslang::TQualifier qualifier = symbol->getQualifier();
-        if ((qualifier.storage == glslang::EvqConstReadOnly && constReadOnlyParameters.find(symbol->getId()) != constReadOnlyParameters.end()) ||
-             qualifier.isSpecConstant())
+        if (qualifier.isSpecConstant() || rValueParameters.find(symbol->getId()) != rValueParameters.end())
             builder.setAccessChainRValue(id);
         else
             builder.setAccessChainLValue(id);
@@ -957,7 +965,7 @@
 
             // store the result
             builder.setAccessChain(lValue);
-            accessChainStore(node->getType(), rValue);
+            multiTypeStore(node->getType(), rValue);
 
             // assignments are expressions having an rValue after they are evaluated...
             builder.clearAccessChain();
@@ -1271,7 +1279,7 @@
             // In all cases, still let the traverser visit the children for us.
             makeFunctions(node->getAsAggregate()->getSequence());
 
-            // Also, we want all globals initializers to go into the entry of main(), before
+            // Also, we want all globals initializers to go into the beginning of the entry point, before
             // anything else gets there, so visit out of order, doing them all now.
             makeGlobalInitializers(node->getAsAggregate()->getSequence());
 
@@ -1305,7 +1313,7 @@
     }
     case glslang::EOpFunction:
         if (visit == glslang::EvPreVisit) {
-            if (isShaderEntrypoint(node)) {
+            if (isShaderEntryPoint(node)) {
                 inMain = true;
                 builder.setBuildPoint(shaderEntry->getLastBlock());
             } else {
@@ -1954,7 +1962,7 @@
 
             // Try to share structs for different layouts, but not yet for other
             // kinds of qualification (primarily not yet including interpolant qualification).
-            if (! HasNonLayoutQualifiers(qualifier))
+            if (! HasNonLayoutQualifiers(type, qualifier))
                 spvType = structMap[explicitLayout][qualifier.layoutMatrix][glslangMembers];
             if (spvType != spv::NoResult)
                 break;
@@ -2064,7 +2072,7 @@
 
     // Make the SPIR-V type
     spv::Id spvType = builder.makeStructType(spvMembers, type.getTypeName().c_str());
-    if (! HasNonLayoutQualifiers(qualifier))
+    if (! HasNonLayoutQualifiers(type, qualifier))
         structMap[explicitLayout][qualifier.layoutMatrix][glslangMembers] = spvType;
 
     // Decorate it
@@ -2231,6 +2239,8 @@
 
 // Wrap the builder's accessChainStore to:
 //  - do conversion of concrete to abstract type
+//
+// Implicitly uses the existing builder.accessChain as the storage target.
 void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::Id rvalue)
 {
     // Need to convert to abstract types when necessary
@@ -2260,6 +2270,77 @@
     builder.accessChainStore(rvalue);
 }
 
+// For storing when types match at the glslang level, but not might match at the
+// SPIR-V level.
+//
+// This especially happens when a single glslang type expands to multiple
+// SPIR-V types, like a struct that is used in an member-undecorated way as well
+// as in a member-decorated way.
+//
+// NOTE: This function can handle any store request; if it's not special it
+// simplifies to a simple OpStore.
+//
+// Implicitly uses the existing builder.accessChain as the storage target.
+void TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id rValue)
+{
+    // we only do the complex path here if it's an aggregate
+    if (! type.isStruct() && ! type.isArray()) {
+        accessChainStore(type, rValue);
+        return;
+    }
+
+    // and, it has to be a case of type aliasing
+    spv::Id rType = builder.getTypeId(rValue);
+    spv::Id lValue = builder.accessChainGetLValue();
+    spv::Id lType = builder.getContainedTypeId(builder.getTypeId(lValue));
+    if (lType == rType) {
+        accessChainStore(type, rValue);
+        return;
+    }
+
+    // Recursively (as needed) copy an aggregate type to a different aggregate type,
+    // where the two types were the same type in GLSL. This requires member
+    // by member copy, recursively.
+
+    // If an array, copy element by element.
+    if (type.isArray()) {
+        glslang::TType glslangElementType(type, 0);
+        spv::Id elementRType = builder.getContainedTypeId(rType);
+        for (int index = 0; index < type.getOuterArraySize(); ++index) {
+            // get the source member
+            spv::Id elementRValue = builder.createCompositeExtract(rValue, elementRType, index);
+
+            // set up the target storage
+            builder.clearAccessChain();
+            builder.setAccessChainLValue(lValue);
+            builder.accessChainPush(builder.makeIntConstant(index));
+
+            // store the member
+            multiTypeStore(glslangElementType, elementRValue);
+        }
+    } else {
+        assert(type.isStruct());
+
+        // loop over structure members
+        const glslang::TTypeList& members = *type.getStruct();
+        for (int m = 0; m < (int)members.size(); ++m) {
+            const glslang::TType& glslangMemberType = *members[m].type;
+
+            // get the source member
+            spv::Id memberRType = builder.getContainedTypeId(rType, m);
+            spv::Id memberRValue = builder.createCompositeExtract(rValue, memberRType, m);
+
+            // set up the target storage
+            builder.clearAccessChain();
+            builder.setAccessChainLValue(lValue);
+            builder.accessChainPush(builder.makeIntConstant(m));
+
+            // store the member
+            multiTypeStore(glslangMemberType, memberRValue);
+        }
+    }
+}
+
 // Decide whether or not this type should be
 // decorated with offsets and strides, and if so
 // whether std140 or std430 rules should be applied.
@@ -2370,11 +2451,9 @@
     }
 }
 
-bool TGlslangToSpvTraverser::isShaderEntrypoint(const glslang::TIntermAggregate* node)
+bool TGlslangToSpvTraverser::isShaderEntryPoint(const glslang::TIntermAggregate* node)
 {
-    // have to ignore mangling and just look at the base name
-    size_t firstOpen = node->getName().find('(');
-    return node->getName().compare(0, firstOpen, glslangIntermediate->getEntryPoint().c_str()) == 0;
+    return node->getName().compare(glslangIntermediate->getEntryPointMangledName().c_str()) == 0;
 }
 
 // Make all the functions, skeletally, without actually visiting their bodies.
@@ -2382,23 +2461,22 @@
 {
     for (int f = 0; f < (int)glslFunctions.size(); ++f) {
         glslang::TIntermAggregate* glslFunction = glslFunctions[f]->getAsAggregate();
-        if (! glslFunction || glslFunction->getOp() != glslang::EOpFunction || isShaderEntrypoint(glslFunction))
+        if (! glslFunction || glslFunction->getOp() != glslang::EOpFunction || isShaderEntryPoint(glslFunction))
             continue;
 
         // We're on a user function.  Set up the basic interface for the function now,
-        // so that it's available to call.
-        // Translating the body will happen later.
+        // so that it's available to call.  Translating the body will happen later.
         //
         // Typically (except for a "const in" parameter), an address will be passed to the
         // function.  What it is an address of varies:
         //
-        // - "in" parameters not marked as "const" can be written to without modifying the argument,
-        //  so that write needs to be to a copy, hence the address of a copy works.
+        // - "in" parameters not marked as "const" can be written to without modifying the calling
+        //   argument so that write needs to be to a copy, hence the address of a copy works.
         //
         // - "const in" parameters can just be the r-value, as no writes need occur.
         //
-        // - "out" and "inout" arguments can't be done as direct pointers, because GLSL has
-        // copy-in/copy-out semantics.  They can be handled though with a pointer to a copy.
+        // - "out" and "inout" arguments can't be done as pointers to the calling argument, because
+        //   GLSL has copy-in/copy-out semantics.  They can be handled though with a pointer to a copy.
 
         std::vector<spv::Id> paramTypes;
         std::vector<spv::Decoration> paramPrecisions;
@@ -2412,7 +2490,7 @@
             else if (paramType.getQualifier().storage != glslang::EvqConstReadOnly)
                 typeId = builder.makePointer(spv::StorageClassFunction, typeId);
             else
-                constReadOnlyParameters.insert(parameters[p]->getAsSymbolNode()->getId());
+                rValueParameters.insert(parameters[p]->getAsSymbolNode()->getId());
             paramPrecisions.push_back(TranslatePrecisionDecoration(paramType));
             paramTypes.push_back(typeId);
         }
@@ -2443,7 +2521,7 @@
         if (initializer && initializer->getOp() != glslang::EOpFunction && initializer->getOp() != glslang::EOpLinkerObjects) {
 
             // We're on a top-level node that's not a function.  Treat as an initializer, whose
-            // code goes into the beginning of main.
+            // code goes into the beginning of the entry point.
             initializer->traverse(this);
         }
     }
@@ -2897,7 +2975,9 @@
                 // need to copy the input into output space
                 builder.setAccessChain(lValues[lValueCount]);
                 spv::Id copy = accessChainLoad(*argTypes[a]);
-                builder.createStore(copy, arg);
+                builder.clearAccessChain();
+                builder.setAccessChainLValue(arg);
+                multiTypeStore(paramType, copy);
             }
             ++lValueCount;
         } else {
@@ -2914,11 +2994,12 @@
     // 4. Copy back out an "out" arguments.
     lValueCount = 0;
     for (int a = 0; a < (int)glslangArgs.size(); ++a) {
+        const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
         if (qualifiers[a] != glslang::EvqConstReadOnly) {
             if (qualifiers[a] == glslang::EvqOut || qualifiers[a] == glslang::EvqInOut) {
                 spv::Id copy = builder.createLoad(spvArgs[a]);
                 builder.setAccessChain(lValues[lValueCount]);
-                accessChainStore(glslangArgs[a]->getAsTyped()->getType(), copy);
+                multiTypeStore(paramType, copy);
             }
             ++lValueCount;
         }
@@ -3082,11 +3163,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:
@@ -3443,8 +3522,7 @@
     case glslang::EOpUnpackInt2x32:
     case glslang::EOpPackUint2x32:
     case glslang::EOpUnpackUint2x32:
-        logger->missingFunctionality("shader int64");
-        libCall = spv::GLSLstd450Bad; // TODO: This is a placeholder.
+        unaryOp = spv::OpBitcast;
         break;
 
     case glslang::EOpDPdx:
@@ -3700,8 +3778,8 @@
     case glslang::EOpConvInt64ToUint64:
         if (builder.isInSpecConstCodeGenMode()) {
             // Build zero scalar or vector for OpIAdd.
-            zero = (op == glslang::EOpConvUintToInt64 ||
-                    op == glslang::EOpConvIntToUint64) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
+            zero = (op == glslang::EOpConvUint64ToInt64 ||
+                    op == glslang::EOpConvInt64ToUint64) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
             zero = makeSmearedConstant(zero, vectorSize);
             // Use OpIAdd, instead of OpBitcast to do the conversion when
             // generating for OpSpecConstantOp instruction.
@@ -3941,7 +4019,10 @@
                 spvOp = spv::OpGroupIAdd;
         }
 
-        return builder.createOp(spvOp, typeId, operands);
+        if (builder.isVectorType(typeId))
+            return CreateInvocationsVectorOperation(spvOp, typeId, operand);
+        else
+            return builder.createOp(spvOp, typeId, operands);
     }
     case glslang::EOpMinInvocationsNonUniform:
     case glslang::EOpMaxInvocationsNonUniform:
@@ -3975,7 +4056,10 @@
                 spvOp = spv::OpGroupIAddNonUniformAMD;
         }
 
-        return builder.createOp(spvOp, typeId, operands);
+        if (builder.isVectorType(typeId))
+            return CreateInvocationsVectorOperation(spvOp, typeId, operand);
+        else
+            return builder.createOp(spvOp, typeId, operands);
     }
 #endif
     default:
@@ -3984,6 +4068,48 @@
     }
 }
 
+#ifdef AMD_EXTENSIONS
+// Create group invocation operations on a vector
+spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, spv::Id operand)
+{
+    assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin ||
+           op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax ||
+           op == spv::OpGroupFAdd || op == spv::OpGroupIAdd ||
+           op == spv::OpGroupFMinNonUniformAMD || op == spv::OpGroupUMinNonUniformAMD || op == spv::OpGroupSMinNonUniformAMD ||
+           op == spv::OpGroupFMaxNonUniformAMD || op == spv::OpGroupUMaxNonUniformAMD || op == spv::OpGroupSMaxNonUniformAMD ||
+           op == spv::OpGroupFAddNonUniformAMD || op == spv::OpGroupIAddNonUniformAMD);
+
+    // Handle group invocation operations scalar by scalar.
+    // The result type is the same type as the original type.
+    // The algorithm is to:
+    //   - break the vector into scalars
+    //   - apply the operation to each scalar
+    //   - make a vector out the scalar results
+
+    // get the types sorted out
+    int numComponents = builder.getNumComponents(operand);
+    spv::Id scalarType = builder.getScalarTypeId(builder.getTypeId(operand));
+    std::vector<spv::Id> results;
+
+    // do each scalar op
+    for (int comp = 0; comp < numComponents; ++comp) {
+        std::vector<unsigned int> indexes;
+        indexes.push_back(comp);
+        spv::Id scalar = builder.createCompositeExtract(operand, scalarType, indexes);
+
+        std::vector<spv::Id> operands;
+        operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
+        operands.push_back(spv::GroupOperationReduce);
+        operands.push_back(scalar);
+
+        results.push_back(builder.createOp(op, scalarType, operands));
+    }
+
+    // put the pieces together
+    return builder.createCompositeConstruct(typeId, results);
+}
+#endif
+
 spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
 {
     bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
diff --git a/SPIRV/SPVRemapper.cpp b/SPIRV/SPVRemapper.cpp
index 05f220a..5c551fb 100755
--- a/SPIRV/SPVRemapper.cpp
+++ b/SPIRV/SPVRemapper.cpp
@@ -127,6 +127,33 @@
         }
     }
 
+    // Return the size of a type in 32-bit words.  This currently only
+    // handles ints and floats, and is only invoked by queries which must be
+    // integer types.  If ever needed, it can be generalized.
+    unsigned spirvbin_t::typeSizeInWords(spv::Id id) const
+    {
+        const unsigned typeStart = idPos(id);
+        const spv::Op  opCode    = asOpCode(typeStart);
+
+        switch (opCode) {
+        case spv::OpTypeInt:   // fall through...
+        case spv::OpTypeFloat: return (spv[typeStart+2]+31)/32;
+        default:
+            return 0;
+        }
+    }
+
+    // Looks up the type of a given const or variable ID, and
+    // returns its size in 32-bit words.
+    unsigned spirvbin_t::idTypeSizeInWords(spv::Id id) const
+    {
+        const auto tid_it = idTypeSizeMap.find(id);
+        if (tid_it == idTypeSizeMap.end())
+            error("type size for ID not found");
+
+        return tid_it->second;
+    }
+
     // Is this an opcode we should remove when using --strip?
     bool spirvbin_t::isStripOp(spv::Op opCode) const
     {
@@ -140,6 +167,7 @@
         }
     }
 
+    // Return true if this opcode is flow control
     bool spirvbin_t::isFlowCtrl(spv::Op opCode) const
     {
         switch (opCode) {
@@ -155,6 +183,7 @@
         }
     }
 
+    // Return true if this opcode defines a type
     bool spirvbin_t::isTypeOp(spv::Op opCode) const
     {
         switch (opCode) {
@@ -182,6 +211,7 @@
         }
     }
 
+    // Return true if this opcode defines a constant
     bool spirvbin_t::isConstOp(spv::Op opCode) const
     {
         switch (opCode) {
@@ -324,7 +354,7 @@
         fnPosDCE.clear();
         fnCalls.clear();
         typeConstPos.clear();
-        typeConstPosR.clear();
+        idPosR.clear();
         entryPoint = spv::NoResult;
         largestNewId = 0;
 
@@ -340,6 +370,25 @@
                 if ((options & STRIP) && isStripOp(opCode))
                     stripInst(start);
 
+                unsigned word = start+1;
+                spv::Id  typeId = spv::NoResult;
+
+                if (spv::InstructionDesc[opCode].hasType())
+                    typeId = asId(word++);
+
+                // If there's a result ID, remember the size of its type
+                if (spv::InstructionDesc[opCode].hasResult()) {
+                    const spv::Id resultId = asId(word++);
+                    idPosR[resultId] = start;
+                    
+                    if (typeId != spv::NoResult) {
+                        const unsigned idTypeSize = typeSizeInWords(typeId);
+
+                        if (idTypeSize != 0)
+                            idTypeSizeMap[resultId] = idTypeSize;
+                    }
+                }
+
                 if (opCode == spv::Op::OpName) {
                     const spv::Id    target = asId(start+1);
                     const std::string  name = literalString(start+2);
@@ -363,11 +412,9 @@
                 } else if (isConstOp(opCode)) {
                     assert(asId(start + 2) != spv::NoResult);
                     typeConstPos.insert(start);
-                    typeConstPosR[asId(start + 2)] = start;
                 } else if (isTypeOp(opCode)) {
                     assert(asId(start + 1) != spv::NoResult);
                     typeConstPos.insert(start);
-                    typeConstPosR[asId(start + 1)] = start;
                 }
 
                 return false;
@@ -436,12 +483,19 @@
             return nextInst;
         }
 
+        // Circular buffer so we can look back at previous unmapped values during the mapping pass.
+        static const unsigned idBufferSize = 4;
+        spv::Id idBuffer[idBufferSize];
+        unsigned idBufferPos = 0;
+
         // Store IDs from instruction in our map
         for (int op = 0; numOperands > 0; ++op, --numOperands) {
             switch (spv::InstructionDesc[opCode].operands.getClass(op)) {
             case spv::OperandId:
             case spv::OperandScope:
             case spv::OperandMemorySemantics:
+                idBuffer[idBufferPos] = asId(word);
+                idBufferPos = (idBufferPos + 1) % idBufferSize;
                 idFn(asId(word++));
                 break;
 
@@ -459,13 +513,25 @@
                 // word += numOperands;
                 return nextInst;
 
-            case spv::OperandVariableLiteralId:
-                while (numOperands > 0) {
-                    ++word;             // immediate
-                    idFn(asId(word++)); // ID
-                    numOperands -= 2;
+            case spv::OperandVariableLiteralId: {
+                if (opCode == OpSwitch) {
+                    // word-2 is the position of the selector ID.  OpSwitch Literals match its type.
+                    // In case the IDs are currently being remapped, we get the word[-2] ID from
+                    // the circular idBuffer.
+                    const unsigned literalSizePos = (idBufferPos+idBufferSize-2) % idBufferSize;
+                    const unsigned literalSize = idTypeSizeInWords(idBuffer[literalSizePos]);
+                    const unsigned numLiteralIdPairs = (nextInst-word) / (1+literalSize);
+
+                    for (unsigned arg=0; arg<numLiteralIdPairs; ++arg) {
+                        word += literalSize;  // literal
+                        idFn(asId(word++));   // label
+                    }
+                } else {
+                    assert(0); // currentely, only OpSwitch uses OperandVariableLiteralId
                 }
+
                 return nextInst;
+            }
 
             case spv::OperandLiteralString: {
                 const int stringWordCount = literalStringWords(literalString(word));
@@ -966,23 +1032,27 @@
 
         std::unordered_map<spv::Id, int> typeUseCount;
 
-        // Count total type usage
-        process(inst_fn_nop,
-            [&](spv::Id& id) { if (isType[id]) ++typeUseCount[id]; }
-        );
+        // This is not the most efficient algorithm, but this is an offline tool, and
+        // it's easy to write this way.  Can be improved opportunistically if needed.
+        bool changed = true;
+        while (changed) {
+            changed = false;
+            strip();
+            typeUseCount.clear();
 
-        // Remove types from deleted code
-        for (const auto& fn : fnPosDCE)
+            // Count total type usage
             process(inst_fn_nop,
-            [&](spv::Id& id) { if (isType[id]) --typeUseCount[id]; },
-            fn.second.first, fn.second.second);
+                    [&](spv::Id& id) { if (isType[id]) ++typeUseCount[id]; }
+                    );
 
-        // Remove single reference types
-        for (const auto typeStart : typeConstPos) {
-            const spv::Id typeId = asTypeConstId(typeStart);
-            if (typeUseCount[typeId] == 1) {
-                --typeUseCount[typeId];
-                stripInst(typeStart);
+            // Remove single reference types
+            for (const auto typeStart : typeConstPos) {
+                const spv::Id typeId = asTypeConstId(typeStart);
+                if (typeUseCount[typeId] == 1) {
+                    changed = true;
+                    --typeUseCount[typeId];
+                    stripInst(typeStart);
+                }
             }
         }
     }
@@ -1060,12 +1130,12 @@
     }
 #endif // NOTDEF
 
-    // Return start position in SPV of given type.  error if not found.
-    unsigned spirvbin_t::typePos(spv::Id id) const
+    // Return start position in SPV of given Id.  error if not found.
+    unsigned spirvbin_t::idPos(spv::Id id) const
     {
-        const auto tid_it = typeConstPosR.find(id);
-        if (tid_it == typeConstPosR.end())
-            error("type ID not found");
+        const auto tid_it = idPosR.find(id);
+        if (tid_it == idPosR.end())
+            error("ID not found");
 
         return tid_it->second;
     }
@@ -1083,11 +1153,11 @@
         case spv::OpTypeInt:          return 3 + (spv[typeStart+3]);
         case spv::OpTypeFloat:        return 5;
         case spv::OpTypeVector:
-            return 6 + hashType(typePos(spv[typeStart+2])) * (spv[typeStart+3] - 1);
+            return 6 + hashType(idPos(spv[typeStart+2])) * (spv[typeStart+3] - 1);
         case spv::OpTypeMatrix:
-            return 30 + hashType(typePos(spv[typeStart+2])) * (spv[typeStart+3] - 1);
+            return 30 + hashType(idPos(spv[typeStart+2])) * (spv[typeStart+3] - 1);
         case spv::OpTypeImage:
-            return 120 + hashType(typePos(spv[typeStart+2])) +
+            return 120 + hashType(idPos(spv[typeStart+2])) +
                 spv[typeStart+3] +            // dimensionality
                 spv[typeStart+4] * 8 * 16 +   // depth
                 spv[typeStart+5] * 4 * 16 +   // arrayed
@@ -1098,24 +1168,24 @@
         case spv::OpTypeSampledImage:
             return 502;
         case spv::OpTypeArray:
-            return 501 + hashType(typePos(spv[typeStart+2])) * spv[typeStart+3];
+            return 501 + hashType(idPos(spv[typeStart+2])) * spv[typeStart+3];
         case spv::OpTypeRuntimeArray:
-            return 5000  + hashType(typePos(spv[typeStart+2]));
+            return 5000  + hashType(idPos(spv[typeStart+2]));
         case spv::OpTypeStruct:
             {
                 std::uint32_t hash = 10000;
                 for (unsigned w=2; w < wordCount; ++w)
-                    hash += w * hashType(typePos(spv[typeStart+w]));
+                    hash += w * hashType(idPos(spv[typeStart+w]));
                 return hash;
             }
 
         case spv::OpTypeOpaque:         return 6000 + spv[typeStart+2];
-        case spv::OpTypePointer:        return 100000  + hashType(typePos(spv[typeStart+3]));
+        case spv::OpTypePointer:        return 100000  + hashType(idPos(spv[typeStart+3]));
         case spv::OpTypeFunction:
             {
                 std::uint32_t hash = 200000;
                 for (unsigned w=2; w < wordCount; ++w)
-                    hash += w * hashType(typePos(spv[typeStart+w]));
+                    hash += w * hashType(idPos(spv[typeStart+w]));
                 return hash;
             }
 
@@ -1132,14 +1202,14 @@
         case spv::OpConstantFalse:       return 300008;
         case spv::OpConstantComposite:
             {
-                std::uint32_t hash = 300011 + hashType(typePos(spv[typeStart+1]));
+                std::uint32_t hash = 300011 + hashType(idPos(spv[typeStart+1]));
                 for (unsigned w=3; w < wordCount; ++w)
-                    hash += w * hashType(typePos(spv[typeStart+w]));
+                    hash += w * hashType(idPos(spv[typeStart+w]));
                 return hash;
             }
         case spv::OpConstant:
             {
-                std::uint32_t hash = 400011 + hashType(typePos(spv[typeStart+1]));
+                std::uint32_t hash = 400011 + hashType(idPos(spv[typeStart+1]));
                 for (unsigned w=3; w < wordCount; ++w)
                     hash += w * spv[typeStart+w];
                 return hash;
@@ -1212,19 +1282,19 @@
         msg(3, 4, std::string("ID bound: ") + std::to_string(bound()));
 
         strip();        // strip out data we decided to eliminate
-
         if (options & OPT_LOADSTORE) optLoadStore();
         if (options & OPT_FWD_LS)    forwardLoadStores();
         if (options & DCE_FUNCS)     dceFuncs();
         if (options & DCE_VARS)      dceVars();
         if (options & DCE_TYPES)     dceTypes();
+        strip();        // strip out data we decided to eliminate
+
         if (options & MAP_TYPES)     mapTypeConst();
         if (options & MAP_NAMES)     mapNames();
         if (options & MAP_FUNCS)     mapFnBodies();
 
         mapRemainder(); // map any unmapped IDs
         applyMap();     // Now remap each shader to the new IDs we've come up with
-        strip();        // strip out data we decided to eliminate
     }
 
     // remap from a memory image
diff --git a/SPIRV/SPVRemapper.h b/SPIRV/SPVRemapper.h
index e5e8e1b..43ec1ae 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
@@ -82,7 +82,7 @@
 public:
     spirvbin_t(int /*verbose = 0*/) { }
 
-    void remap(std::vector<unsigned int>& /*spv*/, unsigned int /*opts = 0*/)
+    void remap(std::vector<std::uint32_t>& /*spv*/, unsigned int /*opts = 0*/)
     {
         printf("Tool not compiled for C++11, which is required for SPIR-V remapping.\n");
         exit(5);
@@ -159,16 +159,21 @@
    typedef std::set<int>                    posmap_t;
    typedef std::unordered_map<spv::Id, int> posmap_rev_t;
 
+   // Maps and ID to the size of its base type, if known.
+   typedef std::unordered_map<spv::Id, unsigned> typesize_map_t;
+
    // handle error
    void error(const std::string& txt) const { errorHandler(txt); }
 
-   bool    isConstOp(spv::Op opCode)       const;
-   bool    isTypeOp(spv::Op opCode)        const;
-   bool    isStripOp(spv::Op opCode)       const;
-   bool    isFlowCtrl(spv::Op opCode)      const;
-   range_t literalRange(spv::Op opCode)    const;
-   range_t typeRange(spv::Op opCode)       const;
-   range_t constRange(spv::Op opCode)      const;
+   bool     isConstOp(spv::Op opCode)      const;
+   bool     isTypeOp(spv::Op opCode)       const;
+   bool     isStripOp(spv::Op opCode)      const;
+   bool     isFlowCtrl(spv::Op opCode)     const;
+   range_t  literalRange(spv::Op opCode)   const;
+   range_t  typeRange(spv::Op opCode)      const;
+   range_t  constRange(spv::Op opCode)     const;
+   unsigned typeSizeInWords(spv::Id id)    const;
+   unsigned idTypeSizeInWords(spv::Id id)  const;
    
    spv::Id&        asId(unsigned word)                { return spv[word]; }
    const spv::Id&  asId(unsigned word)          const { return spv[word]; }
@@ -177,10 +182,10 @@
    spv::Decoration asDecoration(unsigned word)  const { return spv::Decoration(spv[word]); }
    unsigned        asWordCount(unsigned word)   const { return opWordCount(spv[word]); }
    spv::Id         asTypeConstId(unsigned word) const { return asId(word + (isTypeOp(asOpCode(word)) ? 1 : 2)); }
-   unsigned        typePos(spv::Id id)          const;
+   unsigned        idPos(spv::Id id)            const;
 
-   static unsigned    opWordCount(spirword_t data) { return data >> spv::WordCountShift; }
-   static spv::Op     opOpCode(spirword_t data)    { return spv::Op(data & spv::OpCodeMask); }
+   static unsigned opWordCount(spirword_t data) { return data >> spv::WordCountShift; }
+   static spv::Op  opOpCode(spirword_t data)    { return spv::Op(data & spv::OpCodeMask); }
 
    // Header access & set methods
    spirword_t  magic()    const       { return spv[0]; } // return magic number
@@ -263,8 +268,9 @@
    // Which functions are called, anywhere in the module, with a call count
    std::unordered_map<spv::Id, int> fnCalls;
    
-   posmap_t     typeConstPos;   // word positions that define types & consts (ordered)
-   posmap_rev_t typeConstPosR;  // reverse map from IDs to positions
+   posmap_t       typeConstPos;  // word positions that define types & consts (ordered)
+   posmap_rev_t   idPosR;        // reverse map from IDs to positions
+   typesize_map_t idTypeSizeMap; // maps each ID to its type size, if known.
    
    std::vector<spv::Id>  idMapL;   // ID {M}ap from {L}ocal to {G}lobal IDs
 
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 1411d16..a881d1b 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>
@@ -931,7 +931,7 @@
 }
 
 // Comments in header
-Function* Builder::makeEntrypoint(const char* entryPoint)
+Function* Builder::makeEntryPoint(const char* entryPoint)
 {
     assert(! mainFunction);
 
@@ -1328,15 +1328,20 @@
 // Comments in header
 Id Builder::createLvalueSwizzle(Id typeId, Id target, Id source, std::vector<unsigned>& channels)
 {
-    assert(getNumComponents(source) == (int)channels.size());
     if (channels.size() == 1 && getNumComponents(source) == 1)
         return createCompositeInsert(source, target, typeId, channels.front());
 
     Instruction* swizzle = new Instruction(getUniqueId(), typeId, OpVectorShuffle);
-    assert(isVector(source));
     assert(isVector(target));
     swizzle->addIdOperand(target);
-    swizzle->addIdOperand(source);
+    if (accessChain.component != NoResult)
+        // For dynamic component selection, source does not involve in l-value swizzle
+        swizzle->addIdOperand(target);
+    else {
+        assert(getNumComponents(source) == (int)channels.size());
+        assert(isVector(source));
+        swizzle->addIdOperand(source);
+    }
 
     // Set up an identity shuffle from the base value to the result value
     unsigned int components[4];
@@ -1345,8 +1350,12 @@
         components[i] = i;
 
     // Punch in the l-value swizzle
-    for (int i = 0; i < (int)channels.size(); ++i)
-        components[channels[i]] = numTargetComponents + i;
+    for (int i = 0; i < (int)channels.size(); ++i) {
+        if (accessChain.component != NoResult)
+            components[i] = channels[i]; // Only shuffle the base value
+        else
+            components[channels[i]] = numTargetComponents + i;
+    }
 
     // finish the instruction with these components selectors
     for (int i = 0; i < numTargetComponents; ++i)
@@ -2118,9 +2127,6 @@
     transferAccessChainSwizzle(true);
     Id base = collapseAccessChain();
 
-    if (accessChain.swizzle.size() && accessChain.component != NoResult)
-        logger->missingFunctionality("simultaneous l-value swizzle and dynamic component selection");
-
     // If swizzle still exists, it is out-of-order or not full, we must load the target vector,
     // extract and insert elements to perform writeMask and/or swizzle.
     Id source = NoResult;
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index 00e85b8..38dc1fa 100755
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -210,7 +210,7 @@
 
     // Make the entry-point function. The returned pointer is only valid
     // for the lifetime of this builder.
-    Function* makeEntrypoint(const char*);
+    Function* makeEntryPoint(const char*);
 
     // Make a shader-style function, and create its entry block if entry is non-zero.
     // Return the function, pass back the entry.
@@ -467,7 +467,7 @@
 
     //
     // the SPIR-V builder maintains a single active chain that
-    // the following methods operated on
+    // the following methods operate on
     //
 
     // for external save and restore
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
index b60b3ba..b1023b9 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>
@@ -217,10 +217,12 @@
 
 void SpirvStream::formatId(Id id, std::stringstream& idStream)
 {
-    if (id >= bound)
-        Kill(out, "Bad <id>");
-
     if (id != 0) {
+        // On instructions with no IDs, this is called with "0", which does not
+        // have to be within ID bounds on null shaders.
+        if (id >= bound)
+            Kill(out, "Bad <id>");
+
         idStream << id;
         if (idDescriptor[id].size() > 0)
             idStream << "(" << idDescriptor[id] << ")";
@@ -334,7 +336,7 @@
         idDescriptor[resultId] = (const char*)(&stream[word]);
     }
     else {
-        if (idDescriptor[resultId].size() == 0) {
+        if (resultId != 0 && idDescriptor[resultId].size() == 0) {
             switch (opCode) {
             case OpTypeInt:
                 idDescriptor[resultId] = "int";
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/CMakeLists.txt b/StandAlone/CMakeLists.txt
index d69351e..231ba27 100644
--- a/StandAlone/CMakeLists.txt
+++ b/StandAlone/CMakeLists.txt
@@ -24,6 +24,7 @@
     OSDependent
     HLSL
     SPIRV
+    SPVRemapper
     glslang-default-resource-limits)
 
 if(WIN32)
diff --git a/StandAlone/ResourceLimits.cpp b/StandAlone/ResourceLimits.cpp
index 8019863..8a5e6f3 100644
--- a/StandAlone/ResourceLimits.cpp
+++ b/StandAlone/ResourceLimits.cpp
@@ -241,8 +241,10 @@
 void DecodeResourceLimits(TBuiltInResource* resources, char* config)
 {
     const char* delims = " \t\n\r";
+#pragma warning(suppress: 4996)
     const char* token = strtok(config, delims);
     while (token) {
+#pragma warning(suppress: 4996)
         const char* valueStr = strtok(0, delims);
         if (valueStr == 0 || ! (valueStr[0] == '-' || (valueStr[0] >= '0' && valueStr[0] <= '9'))) {
             printf("Error: '%s' bad .conf file.  Each name must be followed by one number.\n", valueStr ? valueStr : "");
@@ -438,6 +440,7 @@
         else
             printf("Warning: unrecognized limit (%s) in configuration file.\n", token);
 
+#pragma warning(suppress: 4996)
         token = strtok(0, delims);
     }
 }
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index c014be2..606f247 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"
 
@@ -155,6 +155,7 @@
 const char* ExecutableName = nullptr;
 const char* binaryFileName = nullptr;
 const char* entryPointName = nullptr;
+const char* shaderStageName = nullptr;
 
 //
 // Create the default name for saving a binary if -o is not provided.
@@ -236,6 +237,15 @@
                 Options |= EOptionVulkanRules;
                 Options |= EOptionLinkProgram;
                 break;
+            case 'S':
+                shaderStageName = argv[1];
+                if (argc > 0) {
+                    argc--;
+                    argv++;
+                }
+                else
+                    Error("no <stage> specified for -S");
+                break;
             case 'G':
                 Options |= EOptionSpv;
                 Options |= EOptionLinkProgram;
@@ -402,7 +412,26 @@
 struct ShaderCompUnit {
     EShLanguage stage;
     std::string fileName;
-    char** text;           // memory owned/managed externally
+    char** text;             // memory owned/managed externally
+    const char*  fileNameList[1];
+
+    // Need to have a special constructors to adjust the fileNameList, since back end needs a list of ptrs
+    ShaderCompUnit(EShLanguage istage, std::string &ifileName, char** itext)
+    {
+        stage = istage;
+        fileName = ifileName;
+        text    = itext;
+        fileNameList[0] = fileName.c_str();
+    }
+
+    ShaderCompUnit(const ShaderCompUnit &rhs)
+    {
+        stage = rhs.stage;
+        fileName = rhs.fileName;
+        text = rhs.text;
+        fileNameList[0] = fileName.c_str();
+    }
+
 };
 
 //
@@ -429,7 +458,7 @@
     for (auto it = compUnits.cbegin(); it != compUnits.cend(); ++it) {
         const auto &compUnit = *it;
         glslang::TShader* shader = new glslang::TShader(compUnit.stage);
-        shader->setStrings(compUnit.text, 1);
+        shader->setStringsWithLengthsAndNames(compUnit.text, NULL, compUnit.fileNameList, 1);
         if (entryPointName) // HLSL todo: this needs to be tracked per compUnits
             shader->setEntryPoint(entryPointName);
         shaders.push_back(shader);
@@ -685,6 +714,9 @@
     }
 
     std::string suffix = name.substr(ext + 1, std::string::npos);
+    if (shaderStageName)
+        suffix = shaderStageName;
+
     if (suffix == "vert")
         return EShLangVertex;
     else if (suffix == "tesc")
@@ -778,6 +810,8 @@
            "  -H          print human readable form of SPIR-V; turns on -V\n"
            "  -E          print pre-processed GLSL; cannot be used with -l;\n"
            "              errors will appear on stderr.\n"
+           "  -S <stage>  uses explicit stage specified, rather then the file extension.\n"
+           "              valid choices are vert, tesc, tese, geom, frag, or comp\n"
            "  -c          configuration dump;\n"
            "              creates the default configuration file (redirect to a .conf file)\n"
            "  -C          cascading errors; risks crashes from accumulation of error recoveries\n"
diff --git a/Test/400.vert b/Test/400.vert
index 2c3dd04..315c7ea 100644
--- a/Test/400.vert
+++ b/Test/400.vert
@@ -4,6 +4,103 @@
 in dvec3 d3;   // ERROR, no doubles
 in dmat4 dm4;  // ERROR, no doubles
 
-void main()
+// function selection under type conversion
+void foo1(double a, uint b)  {}

+void foo1(double a, int b)   {}

+void foo1(double a, float b) {}

+void foo1(double a, double b){}

+

+void foo2(double a, float b) {}

+void foo2(double a, double b){}

+

+void foo3(double a, float b) {}

+void foo3(float a, double b) {}

+

+void ftd(  int,  float, double) {}

+void ftd( uint,  float, double) {}

+void ftd(float, double, double) {}

+

+void main()

+{

+    double d;

+	uint u;

+	int i;

+	float f;

+

+	foo1(d, d);

+	foo1(d, u);

+	foo1(d, i);

+	foo1(d, f);

+

+	foo1(f, d);

+	foo1(f, u);

+	foo1(f, i);

+	foo1(f, f);

+

+	foo1(u, d);

+	foo1(u, u);

+	foo1(u, i);

+	foo1(u, f);

+

+	foo1(i, d);

+	foo1(i, u);

+	foo1(i, i);

+	foo1(i, f);

+

+	foo2(d, d);

+	foo2(d, u);

+	foo2(d, i);

+	foo2(d, f);

+

+	foo2(f, d);

+	foo2(f, u);

+	foo2(f, i);

+	foo2(f, f);

+

+	foo2(u, d);

+	foo2(u, u);

+	foo2(u, i);

+	foo2(u, f);

+

+	foo2(i, d);

+	foo2(i, u);

+	foo2(i, i);

+	foo2(i, f);

+

+	foo3(d, d);  // ERROR, no match

+	foo3(d, u);

+	foo3(d, i);

+	foo3(d, f);

+

+	foo3(f, d);

+	foo3(f, u); // ERROR, ambiguous

+	foo3(f, i); // ERROR, ambiguous

+	foo3(f, f); // ERROR, ambiguous

+

+	foo3(u, d);

+	foo3(u, u); // ERROR, ambiguous

+	foo3(u, i); // ERROR, ambiguous

+	foo3(u, f); // ERROR, ambiguous

+

+	foo3(i, d);

+	foo3(i, u); // ERROR, ambiguous

+	foo3(i, i); // ERROR, ambiguous

+	foo3(i, f); // ERROR, ambiguous

+

+	ftd(i, f, f);

+	ftd(u, f, f);

+}
+
+void itf(int, float, int);
+void itf(int, double, int);
+
+void tf()
 {
+    double d;

+	uint u;

+	int i;

+	float f;

+	
+	itf(i, i, i);
+	itf(i, u, i);
 }
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/120.frag.out b/Test/baseResults/120.frag.out
index 0d10b0e..4fa7600 100644
--- a/Test/baseResults/120.frag.out
+++ b/Test/baseResults/120.frag.out
@@ -23,7 +23,7 @@
 ERROR: 0:85: 'assign' :  l-value required 
 ERROR: 0:91: 'int' : overloaded functions must have the same return type 
 ERROR: 0:91: 'main' : function already has a body 
-ERROR: 0:91: 'int' :  main function cannot return a value
+ERROR: 0:91: 'int' :  entry point cannot return a value
 ERROR: 0:92: 'main' : function cannot take any parameter(s) 
 ERROR: 0:94: 'a' : variables with qualifier 'const' must be initialized 
 ERROR: 0:97: 'out' : overloaded functions must have the same parameter storage qualifiers for argument 1
diff --git a/Test/baseResults/400.vert.out b/Test/baseResults/400.vert.out
index 946f21d..2b0d63d 100755
--- a/Test/baseResults/400.vert.out
+++ b/Test/baseResults/400.vert.out
@@ -3,13 +3,288 @@
 ERROR: 0:3: 'vertex-shader `double` type input' : not supported for this version or the enabled extensions 
 ERROR: 0:4: 'vertex-shader `double` type input' : not supported for this version or the enabled extensions 
 ERROR: 0:5: 'vertex-shader `double` type input' : not supported for this version or the enabled extensions 
-ERROR: 3 compilation errors.  No code generated.
+ERROR: 0:70: 'foo3' : no matching overloaded function found 
+ERROR: 0:76: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:77: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:78: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:81: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:82: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:83: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:86: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:87: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 0:88: 'foo3' : ambiguous best function under implicit type conversion 
+ERROR: 13 compilation errors.  No code generated.
 
 
 Shader version: 400
 ERROR: node is still EOpNull!
-0:7  Function Definition: main( (global void)
-0:7    Function Parameters: 
+0:8  Function Definition: foo1(d1;u1; (global void)
+0:8    Function Parameters: 
+0:8      'a' (in double)
+0:8      'b' (in uint)
+0:9  Function Definition: foo1(d1;i1; (global void)
+0:9    Function Parameters: 
+0:9      'a' (in double)
+0:9      'b' (in int)
+0:10  Function Definition: foo1(d1;f1; (global void)
+0:10    Function Parameters: 
+0:10      'a' (in double)
+0:10      'b' (in float)
+0:11  Function Definition: foo1(d1;d1; (global void)
+0:11    Function Parameters: 
+0:11      'a' (in double)
+0:11      'b' (in double)
+0:13  Function Definition: foo2(d1;f1; (global void)
+0:13    Function Parameters: 
+0:13      'a' (in double)
+0:13      'b' (in float)
+0:14  Function Definition: foo2(d1;d1; (global void)
+0:14    Function Parameters: 
+0:14      'a' (in double)
+0:14      'b' (in double)
+0:16  Function Definition: foo3(d1;f1; (global void)
+0:16    Function Parameters: 
+0:16      'a' (in double)
+0:16      'b' (in float)
+0:17  Function Definition: foo3(f1;d1; (global void)
+0:17    Function Parameters: 
+0:17      'a' (in float)
+0:17      'b' (in double)
+0:19  Function Definition: ftd(i1;f1;d1; (global void)
+0:19    Function Parameters: 
+0:19      '' (in int)
+0:19      '' (in float)
+0:19      '' (in double)
+0:20  Function Definition: ftd(u1;f1;d1; (global void)
+0:20    Function Parameters: 
+0:20      '' (in uint)
+0:20      '' (in float)
+0:20      '' (in double)
+0:21  Function Definition: ftd(f1;d1;d1; (global void)
+0:21    Function Parameters: 
+0:21      '' (in float)
+0:21      '' (in double)
+0:21      '' (in double)
+0:23  Function Definition: main( (global void)
+0:23    Function Parameters: 
+0:?     Sequence
+0:30      Function Call: foo1(d1;d1; (global void)
+0:30        'd' (temp double)
+0:30        'd' (temp double)
+0:31      Function Call: foo1(d1;u1; (global void)
+0:31        'd' (temp double)
+0:31        'u' (temp uint)
+0:32      Function Call: foo1(d1;i1; (global void)
+0:32        'd' (temp double)
+0:32        'i' (temp int)
+0:33      Function Call: foo1(d1;f1; (global void)
+0:33        'd' (temp double)
+0:33        'f' (temp float)
+0:35      Function Call: foo1(d1;d1; (global void)
+0:35        Convert float to double (temp double)
+0:35          'f' (temp float)
+0:35        'd' (temp double)
+0:36      Function Call: foo1(d1;u1; (global void)
+0:36        Convert float to double (temp double)
+0:36          'f' (temp float)
+0:36        'u' (temp uint)
+0:37      Function Call: foo1(d1;i1; (global void)
+0:37        Convert float to double (temp double)
+0:37          'f' (temp float)
+0:37        'i' (temp int)
+0:38      Function Call: foo1(d1;f1; (global void)
+0:38        Convert float to double (temp double)
+0:38          'f' (temp float)
+0:38        'f' (temp float)
+0:40      Function Call: foo1(d1;d1; (global void)
+0:40        Convert uint to double (temp double)
+0:40          'u' (temp uint)
+0:40        'd' (temp double)
+0:41      Function Call: foo1(d1;u1; (global void)
+0:41        Convert uint to double (temp double)
+0:41          'u' (temp uint)
+0:41        'u' (temp uint)
+0:42      Function Call: foo1(d1;i1; (global void)
+0:42        Convert uint to double (temp double)
+0:42          'u' (temp uint)
+0:42        'i' (temp int)
+0:43      Function Call: foo1(d1;f1; (global void)
+0:43        Convert uint to double (temp double)
+0:43          'u' (temp uint)
+0:43        'f' (temp float)
+0:45      Function Call: foo1(d1;d1; (global void)
+0:45        Convert int to double (temp double)
+0:45          'i' (temp int)
+0:45        'd' (temp double)
+0:46      Function Call: foo1(d1;u1; (global void)
+0:46        Convert int to double (temp double)
+0:46          'i' (temp int)
+0:46        'u' (temp uint)
+0:47      Function Call: foo1(d1;i1; (global void)
+0:47        Convert int to double (temp double)
+0:47          'i' (temp int)
+0:47        'i' (temp int)
+0:48      Function Call: foo1(d1;f1; (global void)
+0:48        Convert int to double (temp double)
+0:48          'i' (temp int)
+0:48        'f' (temp float)
+0:50      Function Call: foo2(d1;d1; (global void)
+0:50        'd' (temp double)
+0:50        'd' (temp double)
+0:51      Function Call: foo2(d1;f1; (global void)
+0:51        'd' (temp double)
+0:51        Convert uint to float (temp float)
+0:51          'u' (temp uint)
+0:52      Function Call: foo2(d1;f1; (global void)
+0:52        'd' (temp double)
+0:52        Convert int to float (temp float)
+0:52          'i' (temp int)
+0:53      Function Call: foo2(d1;f1; (global void)
+0:53        'd' (temp double)
+0:53        'f' (temp float)
+0:55      Function Call: foo2(d1;d1; (global void)
+0:55        Convert float to double (temp double)
+0:55          'f' (temp float)
+0:55        'd' (temp double)
+0:56      Function Call: foo2(d1;f1; (global void)
+0:56        Convert float to double (temp double)
+0:56          'f' (temp float)
+0:56        Convert uint to float (temp float)
+0:56          'u' (temp uint)
+0:57      Function Call: foo2(d1;f1; (global void)
+0:57        Convert float to double (temp double)
+0:57          'f' (temp float)
+0:57        Convert int to float (temp float)
+0:57          'i' (temp int)
+0:58      Function Call: foo2(d1;f1; (global void)
+0:58        Convert float to double (temp double)
+0:58          'f' (temp float)
+0:58        'f' (temp float)
+0:60      Function Call: foo2(d1;d1; (global void)
+0:60        Convert uint to double (temp double)
+0:60          'u' (temp uint)
+0:60        'd' (temp double)
+0:61      Function Call: foo2(d1;f1; (global void)
+0:61        Convert uint to double (temp double)
+0:61          'u' (temp uint)
+0:61        Convert uint to float (temp float)
+0:61          'u' (temp uint)
+0:62      Function Call: foo2(d1;f1; (global void)
+0:62        Convert uint to double (temp double)
+0:62          'u' (temp uint)
+0:62        Convert int to float (temp float)
+0:62          'i' (temp int)
+0:63      Function Call: foo2(d1;f1; (global void)
+0:63        Convert uint to double (temp double)
+0:63          'u' (temp uint)
+0:63        'f' (temp float)
+0:65      Function Call: foo2(d1;d1; (global void)
+0:65        Convert int to double (temp double)
+0:65          'i' (temp int)
+0:65        'd' (temp double)
+0:66      Function Call: foo2(d1;f1; (global void)
+0:66        Convert int to double (temp double)
+0:66          'i' (temp int)
+0:66        Convert uint to float (temp float)
+0:66          'u' (temp uint)
+0:67      Function Call: foo2(d1;f1; (global void)
+0:67        Convert int to double (temp double)
+0:67          'i' (temp int)
+0:67        Convert int to float (temp float)
+0:67          'i' (temp int)
+0:68      Function Call: foo2(d1;f1; (global void)
+0:68        Convert int to double (temp double)
+0:68          'i' (temp int)
+0:68        'f' (temp float)
+0:70      Constant:
+0:70        0.000000
+0:71      Function Call: foo3(d1;f1; (global void)
+0:71        'd' (temp double)
+0:71        Convert uint to float (temp float)
+0:71          'u' (temp uint)
+0:72      Function Call: foo3(d1;f1; (global void)
+0:72        'd' (temp double)
+0:72        Convert int to float (temp float)
+0:72          'i' (temp int)
+0:73      Function Call: foo3(d1;f1; (global void)
+0:73        'd' (temp double)
+0:73        'f' (temp float)
+0:75      Function Call: foo3(f1;d1; (global void)
+0:75        'f' (temp float)
+0:75        'd' (temp double)
+0:76      Function Call: foo3(d1;f1; (global void)
+0:76        Convert float to double (temp double)
+0:76          'f' (temp float)
+0:76        Convert uint to float (temp float)
+0:76          'u' (temp uint)
+0:77      Function Call: foo3(d1;f1; (global void)
+0:77        Convert float to double (temp double)
+0:77          'f' (temp float)
+0:77        Convert int to float (temp float)
+0:77          'i' (temp int)
+0:78      Function Call: foo3(d1;f1; (global void)
+0:78        Convert float to double (temp double)
+0:78          'f' (temp float)
+0:78        'f' (temp float)
+0:80      Function Call: foo3(f1;d1; (global void)
+0:80        Convert uint to float (temp float)
+0:80          'u' (temp uint)
+0:80        'd' (temp double)
+0:81      Function Call: foo3(d1;f1; (global void)
+0:81        Convert uint to double (temp double)
+0:81          'u' (temp uint)
+0:81        Convert uint to float (temp float)
+0:81          'u' (temp uint)
+0:82      Function Call: foo3(d1;f1; (global void)
+0:82        Convert uint to double (temp double)
+0:82          'u' (temp uint)
+0:82        Convert int to float (temp float)
+0:82          'i' (temp int)
+0:83      Function Call: foo3(d1;f1; (global void)
+0:83        Convert uint to double (temp double)
+0:83          'u' (temp uint)
+0:83        'f' (temp float)
+0:85      Function Call: foo3(f1;d1; (global void)
+0:85        Convert int to float (temp float)
+0:85          'i' (temp int)
+0:85        'd' (temp double)
+0:86      Function Call: foo3(d1;f1; (global void)
+0:86        Convert int to double (temp double)
+0:86          'i' (temp int)
+0:86        Convert uint to float (temp float)
+0:86          'u' (temp uint)
+0:87      Function Call: foo3(d1;f1; (global void)
+0:87        Convert int to double (temp double)
+0:87          'i' (temp int)
+0:87        Convert int to float (temp float)
+0:87          'i' (temp int)
+0:88      Function Call: foo3(d1;f1; (global void)
+0:88        Convert int to double (temp double)
+0:88          'i' (temp int)
+0:88        'f' (temp float)
+0:90      Function Call: ftd(i1;f1;d1; (global void)
+0:90        'i' (temp int)
+0:90        'f' (temp float)
+0:90        Convert float to double (temp double)
+0:90          'f' (temp float)
+0:91      Function Call: ftd(u1;f1;d1; (global void)
+0:91        'u' (temp uint)
+0:91        'f' (temp float)
+0:91        Convert float to double (temp double)
+0:91          'f' (temp float)
+0:97  Function Definition: tf( (global void)
+0:97    Function Parameters: 
+0:?     Sequence
+0:104      Function Call: itf(i1;f1;i1; (global void)
+0:104        'i' (temp int)
+0:104        Convert int to float (temp float)
+0:104          'i' (temp int)
+0:104        'i' (temp int)
+0:105      Function Call: itf(i1;f1;i1; (global void)
+0:105        'i' (temp int)
+0:105        Convert uint to float (temp float)
+0:105          'u' (temp uint)
+0:105        'i' (temp int)
 0:?   Linker Objects
 0:?     'd' (in double)
 0:?     'd3' (in 3-component vector of double)
@@ -23,8 +298,273 @@
 
 Shader version: 400
 ERROR: node is still EOpNull!
-0:7  Function Definition: main( (global void)
-0:7    Function Parameters: 
+0:8  Function Definition: foo1(d1;u1; (global void)
+0:8    Function Parameters: 
+0:8      'a' (in double)
+0:8      'b' (in uint)
+0:9  Function Definition: foo1(d1;i1; (global void)
+0:9    Function Parameters: 
+0:9      'a' (in double)
+0:9      'b' (in int)
+0:10  Function Definition: foo1(d1;f1; (global void)
+0:10    Function Parameters: 
+0:10      'a' (in double)
+0:10      'b' (in float)
+0:11  Function Definition: foo1(d1;d1; (global void)
+0:11    Function Parameters: 
+0:11      'a' (in double)
+0:11      'b' (in double)
+0:13  Function Definition: foo2(d1;f1; (global void)
+0:13    Function Parameters: 
+0:13      'a' (in double)
+0:13      'b' (in float)
+0:14  Function Definition: foo2(d1;d1; (global void)
+0:14    Function Parameters: 
+0:14      'a' (in double)
+0:14      'b' (in double)
+0:16  Function Definition: foo3(d1;f1; (global void)
+0:16    Function Parameters: 
+0:16      'a' (in double)
+0:16      'b' (in float)
+0:17  Function Definition: foo3(f1;d1; (global void)
+0:17    Function Parameters: 
+0:17      'a' (in float)
+0:17      'b' (in double)
+0:19  Function Definition: ftd(i1;f1;d1; (global void)
+0:19    Function Parameters: 
+0:19      '' (in int)
+0:19      '' (in float)
+0:19      '' (in double)
+0:20  Function Definition: ftd(u1;f1;d1; (global void)
+0:20    Function Parameters: 
+0:20      '' (in uint)
+0:20      '' (in float)
+0:20      '' (in double)
+0:21  Function Definition: ftd(f1;d1;d1; (global void)
+0:21    Function Parameters: 
+0:21      '' (in float)
+0:21      '' (in double)
+0:21      '' (in double)
+0:23  Function Definition: main( (global void)
+0:23    Function Parameters: 
+0:?     Sequence
+0:30      Function Call: foo1(d1;d1; (global void)
+0:30        'd' (temp double)
+0:30        'd' (temp double)
+0:31      Function Call: foo1(d1;u1; (global void)
+0:31        'd' (temp double)
+0:31        'u' (temp uint)
+0:32      Function Call: foo1(d1;i1; (global void)
+0:32        'd' (temp double)
+0:32        'i' (temp int)
+0:33      Function Call: foo1(d1;f1; (global void)
+0:33        'd' (temp double)
+0:33        'f' (temp float)
+0:35      Function Call: foo1(d1;d1; (global void)
+0:35        Convert float to double (temp double)
+0:35          'f' (temp float)
+0:35        'd' (temp double)
+0:36      Function Call: foo1(d1;u1; (global void)
+0:36        Convert float to double (temp double)
+0:36          'f' (temp float)
+0:36        'u' (temp uint)
+0:37      Function Call: foo1(d1;i1; (global void)
+0:37        Convert float to double (temp double)
+0:37          'f' (temp float)
+0:37        'i' (temp int)
+0:38      Function Call: foo1(d1;f1; (global void)
+0:38        Convert float to double (temp double)
+0:38          'f' (temp float)
+0:38        'f' (temp float)
+0:40      Function Call: foo1(d1;d1; (global void)
+0:40        Convert uint to double (temp double)
+0:40          'u' (temp uint)
+0:40        'd' (temp double)
+0:41      Function Call: foo1(d1;u1; (global void)
+0:41        Convert uint to double (temp double)
+0:41          'u' (temp uint)
+0:41        'u' (temp uint)
+0:42      Function Call: foo1(d1;i1; (global void)
+0:42        Convert uint to double (temp double)
+0:42          'u' (temp uint)
+0:42        'i' (temp int)
+0:43      Function Call: foo1(d1;f1; (global void)
+0:43        Convert uint to double (temp double)
+0:43          'u' (temp uint)
+0:43        'f' (temp float)
+0:45      Function Call: foo1(d1;d1; (global void)
+0:45        Convert int to double (temp double)
+0:45          'i' (temp int)
+0:45        'd' (temp double)
+0:46      Function Call: foo1(d1;u1; (global void)
+0:46        Convert int to double (temp double)
+0:46          'i' (temp int)
+0:46        'u' (temp uint)
+0:47      Function Call: foo1(d1;i1; (global void)
+0:47        Convert int to double (temp double)
+0:47          'i' (temp int)
+0:47        'i' (temp int)
+0:48      Function Call: foo1(d1;f1; (global void)
+0:48        Convert int to double (temp double)
+0:48          'i' (temp int)
+0:48        'f' (temp float)
+0:50      Function Call: foo2(d1;d1; (global void)
+0:50        'd' (temp double)
+0:50        'd' (temp double)
+0:51      Function Call: foo2(d1;f1; (global void)
+0:51        'd' (temp double)
+0:51        Convert uint to float (temp float)
+0:51          'u' (temp uint)
+0:52      Function Call: foo2(d1;f1; (global void)
+0:52        'd' (temp double)
+0:52        Convert int to float (temp float)
+0:52          'i' (temp int)
+0:53      Function Call: foo2(d1;f1; (global void)
+0:53        'd' (temp double)
+0:53        'f' (temp float)
+0:55      Function Call: foo2(d1;d1; (global void)
+0:55        Convert float to double (temp double)
+0:55          'f' (temp float)
+0:55        'd' (temp double)
+0:56      Function Call: foo2(d1;f1; (global void)
+0:56        Convert float to double (temp double)
+0:56          'f' (temp float)
+0:56        Convert uint to float (temp float)
+0:56          'u' (temp uint)
+0:57      Function Call: foo2(d1;f1; (global void)
+0:57        Convert float to double (temp double)
+0:57          'f' (temp float)
+0:57        Convert int to float (temp float)
+0:57          'i' (temp int)
+0:58      Function Call: foo2(d1;f1; (global void)
+0:58        Convert float to double (temp double)
+0:58          'f' (temp float)
+0:58        'f' (temp float)
+0:60      Function Call: foo2(d1;d1; (global void)
+0:60        Convert uint to double (temp double)
+0:60          'u' (temp uint)
+0:60        'd' (temp double)
+0:61      Function Call: foo2(d1;f1; (global void)
+0:61        Convert uint to double (temp double)
+0:61          'u' (temp uint)
+0:61        Convert uint to float (temp float)
+0:61          'u' (temp uint)
+0:62      Function Call: foo2(d1;f1; (global void)
+0:62        Convert uint to double (temp double)
+0:62          'u' (temp uint)
+0:62        Convert int to float (temp float)
+0:62          'i' (temp int)
+0:63      Function Call: foo2(d1;f1; (global void)
+0:63        Convert uint to double (temp double)
+0:63          'u' (temp uint)
+0:63        'f' (temp float)
+0:65      Function Call: foo2(d1;d1; (global void)
+0:65        Convert int to double (temp double)
+0:65          'i' (temp int)
+0:65        'd' (temp double)
+0:66      Function Call: foo2(d1;f1; (global void)
+0:66        Convert int to double (temp double)
+0:66          'i' (temp int)
+0:66        Convert uint to float (temp float)
+0:66          'u' (temp uint)
+0:67      Function Call: foo2(d1;f1; (global void)
+0:67        Convert int to double (temp double)
+0:67          'i' (temp int)
+0:67        Convert int to float (temp float)
+0:67          'i' (temp int)
+0:68      Function Call: foo2(d1;f1; (global void)
+0:68        Convert int to double (temp double)
+0:68          'i' (temp int)
+0:68        'f' (temp float)
+0:70      Constant:
+0:70        0.000000
+0:71      Function Call: foo3(d1;f1; (global void)
+0:71        'd' (temp double)
+0:71        Convert uint to float (temp float)
+0:71          'u' (temp uint)
+0:72      Function Call: foo3(d1;f1; (global void)
+0:72        'd' (temp double)
+0:72        Convert int to float (temp float)
+0:72          'i' (temp int)
+0:73      Function Call: foo3(d1;f1; (global void)
+0:73        'd' (temp double)
+0:73        'f' (temp float)
+0:75      Function Call: foo3(f1;d1; (global void)
+0:75        'f' (temp float)
+0:75        'd' (temp double)
+0:76      Function Call: foo3(d1;f1; (global void)
+0:76        Convert float to double (temp double)
+0:76          'f' (temp float)
+0:76        Convert uint to float (temp float)
+0:76          'u' (temp uint)
+0:77      Function Call: foo3(d1;f1; (global void)
+0:77        Convert float to double (temp double)
+0:77          'f' (temp float)
+0:77        Convert int to float (temp float)
+0:77          'i' (temp int)
+0:78      Function Call: foo3(d1;f1; (global void)
+0:78        Convert float to double (temp double)
+0:78          'f' (temp float)
+0:78        'f' (temp float)
+0:80      Function Call: foo3(f1;d1; (global void)
+0:80        Convert uint to float (temp float)
+0:80          'u' (temp uint)
+0:80        'd' (temp double)
+0:81      Function Call: foo3(d1;f1; (global void)
+0:81        Convert uint to double (temp double)
+0:81          'u' (temp uint)
+0:81        Convert uint to float (temp float)
+0:81          'u' (temp uint)
+0:82      Function Call: foo3(d1;f1; (global void)
+0:82        Convert uint to double (temp double)
+0:82          'u' (temp uint)
+0:82        Convert int to float (temp float)
+0:82          'i' (temp int)
+0:83      Function Call: foo3(d1;f1; (global void)
+0:83        Convert uint to double (temp double)
+0:83          'u' (temp uint)
+0:83        'f' (temp float)
+0:85      Function Call: foo3(f1;d1; (global void)
+0:85        Convert int to float (temp float)
+0:85          'i' (temp int)
+0:85        'd' (temp double)
+0:86      Function Call: foo3(d1;f1; (global void)
+0:86        Convert int to double (temp double)
+0:86          'i' (temp int)
+0:86        Convert uint to float (temp float)
+0:86          'u' (temp uint)
+0:87      Function Call: foo3(d1;f1; (global void)
+0:87        Convert int to double (temp double)
+0:87          'i' (temp int)
+0:87        Convert int to float (temp float)
+0:87          'i' (temp int)
+0:88      Function Call: foo3(d1;f1; (global void)
+0:88        Convert int to double (temp double)
+0:88          'i' (temp int)
+0:88        'f' (temp float)
+0:90      Function Call: ftd(i1;f1;d1; (global void)
+0:90        'i' (temp int)
+0:90        'f' (temp float)
+0:90        Convert float to double (temp double)
+0:90          'f' (temp float)
+0:91      Function Call: ftd(u1;f1;d1; (global void)
+0:91        'u' (temp uint)
+0:91        'f' (temp float)
+0:91        Convert float to double (temp double)
+0:91          'f' (temp float)
+0:97  Function Definition: tf( (global void)
+0:97    Function Parameters: 
+0:?     Sequence
+0:104      Function Call: itf(i1;f1;i1; (global void)
+0:104        'i' (temp int)
+0:104        Convert int to float (temp float)
+0:104          'i' (temp int)
+0:104        'i' (temp int)
+0:105      Function Call: itf(i1;f1;i1; (global void)
+0:105        'i' (temp int)
+0:105        Convert uint to float (temp float)
+0:105          'u' (temp uint)
+0:105        'i' (temp int)
 0:?   Linker Objects
 0:?     'd' (in double)
 0:?     'd3' (in 3-component vector of double)
diff --git a/Test/baseResults/420.geom.out b/Test/baseResults/420.geom.out
index 416df13..625feea 100644
--- a/Test/baseResults/420.geom.out
+++ b/Test/baseResults/420.geom.out
@@ -132,7 +132,7 @@
 
 Linked geometry stage:
 
-ERROR: Linking geometry stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking geometry stage: Missing entry point: Each stage requires one entry point
 ERROR: Linking geometry stage: At least one shader must specify an output layout primitive
 ERROR: Linking geometry stage: At least one shader must specify a layout(max_vertices = value)
 
diff --git a/Test/baseResults/420_size_gl_in.geom.out b/Test/baseResults/420_size_gl_in.geom.out
index 21d1944..28d09a6 100644
--- a/Test/baseResults/420_size_gl_in.geom.out
+++ b/Test/baseResults/420_size_gl_in.geom.out
@@ -39,7 +39,7 @@
 
 Linked geometry stage:
 
-ERROR: Linking geometry stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking geometry stage: Missing entry point: Each stage requires one entry point
 ERROR: Linking geometry stage: At least one shader must specify an output layout primitive
 ERROR: Linking geometry stage: At least one shader must specify a layout(max_vertices = value)
 
diff --git a/Test/baseResults/430.vert.out b/Test/baseResults/430.vert.out
index 4b7825b..676fcd3 100644
--- a/Test/baseResults/430.vert.out
+++ b/Test/baseResults/430.vert.out
@@ -266,7 +266,7 @@
 
 Linked vertex stage:
 
-ERROR: Linking vertex stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
 ERROR: Linking vertex stage: xfb_stride is too small to hold all buffer entries:
 ERROR:     xfb_buffer 3, xfb_stride 64, minimum stride needed: 80
 
diff --git a/Test/baseResults/440.frag.out b/Test/baseResults/440.frag.out
index cafd85a..064fe19 100644
--- a/Test/baseResults/440.frag.out
+++ b/Test/baseResults/440.frag.out
@@ -122,7 +122,7 @@
 
 Linked fragment stage:
 
-ERROR: Linking fragment stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
 
 Shader version: 440
 ERROR: node is still EOpNull!
diff --git a/Test/baseResults/440.vert.out b/Test/baseResults/440.vert.out
index d4cbb0b..022ddec 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})
@@ -156,7 +160,7 @@
 
 Linked vertex stage:
 
-ERROR: Linking vertex stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
 ERROR: Linking vertex stage: xfb_stride is too small to hold all buffer entries:
 ERROR:     xfb_buffer 0, xfb_stride 92, minimum stride needed: 96
 ERROR: Linking vertex stage: xfb_stride must be multiple of 8 for buffer holding a double:
@@ -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/450.comp.out b/Test/baseResults/450.comp.out
index d5d1eca..203c4b2 100644
--- a/Test/baseResults/450.comp.out
+++ b/Test/baseResults/450.comp.out
@@ -9,7 +9,7 @@
 
 Linked compute stage:
 
-ERROR: Linking compute stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking compute stage: Missing entry point: Each stage requires one entry point
 
 Shader version: 450
 local_size = (1, 1, 1)
diff --git a/Test/baseResults/badChars.frag.out b/Test/baseResults/badChars.frag.out
index 37af287..a29b22f 100644
--- a/Test/baseResults/badChars.frag.out
+++ b/Test/baseResults/badChars.frag.out
@@ -17,7 +17,7 @@
 
 Linked fragment stage:
 
-ERROR: Linking fragment stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
 
 Shader version: 100
 ERROR: node is still EOpNull!
diff --git a/Test/baseResults/badMacroArgs.frag.out b/Test/baseResults/badMacroArgs.frag.out
index 6a46a0f..95937ce 100644
--- a/Test/baseResults/badMacroArgs.frag.out
+++ b/Test/baseResults/badMacroArgs.frag.out
@@ -1,7 +1,7 @@
 badMacroArgs.frag
 Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:4: 'macro expansion' : Too few args in Macro m
-ERROR: 0:4: '' :  syntax error
+ERROR: 0:4: '' : compilation terminated 
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/Test/baseResults/cppBad.vert.out b/Test/baseResults/cppBad.vert.out
index 6938af6..1fb18ec 100755
--- a/Test/baseResults/cppBad.vert.out
+++ b/Test/baseResults/cppBad.vert.out
@@ -14,7 +14,7 @@
 
 Linked vertex stage:
 
-ERROR: Linking vertex stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
 
 Shader version: 100
 ERROR: node is still EOpNull!
diff --git a/Test/baseResults/cppNest.vert.out b/Test/baseResults/cppNest.vert.out
index 4f95f5a..df90557 100644
--- a/Test/baseResults/cppNest.vert.out
+++ b/Test/baseResults/cppNest.vert.out
@@ -4,7 +4,7 @@
 ERROR: 0:161: '#elif' : #elif after #else 
 ERROR: 0:169: '#else' : #else after #else 
 ERROR: 0:177: 'macro expansion' : End of input in macro FUNC
-ERROR: 0:178: '' :  syntax error
+ERROR: 0:178: '' : compilation terminated 
 ERROR: 6 compilation errors.  No code generated.
 
 
diff --git a/Test/baseResults/dce.frag.out b/Test/baseResults/dce.frag.out
index a19fe4e..2846abd 100644
--- a/Test/baseResults/dce.frag.out
+++ b/Test/baseResults/dce.frag.out
@@ -138,7 +138,7 @@
 
 Linked fragment stage:
 
-ERROR: Linking fragment stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
 
 Shader version: 400
 0:? Sequence
diff --git a/Test/baseResults/errors.frag.out b/Test/baseResults/errors.frag.out
index f1e06d2..23f6631 100644
--- a/Test/baseResults/errors.frag.out
+++ b/Test/baseResults/errors.frag.out
@@ -1,6 +1,6 @@
 errors.frag
 ERROR: 0:1: 'main' : function cannot take any parameter(s) 
-ERROR: 0:1: 'int' :  main function cannot return a value
+ERROR: 0:1: 'int' :  entry point cannot return a value
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/Test/baseResults/hlsl.array.frag.out b/Test/baseResults/hlsl.array.frag.out
index abc7ebb..359f62f 100755
--- a/Test/baseResults/hlsl.array.frag.out
+++ b/Test/baseResults/hlsl.array.frag.out
@@ -2,50 +2,56 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:11  Function Definition: PixelShaderFunction(i1;vf4[3]; (global 4-component vector of float)
+0:8  Function Definition: PixelShaderFunction(i1;vf4[3]; (global 4-component vector of float)
 0:8    Function Parameters: 
-0:8      'i' (in int)
-0:8      'input' (in 3-element array of 4-component vector of float)
+0:8      'i' (layout(location=0 ) in int)
+0:8      'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
 0:?     Sequence
-0:10      Branch: Return with expression
-0:10        add (temp 4-component vector of float)
+0:10      Sequence
+0:10        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:10          add (temp 4-component vector of float)
 0:10            add (temp 4-component vector of float)
 0:10              add (temp 4-component vector of float)
 0:10                add (temp 4-component vector of float)
 0:10                  add (temp 4-component vector of float)
-0:10                    direct index (temp 4-component vector of float)
-0:10                      'a' (global 4-element array of 4-component vector of float)
+0:10                    add (temp 4-component vector of float)
+0:10                      direct index (temp 4-component vector of float)
+0:10                        'a' (global 4-element array of 4-component vector of float)
+0:10                        Constant:
+0:10                          1 (const int)
+0:10                      indirect index (temp 4-component vector of float)
+0:10                        'a' (global 4-element array of 4-component vector of float)
+0:10                        'i' (layout(location=0 ) in int)
+0:10                    direct index (layout(location=1 ) temp 4-component vector of float)
+0:10                      'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
 0:10                      Constant:
-0:10                        1 (const int)
-0:10                    indirect index (temp 4-component vector of float)
-0:10                      'a' (global 4-element array of 4-component vector of float)
-0:10                      'i' (in int)
-0:10                  direct index (temp 4-component vector of float)
-0:10                    'input' (in 3-element array of 4-component vector of float)
-0:10                    Constant:
-0:10                      2 (const int)
-0:10                indirect index (temp 4-component vector of float)
-0:10                  'input' (in 3-element array of 4-component vector of float)
-0:10                  'i' (in int)
-0:10              direct index (temp 4-component vector of float)
+0:10                        2 (const int)
+0:10                  indirect index (layout(location=1 ) temp 4-component vector of float)
+0:10                    'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
+0:10                    'i' (layout(location=0 ) in int)
+0:10                direct index (temp 4-component vector of float)
+0:10                  'b' (temp 10-element array of 4-component vector of float)
+0:10                  Constant:
+0:10                    5 (const int)
+0:10              indirect index (temp 4-component vector of float)
 0:10                'b' (temp 10-element array of 4-component vector of float)
-0:10                Constant:
-0:10                  5 (const int)
+0:10                'i' (layout(location=0 ) in int)
 0:10            indirect index (temp 4-component vector of float)
-0:10              'b' (temp 10-element array of 4-component vector of float)
-0:10              'i' (in int)
-0:10          indirect index (temp 4-component vector of float)
-0:10            m: direct index for structure (temp 7-element array of 4-component vector of float)
-0:10              indirect index (temp structure{temp 7-element array of 4-component vector of float m})
-0:10                's' (global 11-element array of structure{temp 7-element array of 4-component vector of float m})
-0:10                'i' (in int)
-0:10              Constant:
-0:10                0 (const int)
-0:10            'i' (in int)
+0:10              m: direct index for structure (temp 7-element array of 4-component vector of float)
+0:10                indirect index (temp structure{temp 7-element array of 4-component vector of float m})
+0:10                  's' (global 11-element array of structure{temp 7-element array of 4-component vector of float m})
+0:10                  'i' (layout(location=0 ) in int)
+0:10                Constant:
+0:10                  0 (const int)
+0:10              'i' (layout(location=0 ) in int)
+0:10        Branch: Return
 0:?   Linker Objects
 0:?     'a' (global 4-element array of 4-component vector of float)
 0:?     's' (global 11-element array of structure{temp 7-element array of 4-component vector of float m})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'i' (layout(location=0 ) in int)
+0:?     'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
 
 
 Linked fragment stage:
@@ -54,129 +60,141 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:11  Function Definition: PixelShaderFunction(i1;vf4[3]; (global 4-component vector of float)
+0:8  Function Definition: PixelShaderFunction(i1;vf4[3]; (global 4-component vector of float)
 0:8    Function Parameters: 
-0:8      'i' (in int)
-0:8      'input' (in 3-element array of 4-component vector of float)
+0:8      'i' (layout(location=0 ) in int)
+0:8      'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
 0:?     Sequence
-0:10      Branch: Return with expression
-0:10        add (temp 4-component vector of float)
+0:10      Sequence
+0:10        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:10          add (temp 4-component vector of float)
 0:10            add (temp 4-component vector of float)
 0:10              add (temp 4-component vector of float)
 0:10                add (temp 4-component vector of float)
 0:10                  add (temp 4-component vector of float)
-0:10                    direct index (temp 4-component vector of float)
-0:10                      'a' (global 4-element array of 4-component vector of float)
+0:10                    add (temp 4-component vector of float)
+0:10                      direct index (temp 4-component vector of float)
+0:10                        'a' (global 4-element array of 4-component vector of float)
+0:10                        Constant:
+0:10                          1 (const int)
+0:10                      indirect index (temp 4-component vector of float)
+0:10                        'a' (global 4-element array of 4-component vector of float)
+0:10                        'i' (layout(location=0 ) in int)
+0:10                    direct index (layout(location=1 ) temp 4-component vector of float)
+0:10                      'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
 0:10                      Constant:
-0:10                        1 (const int)
-0:10                    indirect index (temp 4-component vector of float)
-0:10                      'a' (global 4-element array of 4-component vector of float)
-0:10                      'i' (in int)
-0:10                  direct index (temp 4-component vector of float)
-0:10                    'input' (in 3-element array of 4-component vector of float)
-0:10                    Constant:
-0:10                      2 (const int)
-0:10                indirect index (temp 4-component vector of float)
-0:10                  'input' (in 3-element array of 4-component vector of float)
-0:10                  'i' (in int)
-0:10              direct index (temp 4-component vector of float)
+0:10                        2 (const int)
+0:10                  indirect index (layout(location=1 ) temp 4-component vector of float)
+0:10                    'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
+0:10                    'i' (layout(location=0 ) in int)
+0:10                direct index (temp 4-component vector of float)
+0:10                  'b' (temp 10-element array of 4-component vector of float)
+0:10                  Constant:
+0:10                    5 (const int)
+0:10              indirect index (temp 4-component vector of float)
 0:10                'b' (temp 10-element array of 4-component vector of float)
-0:10                Constant:
-0:10                  5 (const int)
+0:10                'i' (layout(location=0 ) in int)
 0:10            indirect index (temp 4-component vector of float)
-0:10              'b' (temp 10-element array of 4-component vector of float)
-0:10              'i' (in int)
-0:10          indirect index (temp 4-component vector of float)
-0:10            m: direct index for structure (temp 7-element array of 4-component vector of float)
-0:10              indirect index (temp structure{temp 7-element array of 4-component vector of float m})
-0:10                's' (global 11-element array of structure{temp 7-element array of 4-component vector of float m})
-0:10                'i' (in int)
-0:10              Constant:
-0:10                0 (const int)
-0:10            'i' (in int)
+0:10              m: direct index for structure (temp 7-element array of 4-component vector of float)
+0:10                indirect index (temp structure{temp 7-element array of 4-component vector of float m})
+0:10                  's' (global 11-element array of structure{temp 7-element array of 4-component vector of float m})
+0:10                  'i' (layout(location=0 ) in int)
+0:10                Constant:
+0:10                  0 (const int)
+0:10              'i' (layout(location=0 ) in int)
+0:10        Branch: Return
 0:?   Linker Objects
 0:?     'a' (global 4-element array of 4-component vector of float)
 0:?     's' (global 11-element array of structure{temp 7-element array of 4-component vector of float m})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'i' (layout(location=0 ) in int)
+0:?     'input' (layout(location=1 ) in 3-element array of 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 64
+// Id's are bound by 66
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 19 27
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 21 29
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 12  "a"
-                              Name 19  "i"
-                              Name 27  "input"
-                              Name 40  "b"
-                              Name 52  ""
-                              MemberName 52 0  "m"
-                              Name 56  "s"
+                              Name 9  "@entryPointOutput"
+                              Name 14  "a"
+                              Name 21  "i"
+                              Name 29  "input"
+                              Name 42  "b"
+                              Name 54  ""
+                              MemberName 54 0  "m"
+                              Name 58  "s"
+                              Decorate 9(@entryPointOutput) Location 0
+                              Decorate 21(i) Location 0
+                              Decorate 29(input) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypeInt 32 0
-               9:      8(int) Constant 4
-              10:             TypeArray 7(fvec4) 9
-              11:             TypePointer Private 10
-           12(a):     11(ptr) Variable Private
-              13:             TypeInt 32 1
-              14:     13(int) Constant 1
-              15:             TypePointer Private 7(fvec4)
-              18:             TypePointer Input 13(int)
-           19(i):     18(ptr) Variable Input
-              24:      8(int) Constant 3
-              25:             TypeArray 7(fvec4) 24
-              26:             TypePointer Input 25
-       27(input):     26(ptr) Variable Input
-              28:     13(int) Constant 2
-              29:             TypePointer Input 7(fvec4)
-              37:      8(int) Constant 10
-              38:             TypeArray 7(fvec4) 37
-              39:             TypePointer Function 38
-              41:     13(int) Constant 5
-              42:             TypePointer Function 7(fvec4)
-              50:      8(int) Constant 7
-              51:             TypeArray 7(fvec4) 50
-              52:             TypeStruct 51
-              53:      8(int) Constant 11
-              54:             TypeArray 52(struct) 53
-              55:             TypePointer Private 54
-           56(s):     55(ptr) Variable Private
-              58:     13(int) Constant 0
+               8:             TypePointer Output 7(fvec4)
+9(@entryPointOutput):      8(ptr) Variable Output
+              10:             TypeInt 32 0
+              11:     10(int) Constant 4
+              12:             TypeArray 7(fvec4) 11
+              13:             TypePointer Private 12
+           14(a):     13(ptr) Variable Private
+              15:             TypeInt 32 1
+              16:     15(int) Constant 1
+              17:             TypePointer Private 7(fvec4)
+              20:             TypePointer Input 15(int)
+           21(i):     20(ptr) Variable Input
+              26:     10(int) Constant 3
+              27:             TypeArray 7(fvec4) 26
+              28:             TypePointer Input 27
+       29(input):     28(ptr) Variable Input
+              30:     15(int) Constant 2
+              31:             TypePointer Input 7(fvec4)
+              39:     10(int) Constant 10
+              40:             TypeArray 7(fvec4) 39
+              41:             TypePointer Function 40
+              43:     15(int) Constant 5
+              44:             TypePointer Function 7(fvec4)
+              52:     10(int) Constant 7
+              53:             TypeArray 7(fvec4) 52
+              54:             TypeStruct 53
+              55:     10(int) Constant 11
+              56:             TypeArray 54(struct) 55
+              57:             TypePointer Private 56
+           58(s):     57(ptr) Variable Private
+              60:     15(int) Constant 0
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-           40(b):     39(ptr) Variable Function
-              16:     15(ptr) AccessChain 12(a) 14
-              17:    7(fvec4) Load 16
-              20:     13(int) Load 19(i)
-              21:     15(ptr) AccessChain 12(a) 20
-              22:    7(fvec4) Load 21
-              23:    7(fvec4) FAdd 17 22
-              30:     29(ptr) AccessChain 27(input) 28
-              31:    7(fvec4) Load 30
-              32:    7(fvec4) FAdd 23 31
-              33:     13(int) Load 19(i)
-              34:     29(ptr) AccessChain 27(input) 33
-              35:    7(fvec4) Load 34
-              36:    7(fvec4) FAdd 32 35
-              43:     42(ptr) AccessChain 40(b) 41
-              44:    7(fvec4) Load 43
-              45:    7(fvec4) FAdd 36 44
-              46:     13(int) Load 19(i)
-              47:     42(ptr) AccessChain 40(b) 46
-              48:    7(fvec4) Load 47
-              49:    7(fvec4) FAdd 45 48
-              57:     13(int) Load 19(i)
-              59:     13(int) Load 19(i)
-              60:     15(ptr) AccessChain 56(s) 57 58 59
-              61:    7(fvec4) Load 60
-              62:    7(fvec4) FAdd 49 61
-                              ReturnValue 62
+           42(b):     41(ptr) Variable Function
+              18:     17(ptr) AccessChain 14(a) 16
+              19:    7(fvec4) Load 18
+              22:     15(int) Load 21(i)
+              23:     17(ptr) AccessChain 14(a) 22
+              24:    7(fvec4) Load 23
+              25:    7(fvec4) FAdd 19 24
+              32:     31(ptr) AccessChain 29(input) 30
+              33:    7(fvec4) Load 32
+              34:    7(fvec4) FAdd 25 33
+              35:     15(int) Load 21(i)
+              36:     31(ptr) AccessChain 29(input) 35
+              37:    7(fvec4) Load 36
+              38:    7(fvec4) FAdd 34 37
+              45:     44(ptr) AccessChain 42(b) 43
+              46:    7(fvec4) Load 45
+              47:    7(fvec4) FAdd 38 46
+              48:     15(int) Load 21(i)
+              49:     44(ptr) AccessChain 42(b) 48
+              50:    7(fvec4) Load 49
+              51:    7(fvec4) FAdd 47 50
+              59:     15(int) Load 21(i)
+              61:     15(int) Load 21(i)
+              62:     17(ptr) AccessChain 58(s) 59 60 61
+              63:    7(fvec4) Load 62
+              64:    7(fvec4) FAdd 51 63
+                              Store 9(@entryPointOutput) 64
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.assoc.frag.out b/Test/baseResults/hlsl.assoc.frag.out
index 89eea72..d54d467 100755
--- a/Test/baseResults/hlsl.assoc.frag.out
+++ b/Test/baseResults/hlsl.assoc.frag.out
@@ -2,34 +2,43 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:12  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4;vf4; (global 4-component vector of float)
+0:8  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4;vf4; (global 4-component vector of float)
 0:8    Function Parameters: 
-0:8      'a1' (in 4-component vector of float)
-0:8      'a2' (in 4-component vector of float)
-0:8      'a3' (in 4-component vector of float)
-0:8      'a4' (in 4-component vector of float)
-0:8      'a5' (in 4-component vector of float)
+0:8      'a1' (layout(location=0 ) in 4-component vector of float)
+0:8      'a2' (layout(location=1 ) in 4-component vector of float)
+0:8      'a3' (layout(location=2 ) in 4-component vector of float)
+0:8      'a4' (layout(location=3 ) in 4-component vector of float)
+0:8      'a5' (layout(location=4 ) in 4-component vector of float)
 0:?     Sequence
 0:9      move second child to first child (temp 4-component vector of float)
-0:9        'a1' (in 4-component vector of float)
+0:9        'a1' (layout(location=0 ) in 4-component vector of float)
 0:9        move second child to first child (temp 4-component vector of float)
-0:9          'a2' (in 4-component vector of float)
+0:9          'a2' (layout(location=1 ) in 4-component vector of float)
 0:9          move second child to first child (temp 4-component vector of float)
-0:9            'a3' (in 4-component vector of float)
+0:9            'a3' (layout(location=2 ) in 4-component vector of float)
 0:9            move second child to first child (temp 4-component vector of float)
-0:9              'a4' (in 4-component vector of float)
-0:9              'a5' (in 4-component vector of float)
-0:10      Branch: Return with expression
-0:10        add (temp 4-component vector of float)
+0:9              'a4' (layout(location=3 ) in 4-component vector of float)
+0:9              'a5' (layout(location=4 ) in 4-component vector of float)
+0:10      Sequence
+0:10        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:10          add (temp 4-component vector of float)
 0:10            add (temp 4-component vector of float)
 0:10              add (temp 4-component vector of float)
-0:10                'a1' (in 4-component vector of float)
-0:10                'a2' (in 4-component vector of float)
-0:10              'a3' (in 4-component vector of float)
-0:10            'a4' (in 4-component vector of float)
-0:10          'a5' (in 4-component vector of float)
+0:10                add (temp 4-component vector of float)
+0:10                  'a1' (layout(location=0 ) in 4-component vector of float)
+0:10                  'a2' (layout(location=1 ) in 4-component vector of float)
+0:10                'a3' (layout(location=2 ) in 4-component vector of float)
+0:10              'a4' (layout(location=3 ) in 4-component vector of float)
+0:10            'a5' (layout(location=4 ) in 4-component vector of float)
+0:10        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'a1' (layout(location=0 ) in 4-component vector of float)
+0:?     'a2' (layout(location=1 ) in 4-component vector of float)
+0:?     'a3' (layout(location=2 ) in 4-component vector of float)
+0:?     'a4' (layout(location=3 ) in 4-component vector of float)
+0:?     'a5' (layout(location=4 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -38,51 +47,66 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:12  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4;vf4; (global 4-component vector of float)
+0:8  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4;vf4; (global 4-component vector of float)
 0:8    Function Parameters: 
-0:8      'a1' (in 4-component vector of float)
-0:8      'a2' (in 4-component vector of float)
-0:8      'a3' (in 4-component vector of float)
-0:8      'a4' (in 4-component vector of float)
-0:8      'a5' (in 4-component vector of float)
+0:8      'a1' (layout(location=0 ) in 4-component vector of float)
+0:8      'a2' (layout(location=1 ) in 4-component vector of float)
+0:8      'a3' (layout(location=2 ) in 4-component vector of float)
+0:8      'a4' (layout(location=3 ) in 4-component vector of float)
+0:8      'a5' (layout(location=4 ) in 4-component vector of float)
 0:?     Sequence
 0:9      move second child to first child (temp 4-component vector of float)
-0:9        'a1' (in 4-component vector of float)
+0:9        'a1' (layout(location=0 ) in 4-component vector of float)
 0:9        move second child to first child (temp 4-component vector of float)
-0:9          'a2' (in 4-component vector of float)
+0:9          'a2' (layout(location=1 ) in 4-component vector of float)
 0:9          move second child to first child (temp 4-component vector of float)
-0:9            'a3' (in 4-component vector of float)
+0:9            'a3' (layout(location=2 ) in 4-component vector of float)
 0:9            move second child to first child (temp 4-component vector of float)
-0:9              'a4' (in 4-component vector of float)
-0:9              'a5' (in 4-component vector of float)
-0:10      Branch: Return with expression
-0:10        add (temp 4-component vector of float)
+0:9              'a4' (layout(location=3 ) in 4-component vector of float)
+0:9              'a5' (layout(location=4 ) in 4-component vector of float)
+0:10      Sequence
+0:10        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:10          add (temp 4-component vector of float)
 0:10            add (temp 4-component vector of float)
 0:10              add (temp 4-component vector of float)
-0:10                'a1' (in 4-component vector of float)
-0:10                'a2' (in 4-component vector of float)
-0:10              'a3' (in 4-component vector of float)
-0:10            'a4' (in 4-component vector of float)
-0:10          'a5' (in 4-component vector of float)
+0:10                add (temp 4-component vector of float)
+0:10                  'a1' (layout(location=0 ) in 4-component vector of float)
+0:10                  'a2' (layout(location=1 ) in 4-component vector of float)
+0:10                'a3' (layout(location=2 ) in 4-component vector of float)
+0:10              'a4' (layout(location=3 ) in 4-component vector of float)
+0:10            'a5' (layout(location=4 ) in 4-component vector of float)
+0:10        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'a1' (layout(location=0 ) in 4-component vector of float)
+0:?     'a2' (layout(location=1 ) in 4-component vector of float)
+0:?     'a3' (layout(location=2 ) in 4-component vector of float)
+0:?     'a4' (layout(location=3 ) in 4-component vector of float)
+0:?     'a5' (layout(location=4 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 25
+// Id's are bound by 27
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 9 10 11 12 13
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 10 11 12 13 16
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 9  "a1"
                               Name 10  "a2"
                               Name 11  "a3"
                               Name 12  "a4"
                               Name 13  "a5"
+                              Name 16  "@entryPointOutput"
+                              Decorate 9(a1) Location 0
+                              Decorate 10(a2) Location 1
+                              Decorate 11(a3) Location 2
+                              Decorate 12(a4) Location 3
+                              Decorate 13(a5) Location 4
+                              Decorate 16(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -93,6 +117,8 @@
           11(a3):      8(ptr) Variable Input
           12(a4):      8(ptr) Variable Input
           13(a5):      8(ptr) Variable Input
+              15:             TypePointer Output 7(fvec4)
+16(@entryPointOutput):     15(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
               14:    7(fvec4) Load 13(a5)
@@ -100,14 +126,15 @@
                               Store 11(a3) 14
                               Store 10(a2) 14
                               Store 9(a1) 14
-              15:    7(fvec4) Load 9(a1)
-              16:    7(fvec4) Load 10(a2)
-              17:    7(fvec4) FAdd 15 16
-              18:    7(fvec4) Load 11(a3)
+              17:    7(fvec4) Load 9(a1)
+              18:    7(fvec4) Load 10(a2)
               19:    7(fvec4) FAdd 17 18
-              20:    7(fvec4) Load 12(a4)
+              20:    7(fvec4) Load 11(a3)
               21:    7(fvec4) FAdd 19 20
-              22:    7(fvec4) Load 13(a5)
+              22:    7(fvec4) Load 12(a4)
               23:    7(fvec4) FAdd 21 22
-                              ReturnValue 23
+              24:    7(fvec4) Load 13(a5)
+              25:    7(fvec4) FAdd 23 24
+                              Store 16(@entryPointOutput) 25
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.attribute.frag.out b/Test/baseResults/hlsl.attribute.frag.out
index 77e34fe..38421a8 100755
--- a/Test/baseResults/hlsl.attribute.frag.out
+++ b/Test/baseResults/hlsl.attribute.frag.out
@@ -2,9 +2,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global void)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:11      Test condition and select (temp void)
 0:11        Condition
@@ -12,6 +12,7 @@
 0:11          0 (const int)
 0:11        true case is null
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -20,9 +21,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global void)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:11      Test condition and select (temp void)
 0:11        Condition
@@ -30,22 +31,28 @@
 0:11          0 (const int)
 0:11        true case is null
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 10
+// Id's are bound by 14
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction"
+                              EntryPoint Fragment 4  "PixelShaderFunction" 13
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
+                              Name 13  "input"
+                              Decorate 13(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
                7:      6(int) Constant 0
+              10:             TypeFloat 32
+              11:             TypeVector 10(float) 4
+              12:             TypePointer Input 11(fvec4)
+       13(input):     12(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
                               SelectionMerge 9 None
diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out
index a51be51..78a8e73 100755
--- a/Test/baseResults/hlsl.buffer.frag.out
+++ b/Test/baseResults/hlsl.buffer.frag.out
@@ -2,37 +2,42 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:29  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:26  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:26    Function Parameters: 
-0:26      'input' (in 4-component vector of float)
+0:26      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:27      Branch: Return with expression
-0:27        add (temp 4-component vector of float)
+0:27      Sequence
+0:27        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:27          add (temp 4-component vector of float)
 0:27            add (temp 4-component vector of float)
 0:27              add (temp 4-component vector of float)
-0:27                'input' (in 4-component vector of float)
-0:27                v1: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
-0:27                  'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
+0:27                add (temp 4-component vector of float)
+0:27                  'input' (layout(location=0 ) in 4-component vector of float)
+0:27                  v1: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
+0:27                    'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
+0:27                    Constant:
+0:27                      0 (const uint)
+0:27                v2: direct index for structure (layout(column_major std430 ) buffer 4-component vector of float)
+0:27                  'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
 0:27                  Constant:
 0:27                    0 (const uint)
-0:27              v2: direct index for structure (layout(column_major std430 ) buffer 4-component vector of float)
-0:27                'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
+0:27              v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
+0:27                'anon@2' (layout(set=10 binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
 0:27                Constant:
 0:27                  0 (const uint)
-0:27            v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
-0:27              'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
+0:27            v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
+0:27              'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
 0:27              Constant:
 0:27                0 (const uint)
-0:27          v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
-0:27            'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
-0:27            Constant:
-0:27              0 (const uint)
+0:27        Branch: Return
 0:?   Linker Objects
 0:?     'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
 0:?     'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
-0:?     'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
-0:?     'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
+0:?     'anon@2' (layout(set=10 binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
+0:?     'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -41,125 +46,137 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:29  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:26  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:26    Function Parameters: 
-0:26      'input' (in 4-component vector of float)
+0:26      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:27      Branch: Return with expression
-0:27        add (temp 4-component vector of float)
+0:27      Sequence
+0:27        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:27          add (temp 4-component vector of float)
 0:27            add (temp 4-component vector of float)
 0:27              add (temp 4-component vector of float)
-0:27                'input' (in 4-component vector of float)
-0:27                v1: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
-0:27                  'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
+0:27                add (temp 4-component vector of float)
+0:27                  'input' (layout(location=0 ) in 4-component vector of float)
+0:27                  v1: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
+0:27                    'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
+0:27                    Constant:
+0:27                      0 (const uint)
+0:27                v2: direct index for structure (layout(column_major std430 ) buffer 4-component vector of float)
+0:27                  'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
 0:27                  Constant:
 0:27                    0 (const uint)
-0:27              v2: direct index for structure (layout(column_major std430 ) buffer 4-component vector of float)
-0:27                'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
+0:27              v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
+0:27                'anon@2' (layout(set=10 binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
 0:27                Constant:
 0:27                  0 (const uint)
-0:27            v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
-0:27              'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
+0:27            v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
+0:27              'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
 0:27              Constant:
 0:27                0 (const uint)
-0:27          v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
-0:27            'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
-0:27            Constant:
-0:27              0 (const uint)
+0:27        Branch: Return
 0:?   Linker Objects
 0:?     'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
 0:?     'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
-0:?     'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
-0:?     'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
+0:?     'anon@2' (layout(set=10 binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
+0:?     'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 39
+// Id's are bound by 41
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 9
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 9  "input"
-                              Name 11  ""
-                              MemberName 11 0  "v1"
+                              Name 9  "@entryPointOutput"
+                              Name 11  "input"
                               Name 13  ""
-                              Name 20  ""
-                              MemberName 20 0  "v2"
+                              MemberName 13 0  "v1"
+                              Name 15  ""
                               Name 22  ""
-                              Name 26  ""
-                              MemberName 26 0  "v3"
-                              MemberName 26 1  "i3"
+                              MemberName 22 0  "v2"
+                              Name 24  ""
                               Name 28  ""
-                              Name 32  ""
-                              MemberName 32 0  "v4"
-                              MemberName 32 1  "i4"
-                              MemberName 32 2  "f1"
-                              MemberName 32 3  "f3"
-                              MemberName 32 4  "f4"
-                              MemberName 32 5  "f5"
-                              MemberName 32 6  "f6"
-                              MemberName 32 7  "f7"
+                              MemberName 28 0  "v3"
+                              MemberName 28 1  "i3"
+                              Name 30  ""
                               Name 34  ""
-                              MemberDecorate 11 0 Offset 0
-                              Decorate 11 Block
-                              Decorate 13 DescriptorSet 0
-                              MemberDecorate 20 0 Offset 0
-                              Decorate 20 BufferBlock
-                              Decorate 22 DescriptorSet 0
-                              MemberDecorate 26 0 Offset 0
-                              MemberDecorate 26 1 Offset 20
-                              Decorate 26 Block
-                              Decorate 28 DescriptorSet 0
-                              MemberDecorate 32 0 Offset 16
-                              MemberDecorate 32 1 Offset 48
-                              MemberDecorate 32 2 Offset 60
-                              MemberDecorate 32 3 Offset 64
-                              MemberDecorate 32 4 Offset 68
-                              MemberDecorate 32 5 Offset 72
-                              MemberDecorate 32 6 Offset 76
-                              MemberDecorate 32 7 Offset 80
-                              Decorate 32 BufferBlock
-                              Decorate 34 DescriptorSet 0
+                              MemberName 34 0  "v4"
+                              MemberName 34 1  "i4"
+                              MemberName 34 2  "f1"
+                              MemberName 34 3  "f3"
+                              MemberName 34 4  "f4"
+                              MemberName 34 5  "f5"
+                              MemberName 34 6  "f6"
+                              MemberName 34 7  "f7"
+                              Name 36  ""
+                              Decorate 9(@entryPointOutput) Location 0
+                              Decorate 11(input) Location 0
+                              MemberDecorate 13 0 Offset 0
+                              Decorate 13 Block
+                              Decorate 15 DescriptorSet 0
+                              MemberDecorate 22 0 Offset 0
+                              Decorate 22 BufferBlock
+                              Decorate 24 DescriptorSet 0
+                              MemberDecorate 28 0 Offset 0
+                              MemberDecorate 28 1 Offset 20
+                              Decorate 28 Block
+                              Decorate 30 DescriptorSet 10
+                              Decorate 30 Binding 2
+                              MemberDecorate 34 0 Offset 16
+                              MemberDecorate 34 1 Offset 48
+                              MemberDecorate 34 2 Offset 60
+                              MemberDecorate 34 3 Offset 64
+                              MemberDecorate 34 4 Offset 68
+                              MemberDecorate 34 5 Offset 72
+                              MemberDecorate 34 6 Offset 76
+                              MemberDecorate 34 7 Offset 80
+                              Decorate 34 BufferBlock
+                              Decorate 36 DescriptorSet 0
+                              Decorate 36 Binding 8
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypePointer Input 7(fvec4)
-        9(input):      8(ptr) Variable Input
-              11:             TypeStruct 7(fvec4)
-              12:             TypePointer Uniform 11(struct)
-              13:     12(ptr) Variable Uniform
-              14:             TypeInt 32 1
-              15:     14(int) Constant 0
-              16:             TypePointer Uniform 7(fvec4)
-              20:             TypeStruct 7(fvec4)
-              21:             TypePointer Uniform 20(struct)
-              22:     21(ptr) Variable Uniform
-              26:             TypeStruct 7(fvec4) 14(int)
-              27:             TypePointer Uniform 26(struct)
-              28:     27(ptr) Variable Uniform
-              32:             TypeStruct 7(fvec4) 14(int) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float)
-              33:             TypePointer Uniform 32(struct)
-              34:     33(ptr) Variable Uniform
+               8:             TypePointer Output 7(fvec4)
+9(@entryPointOutput):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+       11(input):     10(ptr) Variable Input
+              13:             TypeStruct 7(fvec4)
+              14:             TypePointer Uniform 13(struct)
+              15:     14(ptr) Variable Uniform
+              16:             TypeInt 32 1
+              17:     16(int) Constant 0
+              18:             TypePointer Uniform 7(fvec4)
+              22:             TypeStruct 7(fvec4)
+              23:             TypePointer Uniform 22(struct)
+              24:     23(ptr) Variable Uniform
+              28:             TypeStruct 7(fvec4) 16(int)
+              29:             TypePointer Uniform 28(struct)
+              30:     29(ptr) Variable Uniform
+              34:             TypeStruct 7(fvec4) 16(int) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float)
+              35:             TypePointer Uniform 34(struct)
+              36:     35(ptr) Variable Uniform
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-              10:    7(fvec4) Load 9(input)
-              17:     16(ptr) AccessChain 13 15
-              18:    7(fvec4) Load 17
-              19:    7(fvec4) FAdd 10 18
-              23:     16(ptr) AccessChain 22 15
-              24:    7(fvec4) Load 23
-              25:    7(fvec4) FAdd 19 24
-              29:     16(ptr) AccessChain 28 15
-              30:    7(fvec4) Load 29
-              31:    7(fvec4) FAdd 25 30
-              35:     16(ptr) AccessChain 34 15
-              36:    7(fvec4) Load 35
-              37:    7(fvec4) FAdd 31 36
-                              ReturnValue 37
+              12:    7(fvec4) Load 11(input)
+              19:     18(ptr) AccessChain 15 17
+              20:    7(fvec4) Load 19
+              21:    7(fvec4) FAdd 12 20
+              25:     18(ptr) AccessChain 24 17
+              26:    7(fvec4) Load 25
+              27:    7(fvec4) FAdd 21 26
+              31:     18(ptr) AccessChain 30 17
+              32:    7(fvec4) Load 31
+              33:    7(fvec4) FAdd 27 32
+              37:     18(ptr) AccessChain 36 17
+              38:    7(fvec4) Load 37
+              39:    7(fvec4) FAdd 33 38
+                              Store 9(@entryPointOutput) 39
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.calculatelod.dx10.frag.out b/Test/baseResults/hlsl.calculatelod.dx10.frag.out
index 43232fb..68eee1a 100644
--- a/Test/baseResults/hlsl.calculatelod.dx10.frag.out
+++ b/Test/baseResults/hlsl.calculatelod.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:45  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:28      Sequence
@@ -124,7 +124,7 @@
 0:38              0 (const int)
 0:40      move second child to first child (temp 4-component vector of float)
 0:40        Color: direct index for structure (temp 4-component vector of float)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            0 (const int)
 0:40        Constant:
@@ -133,14 +133,27 @@
 0:40          1.000000
 0:40          1.000000
 0:41      move second child to first child (temp float)
-0:41        Depth: direct index for structure (temp float FragDepth)
-0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:41        Depth: direct index for structure (temp float)
+0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:41          Constant:
 0:41            1 (const int)
 0:41        Constant:
 0:41          1.000000
-0:43      Branch: Return with expression
-0:43        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:43          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:43            Color: direct index for structure (temp 4-component vector of float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                0 (const int)
+0:43          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:43            Depth: direct index for structure (temp float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                1 (const int)
+0:43        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -153,6 +166,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -161,7 +176,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:45  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:28      Sequence
@@ -283,7 +298,7 @@
 0:38              0 (const int)
 0:40      move second child to first child (temp 4-component vector of float)
 0:40        Color: direct index for structure (temp 4-component vector of float)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            0 (const int)
 0:40        Constant:
@@ -292,14 +307,27 @@
 0:40          1.000000
 0:40          1.000000
 0:41      move second child to first child (temp float)
-0:41        Depth: direct index for structure (temp float FragDepth)
-0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:41        Depth: direct index for structure (temp float)
+0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:41          Constant:
 0:41            1 (const int)
 0:41        Constant:
 0:41          1.000000
-0:43      Branch: Return with expression
-0:43        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:43          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:43            Color: direct index for structure (temp 4-component vector of float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                0 (const int)
+0:43          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:43            Depth: direct index for structure (temp float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                1 (const int)
+0:43        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -312,10 +340,12 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 143
+// Id's are bound by 150
 
                               Capability Shader
                               Capability Sampled1D
@@ -323,9 +353,8 @@
                               Capability ImageQuery
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 141 145
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "txval10"
                               Name 11  "g_tTex1df4a"
@@ -350,7 +379,9 @@
                               MemberName 131(PS_OUTPUT) 0  "Color"
                               MemberName 131(PS_OUTPUT) 1  "Depth"
                               Name 133  "psout"
-                              Name 142  "g_tTex1df4"
+                              Name 141  "Color"
+                              Name 145  "Depth"
+                              Name 149  "g_tTex1df4"
                               Decorate 11(g_tTex1df4a) DescriptorSet 0
                               Decorate 11(g_tTex1df4a) Binding 1
                               Decorate 15(g_sSamp) DescriptorSet 0
@@ -363,9 +394,10 @@
                               Decorate 93(g_tTexcdf4a) DescriptorSet 0
                               Decorate 106(g_tTexcdi4a) DescriptorSet 0
                               Decorate 118(g_tTexcdu4a) DescriptorSet 0
-                              MemberDecorate 131(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 142(g_tTex1df4) DescriptorSet 0
-                              Decorate 142(g_tTex1df4) Binding 0
+                              Decorate 141(Color) Location 0
+                              Decorate 145(Depth) BuiltIn FragDepth
+                              Decorate 149(g_tTex1df4) DescriptorSet 0
+                              Decorate 149(g_tTex1df4) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -436,7 +468,11 @@
              135:  130(fvec4) ConstantComposite 134 134 134 134
              136:             TypePointer Function 130(fvec4)
              138:     23(int) Constant 1
- 142(g_tTex1df4):     10(ptr) Variable UniformConstant
+             140:             TypePointer Output 130(fvec4)
+      141(Color):    140(ptr) Variable Output
+             144:             TypePointer Output 6(float)
+      145(Depth):    144(ptr) Variable Output
+ 149(g_tTex1df4):     10(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       8(txval10):      7(ptr) Variable Function
@@ -516,6 +552,11 @@
                               Store 137 135
              139:      7(ptr) AccessChain 133(psout) 138
                               Store 139 134
-             140:131(PS_OUTPUT) Load 133(psout)
-                              ReturnValue 140
+             142:    136(ptr) AccessChain 133(psout) 24
+             143:  130(fvec4) Load 142
+                              Store 141(Color) 143
+             146:      7(ptr) AccessChain 133(psout) 138
+             147:    6(float) Load 146
+                              Store 145(Depth) 147
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out b/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
index e2dc1db..9370e14 100644
--- a/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
+++ b/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
@@ -14,7 +14,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:45  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:28      Sequence
@@ -136,7 +136,7 @@
 0:38              0 (const int)
 0:40      move second child to first child (temp 4-component vector of float)
 0:40        Color: direct index for structure (temp 4-component vector of float)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            0 (const int)
 0:40        Constant:
@@ -145,14 +145,27 @@
 0:40          1.000000
 0:40          1.000000
 0:41      move second child to first child (temp float)
-0:41        Depth: direct index for structure (temp float FragDepth)
-0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:41        Depth: direct index for structure (temp float)
+0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:41          Constant:
 0:41            1 (const int)
 0:41        Constant:
 0:41          1.000000
-0:43      Branch: Return with expression
-0:43        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:43          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:43            Color: direct index for structure (temp 4-component vector of float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                0 (const int)
+0:43          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:43            Depth: direct index for structure (temp float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                1 (const int)
+0:43        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -165,6 +178,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -173,7 +188,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:45  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:28      Sequence
@@ -295,7 +310,7 @@
 0:38              0 (const int)
 0:40      move second child to first child (temp 4-component vector of float)
 0:40        Color: direct index for structure (temp 4-component vector of float)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            0 (const int)
 0:40        Constant:
@@ -304,14 +319,27 @@
 0:40          1.000000
 0:40          1.000000
 0:41      move second child to first child (temp float)
-0:41        Depth: direct index for structure (temp float FragDepth)
-0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:41        Depth: direct index for structure (temp float)
+0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:41          Constant:
 0:41            1 (const int)
 0:41        Constant:
 0:41          1.000000
-0:43      Branch: Return with expression
-0:43        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:43          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:43            Color: direct index for structure (temp 4-component vector of float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                0 (const int)
+0:43          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:43            Depth: direct index for structure (temp float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                1 (const int)
+0:43        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -324,5 +352,7 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.cast.frag.out b/Test/baseResults/hlsl.cast.frag.out
index 24b18cd..3bef95f 100755
--- a/Test/baseResults/hlsl.cast.frag.out
+++ b/Test/baseResults/hlsl.cast.frag.out
@@ -2,24 +2,29 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:3      Branch: Return with expression
-0:3        add (temp 4-component vector of float)
+0:3      Sequence
+0:3        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:3          add (temp 4-component vector of float)
-0:3            Construct vec4 (temp 4-component vector of float)
-0:3              'input' (in 4-component vector of float)
-0:3            Convert int to float (temp 4-component vector of float)
-0:3              Convert float to int (temp 4-component vector of int)
-0:3                'input' (in 4-component vector of float)
-0:3          Constant:
-0:3            1.198000
-0:3            1.198000
-0:3            1.198000
-0:3            1.198000
+0:3            add (temp 4-component vector of float)
+0:3              Construct vec4 (temp 4-component vector of float)
+0:3                'input' (layout(location=0 ) in 4-component vector of float)
+0:3              Convert int to float (temp 4-component vector of float)
+0:3                Convert float to int (temp 4-component vector of int)
+0:3                  'input' (layout(location=0 ) in 4-component vector of float)
+0:3            Constant:
+0:3              1.198000
+0:3              1.198000
+0:3              1.198000
+0:3              1.198000
+0:3        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -28,59 +33,69 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:3      Branch: Return with expression
-0:3        add (temp 4-component vector of float)
+0:3      Sequence
+0:3        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:3          add (temp 4-component vector of float)
-0:3            Construct vec4 (temp 4-component vector of float)
-0:3              'input' (in 4-component vector of float)
-0:3            Convert int to float (temp 4-component vector of float)
-0:3              Convert float to int (temp 4-component vector of int)
-0:3                'input' (in 4-component vector of float)
-0:3          Constant:
-0:3            1.198000
-0:3            1.198000
-0:3            1.198000
-0:3            1.198000
+0:3            add (temp 4-component vector of float)
+0:3              Construct vec4 (temp 4-component vector of float)
+0:3                'input' (layout(location=0 ) in 4-component vector of float)
+0:3              Convert int to float (temp 4-component vector of float)
+0:3                Convert float to int (temp 4-component vector of int)
+0:3                  'input' (layout(location=0 ) in 4-component vector of float)
+0:3            Constant:
+0:3              1.198000
+0:3              1.198000
+0:3              1.198000
+0:3              1.198000
+0:3        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 26
+// Id's are bound by 28
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 9
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 9  "input"
+                              Name 9  "@entryPointOutput"
+                              Name 11  "input"
+                              Decorate 9(@entryPointOutput) Location 0
+                              Decorate 11(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypePointer Input 7(fvec4)
-        9(input):      8(ptr) Variable Input
-              17:             TypeInt 32 1
-              18:             TypeVector 17(int) 4
-              22:    6(float) Constant 1067014160
-              23:    7(fvec4) ConstantComposite 22 22 22 22
+               8:             TypePointer Output 7(fvec4)
+9(@entryPointOutput):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+       11(input):     10(ptr) Variable Input
+              19:             TypeInt 32 1
+              20:             TypeVector 19(int) 4
+              24:    6(float) Constant 1067014160
+              25:    7(fvec4) ConstantComposite 24 24 24 24
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-              10:    7(fvec4) Load 9(input)
-              11:    6(float) CompositeExtract 10 0
-              12:    6(float) CompositeExtract 10 1
-              13:    6(float) CompositeExtract 10 2
-              14:    6(float) CompositeExtract 10 3
-              15:    7(fvec4) CompositeConstruct 11 12 13 14
-              16:    7(fvec4) Load 9(input)
-              19:   18(ivec4) ConvertFToS 16
-              20:    7(fvec4) ConvertSToF 19
-              21:    7(fvec4) FAdd 15 20
-              24:    7(fvec4) FAdd 21 23
-                              ReturnValue 24
+              12:    7(fvec4) Load 11(input)
+              13:    6(float) CompositeExtract 12 0
+              14:    6(float) CompositeExtract 12 1
+              15:    6(float) CompositeExtract 12 2
+              16:    6(float) CompositeExtract 12 3
+              17:    7(fvec4) CompositeConstruct 13 14 15 16
+              18:    7(fvec4) Load 11(input)
+              21:   20(ivec4) ConvertFToS 18
+              22:    7(fvec4) ConvertSToF 21
+              23:    7(fvec4) FAdd 17 22
+              26:    7(fvec4) FAdd 23 25
+                              Store 9(@entryPointOutput) 26
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.conditional.frag.out b/Test/baseResults/hlsl.conditional.frag.out
index 1e62e9c..f6c00fe 100755
--- a/Test/baseResults/hlsl.conditional.frag.out
+++ b/Test/baseResults/hlsl.conditional.frag.out
@@ -2,9 +2,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:17  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Sequence
 0:3        move second child to first child (temp int)
@@ -35,19 +35,19 @@
 0:7                vector-scale (temp 4-component vector of float)
 0:7                  Convert int to float (temp float)
 0:7                    'a' (temp int)
-0:7                  'input' (in 4-component vector of float)
+0:7                  'input' (layout(location=0 ) in 4-component vector of float)
 0:8                vector-scale (temp 4-component vector of float)
 0:8                  Convert int to float (temp float)
 0:8                    'b' (temp int)
-0:8                  'input' (in 4-component vector of float)
+0:8                  'input' (layout(location=0 ) in 4-component vector of float)
 0:9              vector-scale (temp 4-component vector of float)
 0:9                Convert int to float (temp float)
 0:9                  'c' (temp int)
-0:9                'input' (in 4-component vector of float)
+0:9                'input' (layout(location=0 ) in 4-component vector of float)
 0:10            vector-scale (temp 4-component vector of float)
 0:10              Convert int to float (temp float)
 0:10                'd' (temp int)
-0:10              'input' (in 4-component vector of float)
+0:10              'input' (layout(location=0 ) in 4-component vector of float)
 0:12      Comma (temp int)
 0:12        move second child to first child (temp int)
 0:12          'e' (temp int)
@@ -85,27 +85,32 @@
 0:14              Constant:
 0:14                0 (const int)
 0:14            direct index (temp float)
-0:14              'input' (in 4-component vector of float)
+0:14              'input' (layout(location=0 ) in 4-component vector of float)
 0:14              Constant:
 0:14                1 (const int)
 0:14          true case
 0:14          vector-scale (temp 4-component vector of float)
 0:14            Convert int to float (temp float)
 0:14              'c' (temp int)
-0:14            'input' (in 4-component vector of float)
+0:14            'input' (layout(location=0 ) in 4-component vector of float)
 0:14          false case
 0:14          vector-scale (temp 4-component vector of float)
 0:14            Convert int to float (temp float)
 0:14              'd' (temp int)
-0:14            'input' (in 4-component vector of float)
-0:15      Branch: Return with expression
-0:15        add (temp 4-component vector of float)
-0:15          vector-scale (temp 4-component vector of float)
-0:15            Convert int to float (temp float)
-0:15              'e' (temp int)
-0:15            'ret' (temp 4-component vector of float)
-0:15          'f' (temp 4-component vector of float)
+0:14            'input' (layout(location=0 ) in 4-component vector of float)
+0:15      Sequence
+0:15        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:15          add (temp 4-component vector of float)
+0:15            vector-scale (temp 4-component vector of float)
+0:15              Convert int to float (temp float)
+0:15                'e' (temp int)
+0:15              'ret' (temp 4-component vector of float)
+0:15            'f' (temp 4-component vector of float)
+0:15        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -114,9 +119,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:17  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Sequence
 0:3        move second child to first child (temp int)
@@ -147,19 +152,19 @@
 0:7                vector-scale (temp 4-component vector of float)
 0:7                  Convert int to float (temp float)
 0:7                    'a' (temp int)
-0:7                  'input' (in 4-component vector of float)
+0:7                  'input' (layout(location=0 ) in 4-component vector of float)
 0:8                vector-scale (temp 4-component vector of float)
 0:8                  Convert int to float (temp float)
 0:8                    'b' (temp int)
-0:8                  'input' (in 4-component vector of float)
+0:8                  'input' (layout(location=0 ) in 4-component vector of float)
 0:9              vector-scale (temp 4-component vector of float)
 0:9                Convert int to float (temp float)
 0:9                  'c' (temp int)
-0:9                'input' (in 4-component vector of float)
+0:9                'input' (layout(location=0 ) in 4-component vector of float)
 0:10            vector-scale (temp 4-component vector of float)
 0:10              Convert int to float (temp float)
 0:10                'd' (temp int)
-0:10              'input' (in 4-component vector of float)
+0:10              'input' (layout(location=0 ) in 4-component vector of float)
 0:12      Comma (temp int)
 0:12        move second child to first child (temp int)
 0:12          'e' (temp int)
@@ -197,38 +202,42 @@
 0:14              Constant:
 0:14                0 (const int)
 0:14            direct index (temp float)
-0:14              'input' (in 4-component vector of float)
+0:14              'input' (layout(location=0 ) in 4-component vector of float)
 0:14              Constant:
 0:14                1 (const int)
 0:14          true case
 0:14          vector-scale (temp 4-component vector of float)
 0:14            Convert int to float (temp float)
 0:14              'c' (temp int)
-0:14            'input' (in 4-component vector of float)
+0:14            'input' (layout(location=0 ) in 4-component vector of float)
 0:14          false case
 0:14          vector-scale (temp 4-component vector of float)
 0:14            Convert int to float (temp float)
 0:14              'd' (temp int)
-0:14            'input' (in 4-component vector of float)
-0:15      Branch: Return with expression
-0:15        add (temp 4-component vector of float)
-0:15          vector-scale (temp 4-component vector of float)
-0:15            Convert int to float (temp float)
-0:15              'e' (temp int)
-0:15            'ret' (temp 4-component vector of float)
-0:15          'f' (temp 4-component vector of float)
+0:14            'input' (layout(location=0 ) in 4-component vector of float)
+0:15      Sequence
+0:15        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:15          add (temp 4-component vector of float)
+0:15            vector-scale (temp 4-component vector of float)
+0:15              Convert int to float (temp float)
+0:15                'e' (temp int)
+0:15              'ret' (temp 4-component vector of float)
+0:15            'f' (temp 4-component vector of float)
+0:15        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 89
+// Id's are bound by 91
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 22
+                              EntryPoint Fragment 4  "PixelShaderFunction" 22 83
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 8  "a"
                               Name 10  "b"
@@ -238,6 +247,9 @@
                               Name 22  "input"
                               Name 40  "e"
                               Name 57  "f"
+                              Name 83  "@entryPointOutput"
+                              Decorate 22(input) Location 0
+                              Decorate 83(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -258,6 +270,8 @@
               64:     59(int) Constant 1
               65:             TypePointer Input 15(float)
               68:             TypeBool
+              82:             TypePointer Output 16(fvec4)
+83(@entryPointOutput):     82(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
             8(a):      7(ptr) Variable Function
@@ -347,11 +361,12 @@
               71:             Label
               81:   16(fvec4) Load 58
                               Store 57(f) 81
-              82:      6(int) Load 40(e)
-              83:   15(float) ConvertSToF 82
-              84:   16(fvec4) Load 18(ret)
-              85:   16(fvec4) VectorTimesScalar 84 83
-              86:   16(fvec4) Load 57(f)
-              87:   16(fvec4) FAdd 85 86
-                              ReturnValue 87
+              84:      6(int) Load 40(e)
+              85:   15(float) ConvertSToF 84
+              86:   16(fvec4) Load 18(ret)
+              87:   16(fvec4) VectorTimesScalar 86 85
+              88:   16(fvec4) Load 57(f)
+              89:   16(fvec4) FAdd 87 88
+                              Store 83(@entryPointOutput) 89
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.constructexpr.frag.out b/Test/baseResults/hlsl.constructexpr.frag.out
index 2eef7c0..956e1bb 100644
--- a/Test/baseResults/hlsl.constructexpr.frag.out
+++ b/Test/baseResults/hlsl.constructexpr.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:18  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:4  Function Definition: main( (global structure{temp 4-component vector of float color})
 0:4    Function Parameters: 
 0:?     Sequence
 0:6      Constant:
@@ -34,9 +34,17 @@
 0:15          1.000000
 0:15          1.000000
 0:15          1.000000
-0:16      Branch: Return with expression
-0:16        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?       Sequence
+0:?         Sequence
+0:16          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0: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        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -45,7 +53,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:18  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:4  Function Definition: main( (global structure{temp 4-component vector of float color})
 0:4    Function Parameters: 
 0:?     Sequence
 0:6      Constant:
@@ -77,24 +85,33 @@
 0:15          1.000000
 0:15          1.000000
 0:15          1.000000
-0:16      Branch: Return with expression
-0:16        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?       Sequence
+0:?         Sequence
+0:16          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0: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        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 32
+// Id's are bound by 35
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 31
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 22  "PS_OUTPUT"
                               MemberName 22(PS_OUTPUT) 0  "color"
                               Name 24  "ps_output"
+                              Name 31  "color"
+                              Decorate 31(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -119,11 +136,15 @@
               26:   13(float) Constant 1065353216
               27:   21(fvec4) ConstantComposite 26 26 26 26
               28:             TypePointer Function 21(fvec4)
+              30:             TypePointer Output 21(fvec4)
+       31(color):     30(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
    24(ps_output):     23(ptr) Variable Function
               29:     28(ptr) AccessChain 24(ps_output) 25
                               Store 29 27
-              30:22(PS_OUTPUT) Load 24(ps_output)
-                              ReturnValue 30
+              32:     28(ptr) AccessChain 24(ps_output) 25
+              33:   21(fvec4) Load 32
+                              Store 31(color) 33
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.depthGreater.frag.out b/Test/baseResults/hlsl.depthGreater.frag.out
new file mode 100755
index 0000000..6a44a2f
--- /dev/null
+++ b/Test/baseResults/hlsl.depthGreater.frag.out
@@ -0,0 +1,59 @@
+hlsl.depthGreater.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+using depth_greater
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction(f1; (global void)
+0:2    Function Parameters: 
+0:2      'depth' (out float FragDepth)
+0:?     Sequence
+0:3      move second child to first child (temp float)
+0:3        'depth' (out float FragDepth)
+0:3        Constant:
+0:3          0.200000
+0:?   Linker Objects
+0:?     'depth' (out float FragDepth)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+using depth_greater
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction(f1; (global void)
+0:2    Function Parameters: 
+0:2      'depth' (out float FragDepth)
+0:?     Sequence
+0:3      move second child to first child (temp float)
+0:3        'depth' (out float FragDepth)
+0:3        Constant:
+0:3          0.200000
+0:?   Linker Objects
+0:?     'depth' (out float FragDepth)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 10
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction" 8
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthGreater
+                              Name 4  "PixelShaderFunction"
+                              Name 8  "depth"
+                              Decorate 8(depth) BuiltIn FragDepth
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Output 6(float)
+        8(depth):      7(ptr) Variable Output
+               9:    6(float) Constant 1045220557
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+                              Store 8(depth) 9
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.depthLess.frag.out b/Test/baseResults/hlsl.depthLess.frag.out
new file mode 100755
index 0000000..b1307ce
--- /dev/null
+++ b/Test/baseResults/hlsl.depthLess.frag.out
@@ -0,0 +1,60 @@
+hlsl.depthLess.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+using depth_less
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction( (global float FragDepth)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Sequence
+0:3        move second child to first child (temp float)
+0:?           '@entryPointOutput' (out float unknown built-in variable)
+0:3          Constant:
+0:3            0.200000
+0:3        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (out float unknown built-in variable)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+using depth_less
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction( (global float FragDepth)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Sequence
+0:3        move second child to first child (temp float)
+0:?           '@entryPointOutput' (out float unknown built-in variable)
+0:3          Constant:
+0:3            0.200000
+0:3        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (out float unknown built-in variable)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 11
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction" 8
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthLess
+                              Name 4  "PixelShaderFunction"
+                              Name 8  "@entryPointOutput"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Output 6(float)
+8(@entryPointOutput):      7(ptr) Variable Output
+               9:    6(float) Constant 1045220557
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+                              Store 8(@entryPointOutput) 9
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.discard.frag.out b/Test/baseResults/hlsl.discard.frag.out
index 324029a..9601c7d 100755
--- a/Test/baseResults/hlsl.discard.frag.out
+++ b/Test/baseResults/hlsl.discard.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:7  Function Definition: foo(f1; (global void)
+0:2  Function Definition: foo(f1; (global void)
 0:2    Function Parameters: 
 0:2      'f' (in float)
 0:?     Sequence
@@ -14,19 +14,19 @@
 0:3            1.000000
 0:3        true case
 0:4        Branch: Kill
-0:15  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:8  Function Definition: PixelShaderFunction(vf4; (global void)
 0:8    Function Parameters: 
-0:8      'input' (in 4-component vector of float)
+0:8      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:9      Function Call: foo(f1; (global void)
 0:9        direct index (temp float)
-0:9          'input' (in 4-component vector of float)
+0:9          'input' (layout(location=0 ) in 4-component vector of float)
 0:9          Constant:
 0:9            2 (const int)
 0:10      Test condition and select (temp void)
 0:10        Condition
 0:10        direct index (temp float)
-0:10          'input' (in 4-component vector of float)
+0:10          'input' (layout(location=0 ) in 4-component vector of float)
 0:10          Constant:
 0:10            0 (const int)
 0:10        true case
@@ -35,11 +35,12 @@
 0:12        move second child to first child (temp float)
 0:12          'f' (temp float)
 0:12          direct index (temp float)
-0:12            'input' (in 4-component vector of float)
+0:12            'input' (layout(location=0 ) in 4-component vector of float)
 0:12            Constant:
 0:12              0 (const int)
 0:13      Branch: Kill
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -48,7 +49,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:7  Function Definition: foo(f1; (global void)
+0:2  Function Definition: foo(f1; (global void)
 0:2    Function Parameters: 
 0:2      'f' (in float)
 0:?     Sequence
@@ -60,19 +61,19 @@
 0:3            1.000000
 0:3        true case
 0:4        Branch: Kill
-0:15  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:8  Function Definition: PixelShaderFunction(vf4; (global void)
 0:8    Function Parameters: 
-0:8      'input' (in 4-component vector of float)
+0:8      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:9      Function Call: foo(f1; (global void)
 0:9        direct index (temp float)
-0:9          'input' (in 4-component vector of float)
+0:9          'input' (layout(location=0 ) in 4-component vector of float)
 0:9          Constant:
 0:9            2 (const int)
 0:10      Test condition and select (temp void)
 0:10        Condition
 0:10        direct index (temp float)
-0:10          'input' (in 4-component vector of float)
+0:10          'input' (layout(location=0 ) in 4-component vector of float)
 0:10          Constant:
 0:10            0 (const int)
 0:10        true case
@@ -81,11 +82,12 @@
 0:12        move second child to first child (temp float)
 0:12          'f' (temp float)
 0:12          direct index (temp float)
-0:12            'input' (in 4-component vector of float)
+0:12            'input' (layout(location=0 ) in 4-component vector of float)
 0:12            Constant:
 0:12              0 (const int)
 0:13      Branch: Kill
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
@@ -96,13 +98,13 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "PixelShaderFunction" 21
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 10  "foo(f1;"
                               Name 9  "f"
                               Name 21  "input"
                               Name 22  "param"
                               Name 35  "f"
+                              Decorate 21(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/hlsl.doLoop.frag.out b/Test/baseResults/hlsl.doLoop.frag.out
index c14a3a5..019f43d 100755
--- a/Test/baseResults/hlsl.doLoop.frag.out
+++ b/Test/baseResults/hlsl.doLoop.frag.out
@@ -2,9 +2,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:7  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Loop with condition not tested first
 0:3        Loop Condition
@@ -19,12 +19,17 @@
 0:5      Loop with condition not tested first
 0:5        Loop Condition
 0:5        Compare Equal (temp bool)
-0:5          'input' (in 4-component vector of float)
-0:5          'input' (in 4-component vector of float)
+0:5          'input' (layout(location=0 ) in 4-component vector of float)
+0:5          'input' (layout(location=0 ) in 4-component vector of float)
 0:5        Loop Body
-0:5        Branch: Return with expression
-0:5          'input' (in 4-component vector of float)
+0:5        Sequence
+0:5          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:5            'input' (layout(location=0 ) in 4-component vector of float)
+0:5          Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -33,9 +38,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:7  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Loop with condition not tested first
 0:3        Loop Condition
@@ -50,34 +55,43 @@
 0:5      Loop with condition not tested first
 0:5        Loop Condition
 0:5        Compare Equal (temp bool)
-0:5          'input' (in 4-component vector of float)
-0:5          'input' (in 4-component vector of float)
+0:5          'input' (layout(location=0 ) in 4-component vector of float)
+0:5          'input' (layout(location=0 ) in 4-component vector of float)
 0:5        Loop Body
-0:5        Branch: Return with expression
-0:5          'input' (in 4-component vector of float)
+0:5        Sequence
+0:5          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:5            'input' (layout(location=0 ) in 4-component vector of float)
+0:5          Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 31
+// Id's are bound by 33
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 23
+                              EntryPoint Fragment 4  "PixelShaderFunction" 23 25
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 23  "input"
+                              Name 23  "@entryPointOutput"
+                              Name 25  "input"
+                              Decorate 23(@entryPointOutput) Location 0
+                              Decorate 25(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeBool
               11:    10(bool) ConstantFalse
               20:             TypeFloat 32
               21:             TypeVector 20(float) 4
-              22:             TypePointer Input 21(fvec4)
-       23(input):     22(ptr) Variable Input
-              28:             TypeVector 10(bool) 4
+              22:             TypePointer Output 21(fvec4)
+23(@entryPointOutput):     22(ptr) Variable Output
+              24:             TypePointer Input 21(fvec4)
+       25(input):     24(ptr) Variable Input
+              30:             TypeVector 10(bool) 4
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
                               Branch 6
@@ -103,14 +117,15 @@
                               LoopMerge 18 19 None
                               Branch 17
               17:             Label
-              24:   21(fvec4) Load 23(input)
-                              ReturnValue 24
+              26:   21(fvec4) Load 25(input)
+                              Store 23(@entryPointOutput) 26
+                              Return
               19:             Label
-              26:   21(fvec4) Load 23(input)
-              27:   21(fvec4) Load 23(input)
-              29:   28(bvec4) FOrdEqual 26 27
-              30:    10(bool) All 29
-                              BranchConditional 30 16 18
+              28:   21(fvec4) Load 25(input)
+              29:   21(fvec4) Load 25(input)
+              31:   30(bvec4) FOrdEqual 28 29
+              32:    10(bool) All 31
+                              BranchConditional 32 16 18
               18:             Label
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.entry-in.frag.out b/Test/baseResults/hlsl.entry-in.frag.out
new file mode 100755
index 0000000..5baea64
--- /dev/null
+++ b/Test/baseResults/hlsl.entry-in.frag.out
@@ -0,0 +1,304 @@
+hlsl.entry-in.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: fun(struct-InParam-vf2-vf4-vi21; (global float)
+0:8    Function Parameters: 
+0:8      'p' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add (temp float)
+0:9          direct index (temp float)
+0:9            v: direct index for structure (temp 2-component vector of float)
+0:9              'p' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:9              Constant:
+0:9                0 (const int)
+0:9            Constant:
+0:9              1 (const int)
+0:9          direct index (temp float)
+0:9            fragCoord: direct index for structure (temp 4-component vector of float FragCoord)
+0:9              'p' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:9              Constant:
+0:9                1 (const int)
+0:9            Constant:
+0:9              0 (const int)
+0:13  Function Definition: PixelShaderFunction(struct-InParam-vf2-vf4-vi21; (global 4-component vector of float)
+0:13    Function Parameters: 
+0:13      'i' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?     Sequence
+0:?       Sequence
+0:15        move second child to first child (temp 2-component vector of float)
+0:15          v: direct index for structure (temp 2-component vector of float)
+0:15            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:15            Constant:
+0:15              0 (const int)
+0:?           'v' (layout(location=0 ) in 2-component vector of float)
+0:15        move second child to first child (temp 4-component vector of float)
+0:15          fragCoord: direct index for structure (temp 4-component vector of float)
+0:15            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:15            Constant:
+0:15              1 (const int)
+0:?           'fragCoord' (in 4-component vector of float FragCoord)
+0:15        move second child to first child (temp 2-component vector of int)
+0:15          i2: direct index for structure (temp 2-component vector of int)
+0:15            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:15            Constant:
+0:15              2 (const int)
+0:?           'i2' (layout(location=1 ) in 2-component vector of int)
+0:16      Sequence
+0:16        move second child to first child (temp float)
+0:16          'ret1' (temp float)
+0:16          Function Call: fun(struct-InParam-vf2-vf4-vi21; (global float)
+0:16            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:17      Sequence
+0:17        move second child to first child (temp float)
+0:17          'ret2' (temp float)
+0:17          Function Call: fun(struct-InParam-vf2-vf4-vi21; (global float)
+0:?             Comma (temp float)
+0:?               Sequence
+0:?                 move second child to first child (temp 2-component vector of float)
+0:?                   v: direct index for structure (temp 2-component vector of float)
+0:?                     'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?                     Constant:
+0:?                       0 (const int)
+0:?                   'v' (layout(location=0 ) in 2-component vector of float)
+0:?                 move second child to first child (temp 4-component vector of float)
+0:?                   fragCoord: direct index for structure (temp 4-component vector of float)
+0:?                     'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?                     Constant:
+0:?                       1 (const int)
+0:?                   'fragCoord' (in 4-component vector of float FragCoord)
+0:?                 move second child to first child (temp 2-component vector of int)
+0:?                   i2: direct index for structure (temp 2-component vector of int)
+0:?                     'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?                     Constant:
+0:?                       2 (const int)
+0:?                   'i2' (layout(location=1 ) in 2-component vector of int)
+0:?               'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:19      Sequence
+0:19        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:19          vector-scale (temp 4-component vector of float)
+0:19            vector-scale (temp 4-component vector of float)
+0:19              fragCoord: direct index for structure (temp 4-component vector of float)
+0:19                'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:19                Constant:
+0:19                  1 (const int)
+0:19              'ret1' (temp float)
+0:19            'ret2' (temp float)
+0:19        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'v' (layout(location=0 ) in 2-component vector of float)
+0:?     'fragCoord' (in 4-component vector of float FragCoord)
+0:?     'i2' (layout(location=1 ) in 2-component vector of int)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: fun(struct-InParam-vf2-vf4-vi21; (global float)
+0:8    Function Parameters: 
+0:8      'p' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add (temp float)
+0:9          direct index (temp float)
+0:9            v: direct index for structure (temp 2-component vector of float)
+0:9              'p' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:9              Constant:
+0:9                0 (const int)
+0:9            Constant:
+0:9              1 (const int)
+0:9          direct index (temp float)
+0:9            fragCoord: direct index for structure (temp 4-component vector of float FragCoord)
+0:9              'p' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:9              Constant:
+0:9                1 (const int)
+0:9            Constant:
+0:9              0 (const int)
+0:13  Function Definition: PixelShaderFunction(struct-InParam-vf2-vf4-vi21; (global 4-component vector of float)
+0:13    Function Parameters: 
+0:13      'i' (in structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?     Sequence
+0:?       Sequence
+0:15        move second child to first child (temp 2-component vector of float)
+0:15          v: direct index for structure (temp 2-component vector of float)
+0:15            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:15            Constant:
+0:15              0 (const int)
+0:?           'v' (layout(location=0 ) in 2-component vector of float)
+0:15        move second child to first child (temp 4-component vector of float)
+0:15          fragCoord: direct index for structure (temp 4-component vector of float)
+0:15            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:15            Constant:
+0:15              1 (const int)
+0:?           'fragCoord' (in 4-component vector of float FragCoord)
+0:15        move second child to first child (temp 2-component vector of int)
+0:15          i2: direct index for structure (temp 2-component vector of int)
+0:15            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:15            Constant:
+0:15              2 (const int)
+0:?           'i2' (layout(location=1 ) in 2-component vector of int)
+0:16      Sequence
+0:16        move second child to first child (temp float)
+0:16          'ret1' (temp float)
+0:16          Function Call: fun(struct-InParam-vf2-vf4-vi21; (global float)
+0:16            'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:17      Sequence
+0:17        move second child to first child (temp float)
+0:17          'ret2' (temp float)
+0:17          Function Call: fun(struct-InParam-vf2-vf4-vi21; (global float)
+0:?             Comma (temp float)
+0:?               Sequence
+0:?                 move second child to first child (temp 2-component vector of float)
+0:?                   v: direct index for structure (temp 2-component vector of float)
+0:?                     'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?                     Constant:
+0:?                       0 (const int)
+0:?                   'v' (layout(location=0 ) in 2-component vector of float)
+0:?                 move second child to first child (temp 4-component vector of float)
+0:?                   fragCoord: direct index for structure (temp 4-component vector of float)
+0:?                     'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?                     Constant:
+0:?                       1 (const int)
+0:?                   'fragCoord' (in 4-component vector of float FragCoord)
+0:?                 move second child to first child (temp 2-component vector of int)
+0:?                   i2: direct index for structure (temp 2-component vector of int)
+0:?                     'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:?                     Constant:
+0:?                       2 (const int)
+0:?                   'i2' (layout(location=1 ) in 2-component vector of int)
+0:?               'aggShadow' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:19      Sequence
+0:19        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:19          vector-scale (temp 4-component vector of float)
+0:19            vector-scale (temp 4-component vector of float)
+0:19              fragCoord: direct index for structure (temp 4-component vector of float)
+0:19                'local' (temp structure{temp 2-component vector of float v, temp 4-component vector of float fragCoord, temp 2-component vector of int i2})
+0:19                Constant:
+0:19                  1 (const int)
+0:19              'ret1' (temp float)
+0:19            'ret2' (temp float)
+0:19        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'v' (layout(location=0 ) in 2-component vector of float)
+0:?     'fragCoord' (in 4-component vector of float FragCoord)
+0:?     'i2' (layout(location=1 ) in 2-component vector of int)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 71
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction" 32 37 43 63
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "PixelShaderFunction"
+                              Name 11  "InParam"
+                              MemberName 11(InParam) 0  "v"
+                              MemberName 11(InParam) 1  "fragCoord"
+                              MemberName 11(InParam) 2  "i2"
+                              Name 15  "fun(struct-InParam-vf2-vf4-vi21;"
+                              Name 14  "p"
+                              Name 30  "local"
+                              Name 32  "v"
+                              Name 37  "fragCoord"
+                              Name 43  "i2"
+                              Name 47  "ret1"
+                              Name 48  "param"
+                              Name 51  "ret2"
+                              Name 52  "aggShadow"
+                              Name 59  "param"
+                              Name 63  "@entryPointOutput"
+                              Decorate 32(v) Location 0
+                              Decorate 37(fragCoord) BuiltIn FragCoord
+                              Decorate 43(i2) Location 1
+                              Decorate 63(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeVector 6(float) 4
+               9:             TypeInt 32 1
+              10:             TypeVector 9(int) 2
+     11(InParam):             TypeStruct 7(fvec2) 8(fvec4) 10(ivec2)
+              12:             TypePointer Function 11(InParam)
+              13:             TypeFunction 6(float) 12(ptr)
+              17:      9(int) Constant 0
+              18:             TypeInt 32 0
+              19:     18(int) Constant 1
+              20:             TypePointer Function 6(float)
+              23:      9(int) Constant 1
+              24:     18(int) Constant 0
+              31:             TypePointer Input 7(fvec2)
+           32(v):     31(ptr) Variable Input
+              34:             TypePointer Function 7(fvec2)
+              36:             TypePointer Input 8(fvec4)
+   37(fragCoord):     36(ptr) Variable Input
+              39:             TypePointer Function 8(fvec4)
+              41:      9(int) Constant 2
+              42:             TypePointer Input 10(ivec2)
+          43(i2):     42(ptr) Variable Input
+              45:             TypePointer Function 10(ivec2)
+              62:             TypePointer Output 8(fvec4)
+63(@entryPointOutput):     62(ptr) Variable Output
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+       30(local):     12(ptr) Variable Function
+        47(ret1):     20(ptr) Variable Function
+       48(param):     12(ptr) Variable Function
+        51(ret2):     20(ptr) Variable Function
+   52(aggShadow):     12(ptr) Variable Function
+       59(param):     20(ptr) Variable Function
+              33:    7(fvec2) Load 32(v)
+              35:     34(ptr) AccessChain 30(local) 17
+                              Store 35 33
+              38:    8(fvec4) Load 37(fragCoord)
+              40:     39(ptr) AccessChain 30(local) 23
+                              Store 40 38
+              44:   10(ivec2) Load 43(i2)
+              46:     45(ptr) AccessChain 30(local) 41
+                              Store 46 44
+              49: 11(InParam) Load 30(local)
+                              Store 48(param) 49
+              50:    6(float) FunctionCall 15(fun(struct-InParam-vf2-vf4-vi21;) 48(param)
+                              Store 47(ret1) 50
+              53:    7(fvec2) Load 32(v)
+              54:     34(ptr) AccessChain 52(aggShadow) 17
+                              Store 54 53
+              55:    8(fvec4) Load 37(fragCoord)
+              56:     39(ptr) AccessChain 52(aggShadow) 23
+                              Store 56 55
+              57:   10(ivec2) Load 43(i2)
+              58:     45(ptr) AccessChain 52(aggShadow) 41
+                              Store 58 57
+              60: 11(InParam) Load 52(aggShadow)
+                              Store 59(param) 60
+              61:    6(float) FunctionCall 15(fun(struct-InParam-vf2-vf4-vi21;) 59(param)
+                              Store 51(ret2) 61
+              64:     39(ptr) AccessChain 30(local) 23
+              65:    8(fvec4) Load 64
+              66:    6(float) Load 47(ret1)
+              67:    8(fvec4) VectorTimesScalar 65 66
+              68:    6(float) Load 51(ret2)
+              69:    8(fvec4) VectorTimesScalar 67 68
+                              Store 63(@entryPointOutput) 69
+                              Return
+                              FunctionEnd
+15(fun(struct-InParam-vf2-vf4-vi21;):    6(float) Function None 13
+           14(p):     12(ptr) FunctionParameter
+              16:             Label
+              21:     20(ptr) AccessChain 14(p) 17 19
+              22:    6(float) Load 21
+              25:     20(ptr) AccessChain 14(p) 23 24
+              26:    6(float) Load 25
+              27:    6(float) FAdd 22 26
+                              ReturnValue 27
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.entry-out.frag.out b/Test/baseResults/hlsl.entry-out.frag.out
new file mode 100755
index 0000000..81926dd
--- /dev/null
+++ b/Test/baseResults/hlsl.entry-out.frag.out
@@ -0,0 +1,218 @@
+hlsl.entry-out.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: PixelShaderFunction(vf4;vf4;struct-OutParam-vf2-vi21;struct-OutParam-vf2-vi21; (global 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'input' (layout(location=0 ) in 4-component vector of float)
+0:7      'out1' (layout(location=1 ) out 4-component vector of float)
+0:7      'out2' (out structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:7      'out3' (out structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:?     Sequence
+0:8      move second child to first child (temp 4-component vector of float)
+0:8        'out1' (layout(location=1 ) out 4-component vector of float)
+0:8        'input' (layout(location=0 ) in 4-component vector of float)
+0:9      move second child to first child (temp 2-component vector of float)
+0:?         'v' (layout(location=2 ) out 2-component vector of float)
+0:9        Constant:
+0:9          2.000000
+0:9          2.000000
+0:10      move second child to first child (temp 2-component vector of int)
+0:?         'i' (layout(location=3 ) out 2-component vector of int)
+0:10        Constant:
+0:10          3 (const int)
+0:10          3 (const int)
+0:12      move second child to first child (temp 2-component vector of float)
+0:12        v: direct index for structure (temp 2-component vector of float)
+0:12          'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          12.000000
+0:12          12.000000
+0:13      move second child to first child (temp 2-component vector of int)
+0:13        i: direct index for structure (temp 2-component vector of int)
+0:13          'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          13 (const int)
+0:13          13 (const int)
+0:?       Sequence
+0:14        move second child to first child (temp 2-component vector of float)
+0:?           'v' (layout(location=4 ) out 2-component vector of float)
+0:14          v: direct index for structure (temp 2-component vector of float)
+0:14            'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:14            Constant:
+0:14              0 (const int)
+0:14        move second child to first child (temp 2-component vector of int)
+0:?           'i' (layout(location=5 ) out 2-component vector of int)
+0:14          i: direct index for structure (temp 2-component vector of int)
+0:14            'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:14            Constant:
+0:14              1 (const int)
+0:16      Sequence
+0:16        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:16          'out1' (layout(location=1 ) out 4-component vector of float)
+0:16        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+0:?     'out1' (layout(location=1 ) out 4-component vector of float)
+0:?     'v' (layout(location=2 ) out 2-component vector of float)
+0:?     'i' (layout(location=3 ) out 2-component vector of int)
+0:?     'v' (layout(location=4 ) out 2-component vector of float)
+0:?     'i' (layout(location=5 ) out 2-component vector of int)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: PixelShaderFunction(vf4;vf4;struct-OutParam-vf2-vi21;struct-OutParam-vf2-vi21; (global 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'input' (layout(location=0 ) in 4-component vector of float)
+0:7      'out1' (layout(location=1 ) out 4-component vector of float)
+0:7      'out2' (out structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:7      'out3' (out structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:?     Sequence
+0:8      move second child to first child (temp 4-component vector of float)
+0:8        'out1' (layout(location=1 ) out 4-component vector of float)
+0:8        'input' (layout(location=0 ) in 4-component vector of float)
+0:9      move second child to first child (temp 2-component vector of float)
+0:?         'v' (layout(location=2 ) out 2-component vector of float)
+0:9        Constant:
+0:9          2.000000
+0:9          2.000000
+0:10      move second child to first child (temp 2-component vector of int)
+0:?         'i' (layout(location=3 ) out 2-component vector of int)
+0:10        Constant:
+0:10          3 (const int)
+0:10          3 (const int)
+0:12      move second child to first child (temp 2-component vector of float)
+0:12        v: direct index for structure (temp 2-component vector of float)
+0:12          'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          12.000000
+0:12          12.000000
+0:13      move second child to first child (temp 2-component vector of int)
+0:13        i: direct index for structure (temp 2-component vector of int)
+0:13          'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          13 (const int)
+0:13          13 (const int)
+0:?       Sequence
+0:14        move second child to first child (temp 2-component vector of float)
+0:?           'v' (layout(location=4 ) out 2-component vector of float)
+0:14          v: direct index for structure (temp 2-component vector of float)
+0:14            'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:14            Constant:
+0:14              0 (const int)
+0:14        move second child to first child (temp 2-component vector of int)
+0:?           'i' (layout(location=5 ) out 2-component vector of int)
+0:14          i: direct index for structure (temp 2-component vector of int)
+0:14            'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i})
+0:14            Constant:
+0:14              1 (const int)
+0:16      Sequence
+0:16        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:16          'out1' (layout(location=1 ) out 4-component vector of float)
+0:16        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+0:?     'out1' (layout(location=1 ) out 4-component vector of float)
+0:?     'v' (layout(location=2 ) out 2-component vector of float)
+0:?     'i' (layout(location=3 ) out 2-component vector of int)
+0:?     'v' (layout(location=4 ) out 2-component vector of float)
+0:?     'i' (layout(location=5 ) out 2-component vector of int)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 46
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11 15 21 37 40 43
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "PixelShaderFunction"
+                              Name 9  "out1"
+                              Name 11  "input"
+                              Name 15  "v"
+                              Name 21  "i"
+                              Name 24  "OutParam"
+                              MemberName 24(OutParam) 0  "v"
+                              MemberName 24(OutParam) 1  "i"
+                              Name 26  "local"
+                              Name 37  "v"
+                              Name 40  "i"
+                              Name 43  "@entryPointOutput"
+                              Decorate 9(out1) Location 1
+                              Decorate 11(input) Location 0
+                              Decorate 15(v) Location 2
+                              Decorate 21(i) Location 3
+                              Decorate 37(v) Location 4
+                              Decorate 40(i) Location 5
+                              Decorate 43(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+         9(out1):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+       11(input):     10(ptr) Variable Input
+              13:             TypeVector 6(float) 2
+              14:             TypePointer Output 13(fvec2)
+           15(v):     14(ptr) Variable Output
+              16:    6(float) Constant 1073741824
+              17:   13(fvec2) ConstantComposite 16 16
+              18:             TypeInt 32 1
+              19:             TypeVector 18(int) 2
+              20:             TypePointer Output 19(ivec2)
+           21(i):     20(ptr) Variable Output
+              22:     18(int) Constant 3
+              23:   19(ivec2) ConstantComposite 22 22
+    24(OutParam):             TypeStruct 13(fvec2) 19(ivec2)
+              25:             TypePointer Function 24(OutParam)
+              27:     18(int) Constant 0
+              28:    6(float) Constant 1094713344
+              29:   13(fvec2) ConstantComposite 28 28
+              30:             TypePointer Function 13(fvec2)
+              32:     18(int) Constant 1
+              33:     18(int) Constant 13
+              34:   19(ivec2) ConstantComposite 33 33
+              35:             TypePointer Function 19(ivec2)
+           37(v):     14(ptr) Variable Output
+           40(i):     20(ptr) Variable Output
+43(@entryPointOutput):      8(ptr) Variable Output
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+       26(local):     25(ptr) Variable Function
+              12:    7(fvec4) Load 11(input)
+                              Store 9(out1) 12
+                              Store 15(v) 17
+                              Store 21(i) 23
+              31:     30(ptr) AccessChain 26(local) 27
+                              Store 31 29
+              36:     35(ptr) AccessChain 26(local) 32
+                              Store 36 34
+              38:     30(ptr) AccessChain 26(local) 27
+              39:   13(fvec2) Load 38
+                              Store 37(v) 39
+              41:     35(ptr) AccessChain 26(local) 32
+              42:   19(ivec2) Load 41
+                              Store 40(i) 42
+              44:    7(fvec4) Load 9(out1)
+                              Store 43(@entryPointOutput) 44
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.float1.frag.out b/Test/baseResults/hlsl.float1.frag.out
index 07de03e..313be0b 100755
--- a/Test/baseResults/hlsl.float1.frag.out
+++ b/Test/baseResults/hlsl.float1.frag.out
@@ -12,7 +12,7 @@
 0:2      'scalar' (global float)
 0:2      Constant:
 0:2        2.000000
-0:8  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
+0:5  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
 0:5    Function Parameters: 
 0:5      'inFloat1' (in 1-component vector of float)
 0:5      'inScalar' (in float)
@@ -46,7 +46,7 @@
 0:2      'scalar' (global float)
 0:2      Constant:
 0:2        2.000000
-0:8  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
+0:5  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
 0:5    Function Parameters: 
 0:5      'inFloat1' (in 1-component vector of float)
 0:5      'inScalar' (in float)
@@ -72,7 +72,6 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "PixelShaderFunction"
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 11  "ShaderFunction(vf1;f1;"
                               Name 9  "inFloat1"
diff --git a/Test/baseResults/hlsl.float4.frag.out b/Test/baseResults/hlsl.float4.frag.out
index 370a506..85b3c9b 100755
--- a/Test/baseResults/hlsl.float4.frag.out
+++ b/Test/baseResults/hlsl.float4.frag.out
@@ -13,7 +13,7 @@
 0:?         0.500000
 0:?         0.000000
 0:?         1.000000
-0:12  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
+0:9  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
 0:9    Function Parameters: 
 0:9      'input' (in 4-component vector of float)
 0:?     Sequence
@@ -26,7 +26,7 @@
 0:?     'ff1' (global bool Face)
 0:?     'ff2' (layout(offset=4 ) global 4-component vector of float)
 0:?     'ff3' (layout(binding=0 offset=4 ) global 4-component vector of float)
-0:?     'ff4' (layout(binding=1 offset=4 ) global 4-component vector of float FragCoord)
+0:?     'ff4' (layout(binding=1 offset=4 ) global 4-component vector of float)
 
 
 Linked fragment stage:
@@ -43,7 +43,7 @@
 0:?         0.500000
 0:?         0.000000
 0:?         1.000000
-0:12  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
+0:9  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
 0:9    Function Parameters: 
 0:9      'input' (in 4-component vector of float)
 0:?     Sequence
@@ -56,7 +56,7 @@
 0:?     'ff1' (global bool Face)
 0:?     'ff2' (layout(offset=4 ) global 4-component vector of float)
 0:?     'ff3' (layout(binding=0 offset=4 ) global 4-component vector of float)
-0:?     'ff4' (layout(binding=1 offset=4 ) global 4-component vector of float FragCoord)
+0:?     'ff4' (layout(binding=1 offset=4 ) global 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
@@ -67,7 +67,6 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "PixelShaderFunction"
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 11  "ShaderFunction(vf4;"
                               Name 10  "input"
@@ -82,7 +81,6 @@
                               Decorate 28(ff3) Binding 0
                               Decorate 29(ff4) Offset 4
                               Decorate 29(ff4) Binding 1
-                              Decorate 29(ff4) BuiltIn FragCoord
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/hlsl.forLoop.frag.out b/Test/baseResults/hlsl.forLoop.frag.out
index 9764e26..ba8e32e 100755
--- a/Test/baseResults/hlsl.forLoop.frag.out
+++ b/Test/baseResults/hlsl.forLoop.frag.out
@@ -2,9 +2,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:?       Sequence
 0:3        Loop with condition tested first
@@ -12,7 +12,7 @@
 0:3          No loop body
 0:4      Sequence
 0:4        Pre-Increment (temp 4-component vector of float)
-0:4          'input' (in 4-component vector of float)
+0:4          'input' (layout(location=0 ) in 4-component vector of float)
 0:4        Loop with condition tested first
 0:4          No loop condition
 0:4          No loop body
@@ -20,36 +20,42 @@
 0:5        Loop with condition tested first
 0:5          Loop Condition
 0:5          Compare Not Equal (temp bool)
-0:5            'input' (in 4-component vector of float)
-0:5            'input' (in 4-component vector of float)
+0:5            'input' (layout(location=0 ) in 4-component vector of float)
+0:5            'input' (layout(location=0 ) in 4-component vector of float)
 0:5          No loop body
 0:?       Sequence
 0:6        Loop with condition tested first
 0:6          Loop Condition
 0:6          Compare Not Equal (temp bool)
-0:6            'input' (in 4-component vector of float)
-0:6            'input' (in 4-component vector of float)
+0:6            'input' (layout(location=0 ) in 4-component vector of float)
+0:6            'input' (layout(location=0 ) in 4-component vector of float)
 0:6          Loop Body
 0:?           Sequence
-0:6            Branch: Return with expression
-0:6              Negate value (temp 4-component vector of float)
-0:6                'input' (in 4-component vector of float)
+0:6            Sequence
+0:6              move second child to first child (temp 4-component vector of float)
+0:?                 '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:6                Negate value (temp 4-component vector of float)
+0:6                  'input' (layout(location=0 ) in 4-component vector of float)
+0:6              Branch: Return
 0:7      Sequence
 0:7        Pre-Decrement (temp 4-component vector of float)
-0:7          'input' (in 4-component vector of float)
+0:7          'input' (layout(location=0 ) in 4-component vector of float)
 0:7        Loop with condition tested first
 0:7          Loop Condition
 0:7          Compare Not Equal (temp bool)
-0:7            'input' (in 4-component vector of float)
-0:7            'input' (in 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
 0:7          Loop Body
 0:?           Sequence
-0:7            Branch: Return with expression
-0:7              Negate value (temp 4-component vector of float)
-0:7                'input' (in 4-component vector of float)
+0:7            Sequence
+0:7              move second child to first child (temp 4-component vector of float)
+0:?                 '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:7                Negate value (temp 4-component vector of float)
+0:7                  'input' (layout(location=0 ) in 4-component vector of float)
+0:7              Branch: Return
 0:7          Loop Terminal Expression
 0:7          add second child into first child (temp 4-component vector of float)
-0:7            'input' (in 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
 0:7            Constant:
 0:7              2.000000
 0:?       Sequence
@@ -60,7 +66,7 @@
 0:8            Condition
 0:8            Compare Greater Than (temp bool)
 0:8              direct index (temp float)
-0:8                'input' (in 4-component vector of float)
+0:8                'input' (layout(location=0 ) in 4-component vector of float)
 0:8                Constant:
 0:8                  0 (const int)
 0:8              Constant:
@@ -75,7 +81,7 @@
 0:9            Condition
 0:9            Compare Greater Than (temp bool)
 0:9              direct index (temp float)
-0:9                'input' (in 4-component vector of float)
+0:9                'input' (layout(location=0 ) in 4-component vector of float)
 0:9                Constant:
 0:9                  0 (const int)
 0:9              Constant:
@@ -108,6 +114,8 @@
 0:12      Pre-Decrement (temp float)
 0:12        'ii' (temp float)
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -116,9 +124,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:?       Sequence
 0:3        Loop with condition tested first
@@ -126,7 +134,7 @@
 0:3          No loop body
 0:4      Sequence
 0:4        Pre-Increment (temp 4-component vector of float)
-0:4          'input' (in 4-component vector of float)
+0:4          'input' (layout(location=0 ) in 4-component vector of float)
 0:4        Loop with condition tested first
 0:4          No loop condition
 0:4          No loop body
@@ -134,36 +142,42 @@
 0:5        Loop with condition tested first
 0:5          Loop Condition
 0:5          Compare Not Equal (temp bool)
-0:5            'input' (in 4-component vector of float)
-0:5            'input' (in 4-component vector of float)
+0:5            'input' (layout(location=0 ) in 4-component vector of float)
+0:5            'input' (layout(location=0 ) in 4-component vector of float)
 0:5          No loop body
 0:?       Sequence
 0:6        Loop with condition tested first
 0:6          Loop Condition
 0:6          Compare Not Equal (temp bool)
-0:6            'input' (in 4-component vector of float)
-0:6            'input' (in 4-component vector of float)
+0:6            'input' (layout(location=0 ) in 4-component vector of float)
+0:6            'input' (layout(location=0 ) in 4-component vector of float)
 0:6          Loop Body
 0:?           Sequence
-0:6            Branch: Return with expression
-0:6              Negate value (temp 4-component vector of float)
-0:6                'input' (in 4-component vector of float)
+0:6            Sequence
+0:6              move second child to first child (temp 4-component vector of float)
+0:?                 '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:6                Negate value (temp 4-component vector of float)
+0:6                  'input' (layout(location=0 ) in 4-component vector of float)
+0:6              Branch: Return
 0:7      Sequence
 0:7        Pre-Decrement (temp 4-component vector of float)
-0:7          'input' (in 4-component vector of float)
+0:7          'input' (layout(location=0 ) in 4-component vector of float)
 0:7        Loop with condition tested first
 0:7          Loop Condition
 0:7          Compare Not Equal (temp bool)
-0:7            'input' (in 4-component vector of float)
-0:7            'input' (in 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
 0:7          Loop Body
 0:?           Sequence
-0:7            Branch: Return with expression
-0:7              Negate value (temp 4-component vector of float)
-0:7                'input' (in 4-component vector of float)
+0:7            Sequence
+0:7              move second child to first child (temp 4-component vector of float)
+0:?                 '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:7                Negate value (temp 4-component vector of float)
+0:7                  'input' (layout(location=0 ) in 4-component vector of float)
+0:7              Branch: Return
 0:7          Loop Terminal Expression
 0:7          add second child into first child (temp 4-component vector of float)
-0:7            'input' (in 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
 0:7            Constant:
 0:7              2.000000
 0:?       Sequence
@@ -174,7 +188,7 @@
 0:8            Condition
 0:8            Compare Greater Than (temp bool)
 0:8              direct index (temp float)
-0:8                'input' (in 4-component vector of float)
+0:8                'input' (layout(location=0 ) in 4-component vector of float)
 0:8                Constant:
 0:8                  0 (const int)
 0:8              Constant:
@@ -189,7 +203,7 @@
 0:9            Condition
 0:9            Compare Greater Than (temp bool)
 0:9              direct index (temp float)
-0:9                'input' (in 4-component vector of float)
+0:9                'input' (layout(location=0 ) in 4-component vector of float)
 0:9                Constant:
 0:9                  0 (const int)
 0:9              Constant:
@@ -222,21 +236,25 @@
 0:12      Pre-Decrement (temp float)
 0:12        'ii' (temp float)
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 112
+// Id's are bound by 114
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 13
+                              EntryPoint Fragment 4  "PixelShaderFunction" 13 43
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 13  "input"
-                              Name 89  "ii"
-                              Name 109  "ii"
+                              Name 43  "@entryPointOutput"
+                              Name 91  "ii"
+                              Name 111  "ii"
+                              Decorate 13(input) Location 0
+                              Decorate 43(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
@@ -246,21 +264,23 @@
               15:   10(float) Constant 1065353216
               29:             TypeBool
               30:             TypeVector 29(bool) 4
-              60:   10(float) Constant 1073741824
-              68:             TypeInt 32 0
-              69:     68(int) Constant 0
-              70:             TypePointer Input 10(float)
-              87:             TypeInt 32 1
-              88:             TypePointer Function 87(int)
-              90:     87(int) Constant 4294967295
-              97:     87(int) Constant 3
-             100:     87(int) Constant 2
-             106:     87(int) Constant 1
-             108:             TypePointer Function 10(float)
+              42:             TypePointer Output 11(fvec4)
+43(@entryPointOutput):     42(ptr) Variable Output
+              62:   10(float) Constant 1073741824
+              70:             TypeInt 32 0
+              71:     70(int) Constant 0
+              72:             TypePointer Input 10(float)
+              89:             TypeInt 32 1
+              90:             TypePointer Function 89(int)
+              92:     89(int) Constant 4294967295
+              99:     89(int) Constant 3
+             102:     89(int) Constant 2
+             108:     89(int) Constant 1
+             110:             TypePointer Function 10(float)
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-          89(ii):     88(ptr) Variable Function
-         109(ii):    108(ptr) Variable Function
+          91(ii):     90(ptr) Variable Function
+         111(ii):    110(ptr) Variable Function
                               Branch 6
                6:             Label
                               LoopMerge 8 9 None
@@ -309,97 +329,99 @@
               41:    29(bool) Any 40
                               BranchConditional 41 34 35
               34:               Label
-              42:   11(fvec4)   Load 13(input)
-              43:   11(fvec4)   FNegate 42
-                                ReturnValue 43
+              44:   11(fvec4)   Load 13(input)
+              45:   11(fvec4)   FNegate 44
+                                Store 43(@entryPointOutput) 45
+                                Return
               36:               Label
                                 Branch 33
               35:             Label
-              45:   11(fvec4) Load 13(input)
-              46:   11(fvec4) CompositeConstruct 15 15 15 15
-              47:   11(fvec4) FSub 45 46
-                              Store 13(input) 47
-                              Branch 48
-              48:             Label
-                              LoopMerge 50 51 None
-                              Branch 52
-              52:             Label
-              53:   11(fvec4) Load 13(input)
-              54:   11(fvec4) Load 13(input)
-              55:   30(bvec4) FOrdNotEqual 53 54
-              56:    29(bool) Any 55
-                              BranchConditional 56 49 50
-              49:               Label
-              57:   11(fvec4)   Load 13(input)
-              58:   11(fvec4)   FNegate 57
-                                ReturnValue 58
-              51:               Label
-              61:   11(fvec4)   Load 13(input)
-              62:   11(fvec4)   CompositeConstruct 60 60 60 60
-              63:   11(fvec4)   FAdd 61 62
-                                Store 13(input) 63
-                                Branch 48
+              47:   11(fvec4) Load 13(input)
+              48:   11(fvec4) CompositeConstruct 15 15 15 15
+              49:   11(fvec4) FSub 47 48
+                              Store 13(input) 49
+                              Branch 50
               50:             Label
-                              Branch 64
-              64:             Label
-                              LoopMerge 66 67 None
-                              Branch 65
-              65:             Label
-              71:     70(ptr) AccessChain 13(input) 69
-              72:   10(float) Load 71
-              73:    29(bool) FOrdGreaterThan 72 60
-                              SelectionMerge 75 None
-                              BranchConditional 73 74 75
-              74:               Label
-                                Branch 66
-              75:             Label
+                              LoopMerge 52 53 None
+                              Branch 54
+              54:             Label
+              55:   11(fvec4) Load 13(input)
+              56:   11(fvec4) Load 13(input)
+              57:   30(bvec4) FOrdNotEqual 55 56
+              58:    29(bool) Any 57
+                              BranchConditional 58 51 52
+              51:               Label
+              59:   11(fvec4)   Load 13(input)
+              60:   11(fvec4)   FNegate 59
+                                Store 43(@entryPointOutput) 60
+                                Return
+              53:               Label
+              63:   11(fvec4)   Load 13(input)
+              64:   11(fvec4)   CompositeConstruct 62 62 62 62
+              65:   11(fvec4)   FAdd 63 64
+                                Store 13(input) 65
+                                Branch 50
+              52:             Label
+                              Branch 66
+              66:             Label
+                              LoopMerge 68 69 None
                               Branch 67
               67:             Label
-                              Branch 64
-              66:             Label
-                              Branch 77
+              73:     72(ptr) AccessChain 13(input) 71
+              74:   10(float) Load 73
+              75:    29(bool) FOrdGreaterThan 74 62
+                              SelectionMerge 77 None
+                              BranchConditional 75 76 77
+              76:               Label
+                                Branch 68
               77:             Label
-                              LoopMerge 79 80 None
-                              Branch 78
-              78:             Label
-              81:     70(ptr) AccessChain 13(input) 69
-              82:   10(float) Load 81
-              83:    29(bool) FOrdGreaterThan 82 60
-                              SelectionMerge 85 None
-                              BranchConditional 83 84 85
-              84:               Label
-                                Branch 80
-              85:             Label
+                              Branch 69
+              69:             Label
+                              Branch 66
+              68:             Label
+                              Branch 79
+              79:             Label
+                              LoopMerge 81 82 None
                               Branch 80
               80:             Label
-                              Branch 77
-              79:             Label
-                              Store 89(ii) 90
-                              Branch 91
-              91:             Label
-                              LoopMerge 93 94 None
-                              Branch 95
-              95:             Label
-              96:     87(int) Load 89(ii)
-              98:    29(bool) SLessThan 96 97
-                              BranchConditional 98 92 93
-              92:               Label
-              99:     87(int)   Load 89(ii)
-             101:    29(bool)   IEqual 99 100
-                                SelectionMerge 103 None
-                                BranchConditional 101 102 103
-             102:                 Label
-                                  Branch 94
-             103:               Label
-                                Branch 94
-              94:               Label
-             105:     87(int)   Load 89(ii)
-             107:     87(int)   IAdd 105 106
-                                Store 89(ii) 107
-                                Branch 91
+              83:     72(ptr) AccessChain 13(input) 71
+              84:   10(float) Load 83
+              85:    29(bool) FOrdGreaterThan 84 62
+                              SelectionMerge 87 None
+                              BranchConditional 85 86 87
+              86:               Label
+                                Branch 82
+              87:             Label
+                              Branch 82
+              82:             Label
+                              Branch 79
+              81:             Label
+                              Store 91(ii) 92
+                              Branch 93
               93:             Label
-             110:   10(float) Load 109(ii)
-             111:   10(float) FSub 110 15
-                              Store 109(ii) 111
+                              LoopMerge 95 96 None
+                              Branch 97
+              97:             Label
+              98:     89(int) Load 91(ii)
+             100:    29(bool) SLessThan 98 99
+                              BranchConditional 100 94 95
+              94:               Label
+             101:     89(int)   Load 91(ii)
+             103:    29(bool)   IEqual 101 102
+                                SelectionMerge 105 None
+                                BranchConditional 103 104 105
+             104:                 Label
+                                  Branch 96
+             105:               Label
+                                Branch 96
+              96:               Label
+             107:     89(int)   Load 91(ii)
+             109:     89(int)   IAdd 107 108
+                                Store 91(ii) 109
+                                Branch 93
+              95:             Label
+             112:   10(float) Load 111(ii)
+             113:   10(float) FSub 112 15
+                              Store 111(ii) 113
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gather.array.dx10.frag.out b/Test/baseResults/hlsl.gather.array.dx10.frag.out
index 70d1bf1..d2545cc 100644
--- a/Test/baseResults/hlsl.gather.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.array.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:29      Sequence
@@ -76,7 +76,7 @@
 0:?               1.000000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -85,14 +85,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -105,6 +118,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -113,7 +128,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:29      Sequence
@@ -187,7 +202,7 @@
 0:?               1.000000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -196,14 +211,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -216,19 +244,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 110
+// Id's are bound by 117
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 99 103
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval20"
                               Name 12  "g_tTex2df4a"
@@ -247,10 +276,12 @@
                               MemberName 90(PS_OUTPUT) 0  "Color"
                               MemberName 90(PS_OUTPUT) 1  "Depth"
                               Name 92  "psout"
-                              Name 102  "g_tTex1df4a"
-                              Name 103  "g_tTex1df4"
-                              Name 106  "g_tTex1di4a"
-                              Name 109  "g_tTex1du4a"
+                              Name 99  "Color"
+                              Name 103  "Depth"
+                              Name 109  "g_tTex1df4a"
+                              Name 110  "g_tTex1df4"
+                              Name 113  "g_tTex1di4a"
+                              Name 116  "g_tTex1du4a"
                               Decorate 12(g_tTex2df4a) DescriptorSet 0
                               Decorate 16(g_sSamp) DescriptorSet 0
                               Decorate 16(g_sSamp) Binding 0
@@ -259,13 +290,14 @@
                               Decorate 60(g_tTexcdf4a) DescriptorSet 0
                               Decorate 70(g_tTexcdi4a) DescriptorSet 0
                               Decorate 80(g_tTexcdu4a) DescriptorSet 0
-                              MemberDecorate 90(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 102(g_tTex1df4a) DescriptorSet 0
-                              Decorate 102(g_tTex1df4a) Binding 1
-                              Decorate 103(g_tTex1df4) DescriptorSet 0
-                              Decorate 103(g_tTex1df4) Binding 0
-                              Decorate 106(g_tTex1di4a) DescriptorSet 0
-                              Decorate 109(g_tTex1du4a) DescriptorSet 0
+                              Decorate 99(Color) Location 0
+                              Decorate 103(Depth) BuiltIn FragDepth
+                              Decorate 109(g_tTex1df4a) DescriptorSet 0
+                              Decorate 109(g_tTex1df4a) Binding 1
+                              Decorate 110(g_tTex1df4) DescriptorSet 0
+                              Decorate 110(g_tTex1df4) Binding 0
+                              Decorate 113(g_tTex1di4a) DescriptorSet 0
+                              Decorate 116(g_tTex1du4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -327,16 +359,20 @@
               93:    7(fvec4) ConstantComposite 87 87 87 87
               95:     25(int) Constant 1
               96:             TypePointer Function 6(float)
-             100:             TypeImage 6(float) 1D array sampled format:Unknown
-             101:             TypePointer UniformConstant 100
-102(g_tTex1df4a):    101(ptr) Variable UniformConstant
- 103(g_tTex1df4):    101(ptr) Variable UniformConstant
-             104:             TypeImage 25(int) 1D array sampled format:Unknown
-             105:             TypePointer UniformConstant 104
-106(g_tTex1di4a):    105(ptr) Variable UniformConstant
-             107:             TypeImage 42(int) 1D array sampled format:Unknown
+              98:             TypePointer Output 7(fvec4)
+       99(Color):     98(ptr) Variable Output
+             102:             TypePointer Output 6(float)
+      103(Depth):    102(ptr) Variable Output
+             107:             TypeImage 6(float) 1D array sampled format:Unknown
              108:             TypePointer UniformConstant 107
-109(g_tTex1du4a):    108(ptr) Variable UniformConstant
+109(g_tTex1df4a):    108(ptr) Variable UniformConstant
+ 110(g_tTex1df4):    108(ptr) Variable UniformConstant
+             111:             TypeImage 25(int) 1D array sampled format:Unknown
+             112:             TypePointer UniformConstant 111
+113(g_tTex1di4a):    112(ptr) Variable UniformConstant
+             114:             TypeImage 42(int) 1D array sampled format:Unknown
+             115:             TypePointer UniformConstant 114
+116(g_tTex1du4a):    115(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval20):      8(ptr) Variable Function
@@ -380,6 +416,11 @@
                               Store 94 93
               97:     96(ptr) AccessChain 92(psout) 95
                               Store 97 87
-              98:90(PS_OUTPUT) Load 92(psout)
-                              ReturnValue 98
+             100:      8(ptr) AccessChain 92(psout) 26
+             101:    7(fvec4) Load 100
+                              Store 99(Color) 101
+             104:     96(ptr) AccessChain 92(psout) 95
+             105:    6(float) Load 104
+                              Store 103(Depth) 105
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gather.basic.dx10.frag.out b/Test/baseResults/hlsl.gather.basic.dx10.frag.out
index c52d7cd..52648f7 100644
--- a/Test/baseResults/hlsl.gather.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:49  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:29  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:29    Function Parameters: 
 0:?     Sequence
 0:34      Sequence
@@ -70,7 +70,7 @@
 0:?               0.900000
 0:44      move second child to first child (temp 4-component vector of float)
 0:44        Color: direct index for structure (temp 4-component vector of float)
-0:44          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:44          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:44          Constant:
 0:44            0 (const int)
 0:44        Constant:
@@ -79,14 +79,27 @@
 0:44          1.000000
 0:44          1.000000
 0:45      move second child to first child (temp float)
-0:45        Depth: direct index for structure (temp float FragDepth)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45        Depth: direct index for structure (temp float)
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            1 (const int)
 0:45        Constant:
 0:45          1.000000
-0:47      Branch: Return with expression
-0:47        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:47          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:47            Color: direct index for structure (temp 4-component vector of float)
+0:47              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:47              Constant:
+0:47                0 (const int)
+0:47          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:47            Depth: direct index for structure (temp float)
+0:47              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:47              Constant:
+0:47                1 (const int)
+0:47        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -103,6 +116,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -111,7 +126,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:49  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:29  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:29    Function Parameters: 
 0:?     Sequence
 0:34      Sequence
@@ -179,7 +194,7 @@
 0:?               0.900000
 0:44      move second child to first child (temp 4-component vector of float)
 0:44        Color: direct index for structure (temp 4-component vector of float)
-0:44          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:44          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:44          Constant:
 0:44            0 (const int)
 0:44        Constant:
@@ -188,14 +203,27 @@
 0:44          1.000000
 0:44          1.000000
 0:45      move second child to first child (temp float)
-0:45        Depth: direct index for structure (temp float FragDepth)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45        Depth: direct index for structure (temp float)
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            1 (const int)
 0:45        Constant:
 0:45          1.000000
-0:47      Branch: Return with expression
-0:47        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:47          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:47            Color: direct index for structure (temp 4-component vector of float)
+0:47              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:47              Constant:
+0:47                0 (const int)
+0:47          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:47            Depth: direct index for structure (temp float)
+0:47              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:47              Constant:
+0:47                1 (const int)
+0:47        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -212,18 +240,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 121
+// Id's are bound by 128
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 100 104
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval20"
                               Name 12  "g_tTex2df4"
@@ -242,14 +271,16 @@
                               MemberName 90(PS_OUTPUT) 0  "Color"
                               MemberName 90(PS_OUTPUT) 1  "Depth"
                               Name 92  "psout"
-                              Name 101  "g_sSamp2d"
-                              Name 104  "g_tTex1df4a"
-                              Name 105  "g_tTex1df4"
-                              Name 108  "g_tTex1di4"
-                              Name 111  "g_tTex1du4"
-                              Name 114  "g_tTex3df4"
-                              Name 117  "g_tTex3di4"
-                              Name 120  "g_tTex3du4"
+                              Name 100  "Color"
+                              Name 104  "Depth"
+                              Name 108  "g_sSamp2d"
+                              Name 111  "g_tTex1df4a"
+                              Name 112  "g_tTex1df4"
+                              Name 115  "g_tTex1di4"
+                              Name 118  "g_tTex1du4"
+                              Name 121  "g_tTex3df4"
+                              Name 124  "g_tTex3di4"
+                              Name 127  "g_tTex3du4"
                               Decorate 12(g_tTex2df4) DescriptorSet 0
                               Decorate 16(g_sSamp) DescriptorSet 0
                               Decorate 16(g_sSamp) Binding 0
@@ -258,17 +289,18 @@
                               Decorate 59(g_tTexcdf4) DescriptorSet 0
                               Decorate 70(g_tTexcdi4) DescriptorSet 0
                               Decorate 80(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 90(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 101(g_sSamp2d) DescriptorSet 0
-                              Decorate 104(g_tTex1df4a) DescriptorSet 0
-                              Decorate 104(g_tTex1df4a) Binding 1
-                              Decorate 105(g_tTex1df4) DescriptorSet 0
-                              Decorate 105(g_tTex1df4) Binding 0
-                              Decorate 108(g_tTex1di4) DescriptorSet 0
-                              Decorate 111(g_tTex1du4) DescriptorSet 0
-                              Decorate 114(g_tTex3df4) DescriptorSet 0
-                              Decorate 117(g_tTex3di4) DescriptorSet 0
-                              Decorate 120(g_tTex3du4) DescriptorSet 0
+                              Decorate 100(Color) Location 0
+                              Decorate 104(Depth) BuiltIn FragDepth
+                              Decorate 108(g_sSamp2d) DescriptorSet 0
+                              Decorate 111(g_tTex1df4a) DescriptorSet 0
+                              Decorate 111(g_tTex1df4a) Binding 1
+                              Decorate 112(g_tTex1df4) DescriptorSet 0
+                              Decorate 112(g_tTex1df4) Binding 0
+                              Decorate 115(g_tTex1di4) DescriptorSet 0
+                              Decorate 118(g_tTex1du4) DescriptorSet 0
+                              Decorate 121(g_tTex3df4) DescriptorSet 0
+                              Decorate 124(g_tTex3di4) DescriptorSet 0
+                              Decorate 127(g_tTex3du4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -331,26 +363,30 @@
               94:    7(fvec4) ConstantComposite 93 93 93 93
               96:     24(int) Constant 1
               97:             TypePointer Function 6(float)
-  101(g_sSamp2d):     15(ptr) Variable UniformConstant
-             102:             TypeImage 6(float) 1D sampled format:Unknown
-             103:             TypePointer UniformConstant 102
-104(g_tTex1df4a):    103(ptr) Variable UniformConstant
- 105(g_tTex1df4):    103(ptr) Variable UniformConstant
-             106:             TypeImage 24(int) 1D sampled format:Unknown
-             107:             TypePointer UniformConstant 106
- 108(g_tTex1di4):    107(ptr) Variable UniformConstant
-             109:             TypeImage 41(int) 1D sampled format:Unknown
+              99:             TypePointer Output 7(fvec4)
+      100(Color):     99(ptr) Variable Output
+             103:             TypePointer Output 6(float)
+      104(Depth):    103(ptr) Variable Output
+  108(g_sSamp2d):     15(ptr) Variable UniformConstant
+             109:             TypeImage 6(float) 1D sampled format:Unknown
              110:             TypePointer UniformConstant 109
- 111(g_tTex1du4):    110(ptr) Variable UniformConstant
-             112:             TypeImage 6(float) 3D sampled format:Unknown
-             113:             TypePointer UniformConstant 112
- 114(g_tTex3df4):    113(ptr) Variable UniformConstant
-             115:             TypeImage 24(int) 3D sampled format:Unknown
-             116:             TypePointer UniformConstant 115
- 117(g_tTex3di4):    116(ptr) Variable UniformConstant
-             118:             TypeImage 41(int) 3D sampled format:Unknown
-             119:             TypePointer UniformConstant 118
- 120(g_tTex3du4):    119(ptr) Variable UniformConstant
+111(g_tTex1df4a):    110(ptr) Variable UniformConstant
+ 112(g_tTex1df4):    110(ptr) Variable UniformConstant
+             113:             TypeImage 24(int) 1D sampled format:Unknown
+             114:             TypePointer UniformConstant 113
+ 115(g_tTex1di4):    114(ptr) Variable UniformConstant
+             116:             TypeImage 41(int) 1D sampled format:Unknown
+             117:             TypePointer UniformConstant 116
+ 118(g_tTex1du4):    117(ptr) Variable UniformConstant
+             119:             TypeImage 6(float) 3D sampled format:Unknown
+             120:             TypePointer UniformConstant 119
+ 121(g_tTex3df4):    120(ptr) Variable UniformConstant
+             122:             TypeImage 24(int) 3D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex3di4):    123(ptr) Variable UniformConstant
+             125:             TypeImage 41(int) 3D sampled format:Unknown
+             126:             TypePointer UniformConstant 125
+ 127(g_tTex3du4):    126(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval20):      8(ptr) Variable Function
@@ -394,6 +430,11 @@
                               Store 95 94
               98:     97(ptr) AccessChain 92(psout) 96
                               Store 98 93
-              99:90(PS_OUTPUT) Load 92(psout)
-                              ReturnValue 99
+             101:      8(ptr) AccessChain 92(psout) 25
+             102:    7(fvec4) Load 101
+                              Store 100(Color) 102
+             105:     97(ptr) AccessChain 92(psout) 96
+             106:    6(float) Load 105
+                              Store 104(Depth) 106
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gather.basic.dx10.vert.out b/Test/baseResults/hlsl.gather.basic.dx10.vert.out
index 667c39f..1f01fc3 100644
--- a/Test/baseResults/hlsl.gather.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.gather.basic.dx10.vert.out
@@ -1,7 +1,7 @@
 hlsl.gather.basic.dx10.vert
 Shader version: 450
 0:? Sequence
-0:47  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:28    Function Parameters: 
 0:?     Sequence
 0:33      Sequence
@@ -68,8 +68,8 @@
 0:?               0.800000
 0:?               0.900000
 0:43      move second child to first child (temp 4-component vector of float)
-0:43        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:43          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:43        Pos: direct index for structure (temp 4-component vector of float)
+0:43          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:43          Constant:
 0:43            0 (const int)
 0:?         Constant:
@@ -77,8 +77,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:45      Branch: Return with expression
-0:45        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:45          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:45            Pos: direct index for structure (temp 4-component vector of float)
+0:45              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:45              Constant:
+0:45                0 (const int)
+0:45        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -95,6 +102,7 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Pos' (out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -102,7 +110,7 @@
 
 Shader version: 450
 0:? Sequence
-0:47  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:28    Function Parameters: 
 0:?     Sequence
 0:33      Sequence
@@ -169,8 +177,8 @@
 0:?               0.800000
 0:?               0.900000
 0:43      move second child to first child (temp 4-component vector of float)
-0:43        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:43          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:43        Pos: direct index for structure (temp 4-component vector of float)
+0:43          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:43          Constant:
 0:43            0 (const int)
 0:?         Constant:
@@ -178,8 +186,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:45      Branch: Return with expression
-0:45        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:45          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:45            Pos: direct index for structure (temp 4-component vector of float)
+0:45              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:45              Constant:
+0:45                0 (const int)
+0:45        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -196,17 +211,17 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Pos' (out 4-component vector of float Position)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 118
+// Id's are bound by 121
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main"
-                              Source HLSL 450
+                              EntryPoint Vertex 4  "main" 97
                               Name 4  "main"
                               Name 9  "txval20"
                               Name 12  "g_tTex2df4"
@@ -224,14 +239,15 @@
                               Name 90  "VS_OUTPUT"
                               MemberName 90(VS_OUTPUT) 0  "Pos"
                               Name 92  "vsout"
-                              Name 98  "g_sSamp2d"
-                              Name 101  "g_tTex1df4a"
-                              Name 102  "g_tTex1df4"
-                              Name 105  "g_tTex1di4"
-                              Name 108  "g_tTex1du4"
-                              Name 111  "g_tTex3df4"
-                              Name 114  "g_tTex3di4"
-                              Name 117  "g_tTex3du4"
+                              Name 97  "Pos"
+                              Name 101  "g_sSamp2d"
+                              Name 104  "g_tTex1df4a"
+                              Name 105  "g_tTex1df4"
+                              Name 108  "g_tTex1di4"
+                              Name 111  "g_tTex1du4"
+                              Name 114  "g_tTex3df4"
+                              Name 117  "g_tTex3di4"
+                              Name 120  "g_tTex3du4"
                               Decorate 12(g_tTex2df4) DescriptorSet 0
                               Decorate 16(g_sSamp) DescriptorSet 0
                               Decorate 16(g_sSamp) Binding 0
@@ -240,17 +256,17 @@
                               Decorate 59(g_tTexcdf4) DescriptorSet 0
                               Decorate 70(g_tTexcdi4) DescriptorSet 0
                               Decorate 80(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 90(VS_OUTPUT) 0 BuiltIn FragCoord
-                              Decorate 98(g_sSamp2d) DescriptorSet 0
-                              Decorate 101(g_tTex1df4a) DescriptorSet 0
-                              Decorate 101(g_tTex1df4a) Binding 1
-                              Decorate 102(g_tTex1df4) DescriptorSet 0
-                              Decorate 102(g_tTex1df4) Binding 0
-                              Decorate 105(g_tTex1di4) DescriptorSet 0
-                              Decorate 108(g_tTex1du4) DescriptorSet 0
-                              Decorate 111(g_tTex3df4) DescriptorSet 0
-                              Decorate 114(g_tTex3di4) DescriptorSet 0
-                              Decorate 117(g_tTex3du4) DescriptorSet 0
+                              Decorate 97(Pos) BuiltIn Position
+                              Decorate 101(g_sSamp2d) DescriptorSet 0
+                              Decorate 104(g_tTex1df4a) DescriptorSet 0
+                              Decorate 104(g_tTex1df4a) Binding 1
+                              Decorate 105(g_tTex1df4) DescriptorSet 0
+                              Decorate 105(g_tTex1df4) Binding 0
+                              Decorate 108(g_tTex1di4) DescriptorSet 0
+                              Decorate 111(g_tTex1du4) DescriptorSet 0
+                              Decorate 114(g_tTex3df4) DescriptorSet 0
+                              Decorate 117(g_tTex3di4) DescriptorSet 0
+                              Decorate 120(g_tTex3du4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -311,26 +327,28 @@
               91:             TypePointer Function 90(VS_OUTPUT)
               93:    6(float) Constant 0
               94:    7(fvec4) ConstantComposite 93 93 93 93
-   98(g_sSamp2d):     15(ptr) Variable UniformConstant
-              99:             TypeImage 6(float) 1D sampled format:Unknown
-             100:             TypePointer UniformConstant 99
-101(g_tTex1df4a):    100(ptr) Variable UniformConstant
- 102(g_tTex1df4):    100(ptr) Variable UniformConstant
-             103:             TypeImage 24(int) 1D sampled format:Unknown
-             104:             TypePointer UniformConstant 103
- 105(g_tTex1di4):    104(ptr) Variable UniformConstant
-             106:             TypeImage 41(int) 1D sampled format:Unknown
+              96:             TypePointer Output 7(fvec4)
+         97(Pos):     96(ptr) Variable Output
+  101(g_sSamp2d):     15(ptr) Variable UniformConstant
+             102:             TypeImage 6(float) 1D sampled format:Unknown
+             103:             TypePointer UniformConstant 102
+104(g_tTex1df4a):    103(ptr) Variable UniformConstant
+ 105(g_tTex1df4):    103(ptr) Variable UniformConstant
+             106:             TypeImage 24(int) 1D sampled format:Unknown
              107:             TypePointer UniformConstant 106
- 108(g_tTex1du4):    107(ptr) Variable UniformConstant
-             109:             TypeImage 6(float) 3D sampled format:Unknown
+ 108(g_tTex1di4):    107(ptr) Variable UniformConstant
+             109:             TypeImage 41(int) 1D sampled format:Unknown
              110:             TypePointer UniformConstant 109
- 111(g_tTex3df4):    110(ptr) Variable UniformConstant
-             112:             TypeImage 24(int) 3D sampled format:Unknown
+ 111(g_tTex1du4):    110(ptr) Variable UniformConstant
+             112:             TypeImage 6(float) 3D sampled format:Unknown
              113:             TypePointer UniformConstant 112
- 114(g_tTex3di4):    113(ptr) Variable UniformConstant
-             115:             TypeImage 41(int) 3D sampled format:Unknown
+ 114(g_tTex3df4):    113(ptr) Variable UniformConstant
+             115:             TypeImage 24(int) 3D sampled format:Unknown
              116:             TypePointer UniformConstant 115
- 117(g_tTex3du4):    116(ptr) Variable UniformConstant
+ 117(g_tTex3di4):    116(ptr) Variable UniformConstant
+             118:             TypeImage 41(int) 3D sampled format:Unknown
+             119:             TypePointer UniformConstant 118
+ 120(g_tTex3du4):    119(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval20):      8(ptr) Variable Function
@@ -372,6 +390,8 @@
                               Store 77(txval42) 89
               95:      8(ptr) AccessChain 92(vsout) 25
                               Store 95 94
-              96:90(VS_OUTPUT) Load 92(vsout)
-                              ReturnValue 96
+              98:      8(ptr) AccessChain 92(vsout) 25
+              99:    7(fvec4) Load 98
+                              Store 97(Pos) 99
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gather.offset.dx10.frag.out b/Test/baseResults/hlsl.gather.offset.dx10.frag.out
index d5a3921..ac31791 100644
--- a/Test/baseResults/hlsl.gather.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:45  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:33      Sequence
@@ -46,7 +46,7 @@
 0:?               -1 (const int)
 0:40      move second child to first child (temp 4-component vector of float)
 0:40        Color: direct index for structure (temp 4-component vector of float)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            0 (const int)
 0:40        Constant:
@@ -55,14 +55,27 @@
 0:40          1.000000
 0:40          1.000000
 0:41      move second child to first child (temp float)
-0:41        Depth: direct index for structure (temp float FragDepth)
-0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:41        Depth: direct index for structure (temp float)
+0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:41          Constant:
 0:41            1 (const int)
 0:41        Constant:
 0:41          1.000000
-0:43      Branch: Return with expression
-0:43        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:43          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:43            Color: direct index for structure (temp 4-component vector of float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                0 (const int)
+0:43          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:43            Depth: direct index for structure (temp float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                1 (const int)
+0:43        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -78,6 +91,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -86,7 +101,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:45  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:33      Sequence
@@ -130,7 +145,7 @@
 0:?               -1 (const int)
 0:40      move second child to first child (temp 4-component vector of float)
 0:40        Color: direct index for structure (temp 4-component vector of float)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            0 (const int)
 0:40        Constant:
@@ -139,14 +154,27 @@
 0:40          1.000000
 0:40          1.000000
 0:41      move second child to first child (temp float)
-0:41        Depth: direct index for structure (temp float FragDepth)
-0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:41        Depth: direct index for structure (temp float)
+0:41          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:41          Constant:
 0:41            1 (const int)
 0:41        Constant:
 0:41          1.000000
-0:43      Branch: Return with expression
-0:43        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:43          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:43            Color: direct index for structure (temp 4-component vector of float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                0 (const int)
+0:43          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:43            Depth: direct index for structure (temp float)
+0:43              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:43              Constant:
+0:43                1 (const int)
+0:43        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -162,18 +190,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 100
+// Id's are bound by 107
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 71 75
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval20"
                               Name 12  "g_tTex2df4"
@@ -186,34 +215,37 @@
                               MemberName 62(PS_OUTPUT) 0  "Color"
                               MemberName 62(PS_OUTPUT) 1  "Depth"
                               Name 64  "psout"
-                              Name 74  "g_tTex1df4a"
-                              Name 75  "g_tTex1df4"
-                              Name 78  "g_tTex1di4"
-                              Name 81  "g_tTex1du4"
-                              Name 84  "g_tTex3df4"
-                              Name 87  "g_tTex3di4"
-                              Name 90  "g_tTex3du4"
-                              Name 93  "g_tTexcdf4"
-                              Name 96  "g_tTexcdi4"
-                              Name 99  "g_tTexcdu4"
+                              Name 71  "Color"
+                              Name 75  "Depth"
+                              Name 81  "g_tTex1df4a"
+                              Name 82  "g_tTex1df4"
+                              Name 85  "g_tTex1di4"
+                              Name 88  "g_tTex1du4"
+                              Name 91  "g_tTex3df4"
+                              Name 94  "g_tTex3di4"
+                              Name 97  "g_tTex3du4"
+                              Name 100  "g_tTexcdf4"
+                              Name 103  "g_tTexcdi4"
+                              Name 106  "g_tTexcdu4"
                               Decorate 12(g_tTex2df4) DescriptorSet 0
                               Decorate 16(g_sSamp) DescriptorSet 0
                               Decorate 16(g_sSamp) Binding 0
                               Decorate 35(g_tTex2di4) DescriptorSet 0
                               Decorate 51(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 62(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 74(g_tTex1df4a) DescriptorSet 0
-                              Decorate 74(g_tTex1df4a) Binding 1
-                              Decorate 75(g_tTex1df4) DescriptorSet 0
-                              Decorate 75(g_tTex1df4) Binding 0
-                              Decorate 78(g_tTex1di4) DescriptorSet 0
-                              Decorate 81(g_tTex1du4) DescriptorSet 0
-                              Decorate 84(g_tTex3df4) DescriptorSet 0
-                              Decorate 87(g_tTex3di4) DescriptorSet 0
-                              Decorate 90(g_tTex3du4) DescriptorSet 0
-                              Decorate 93(g_tTexcdf4) DescriptorSet 0
-                              Decorate 96(g_tTexcdi4) DescriptorSet 0
-                              Decorate 99(g_tTexcdu4) DescriptorSet 0
+                              Decorate 71(Color) Location 0
+                              Decorate 75(Depth) BuiltIn FragDepth
+                              Decorate 81(g_tTex1df4a) DescriptorSet 0
+                              Decorate 81(g_tTex1df4a) Binding 1
+                              Decorate 82(g_tTex1df4) DescriptorSet 0
+                              Decorate 82(g_tTex1df4) Binding 0
+                              Decorate 85(g_tTex1di4) DescriptorSet 0
+                              Decorate 88(g_tTex1du4) DescriptorSet 0
+                              Decorate 91(g_tTex3df4) DescriptorSet 0
+                              Decorate 94(g_tTex3di4) DescriptorSet 0
+                              Decorate 97(g_tTex3du4) DescriptorSet 0
+                              Decorate 100(g_tTexcdf4) DescriptorSet 0
+                              Decorate 103(g_tTexcdi4) DescriptorSet 0
+                              Decorate 106(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -262,34 +294,38 @@
               65:    6(float) Constant 1065353216
               66:    7(fvec4) ConstantComposite 65 65 65 65
               68:             TypePointer Function 6(float)
-              72:             TypeImage 6(float) 1D sampled format:Unknown
-              73:             TypePointer UniformConstant 72
- 74(g_tTex1df4a):     73(ptr) Variable UniformConstant
-  75(g_tTex1df4):     73(ptr) Variable UniformConstant
-              76:             TypeImage 24(int) 1D sampled format:Unknown
-              77:             TypePointer UniformConstant 76
-  78(g_tTex1di4):     77(ptr) Variable UniformConstant
-              79:             TypeImage 45(int) 1D sampled format:Unknown
+              70:             TypePointer Output 7(fvec4)
+       71(Color):     70(ptr) Variable Output
+              74:             TypePointer Output 6(float)
+       75(Depth):     74(ptr) Variable Output
+              79:             TypeImage 6(float) 1D sampled format:Unknown
               80:             TypePointer UniformConstant 79
-  81(g_tTex1du4):     80(ptr) Variable UniformConstant
-              82:             TypeImage 6(float) 3D sampled format:Unknown
-              83:             TypePointer UniformConstant 82
-  84(g_tTex3df4):     83(ptr) Variable UniformConstant
-              85:             TypeImage 24(int) 3D sampled format:Unknown
-              86:             TypePointer UniformConstant 85
-  87(g_tTex3di4):     86(ptr) Variable UniformConstant
-              88:             TypeImage 45(int) 3D sampled format:Unknown
-              89:             TypePointer UniformConstant 88
-  90(g_tTex3du4):     89(ptr) Variable UniformConstant
-              91:             TypeImage 6(float) Cube sampled format:Unknown
-              92:             TypePointer UniformConstant 91
-  93(g_tTexcdf4):     92(ptr) Variable UniformConstant
-              94:             TypeImage 24(int) Cube sampled format:Unknown
-              95:             TypePointer UniformConstant 94
-  96(g_tTexcdi4):     95(ptr) Variable UniformConstant
-              97:             TypeImage 45(int) Cube sampled format:Unknown
-              98:             TypePointer UniformConstant 97
-  99(g_tTexcdu4):     98(ptr) Variable UniformConstant
+ 81(g_tTex1df4a):     80(ptr) Variable UniformConstant
+  82(g_tTex1df4):     80(ptr) Variable UniformConstant
+              83:             TypeImage 24(int) 1D sampled format:Unknown
+              84:             TypePointer UniformConstant 83
+  85(g_tTex1di4):     84(ptr) Variable UniformConstant
+              86:             TypeImage 45(int) 1D sampled format:Unknown
+              87:             TypePointer UniformConstant 86
+  88(g_tTex1du4):     87(ptr) Variable UniformConstant
+              89:             TypeImage 6(float) 3D sampled format:Unknown
+              90:             TypePointer UniformConstant 89
+  91(g_tTex3df4):     90(ptr) Variable UniformConstant
+              92:             TypeImage 24(int) 3D sampled format:Unknown
+              93:             TypePointer UniformConstant 92
+  94(g_tTex3di4):     93(ptr) Variable UniformConstant
+              95:             TypeImage 45(int) 3D sampled format:Unknown
+              96:             TypePointer UniformConstant 95
+  97(g_tTex3du4):     96(ptr) Variable UniformConstant
+              98:             TypeImage 6(float) Cube sampled format:Unknown
+              99:             TypePointer UniformConstant 98
+ 100(g_tTexcdf4):     99(ptr) Variable UniformConstant
+             101:             TypeImage 24(int) Cube sampled format:Unknown
+             102:             TypePointer UniformConstant 101
+ 103(g_tTexcdi4):    102(ptr) Variable UniformConstant
+             104:             TypeImage 45(int) Cube sampled format:Unknown
+             105:             TypePointer UniformConstant 104
+ 106(g_tTexcdu4):    105(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval20):      8(ptr) Variable Function
@@ -315,6 +351,11 @@
                               Store 67 66
               69:     68(ptr) AccessChain 64(psout) 26
                               Store 69 65
-              70:62(PS_OUTPUT) Load 64(psout)
-                              ReturnValue 70
+              72:      8(ptr) AccessChain 64(psout) 27
+              73:    7(fvec4) Load 72
+                              Store 71(Color) 73
+              76:     68(ptr) AccessChain 64(psout) 26
+              77:    6(float) Load 76
+                              Store 75(Depth) 77
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
index a1f628a..bf8f382 100644
--- a/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:37  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:25      Sequence
@@ -49,7 +49,7 @@
 0:?               -1 (const int)
 0:32      move second child to first child (temp 4-component vector of float)
 0:32        Color: direct index for structure (temp 4-component vector of float)
-0:32          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:32          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:32          Constant:
 0:32            0 (const int)
 0:32        Constant:
@@ -58,14 +58,27 @@
 0:32          1.000000
 0:32          1.000000
 0:33      move second child to first child (temp float)
-0:33        Depth: direct index for structure (temp float FragDepth)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33        Depth: direct index for structure (temp float)
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            1 (const int)
 0:33        Constant:
 0:33          1.000000
-0:35      Branch: Return with expression
-0:35        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:35          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:35            Color: direct index for structure (temp 4-component vector of float)
+0:35              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:35              Constant:
+0:35                0 (const int)
+0:35          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:35            Depth: direct index for structure (temp float)
+0:35              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:35              Constant:
+0:35                1 (const int)
+0:35        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -75,6 +88,8 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -83,7 +98,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:37  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:25      Sequence
@@ -130,7 +145,7 @@
 0:?               -1 (const int)
 0:32      move second child to first child (temp 4-component vector of float)
 0:32        Color: direct index for structure (temp 4-component vector of float)
-0:32          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:32          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:32          Constant:
 0:32            0 (const int)
 0:32        Constant:
@@ -139,14 +154,27 @@
 0:32          1.000000
 0:32          1.000000
 0:33      move second child to first child (temp float)
-0:33        Depth: direct index for structure (temp float FragDepth)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33        Depth: direct index for structure (temp float)
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            1 (const int)
 0:33        Constant:
 0:33          1.000000
-0:35      Branch: Return with expression
-0:35        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:35          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:35            Color: direct index for structure (temp 4-component vector of float)
+0:35              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:35              Constant:
+0:35                0 (const int)
+0:35          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:35            Depth: direct index for structure (temp float)
+0:35              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:35              Constant:
+0:35                1 (const int)
+0:35        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -156,18 +184,19 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 83
+// Id's are bound by 90
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 72 76
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval20"
                               Name 12  "g_tTex2df4"
@@ -180,22 +209,25 @@
                               MemberName 63(PS_OUTPUT) 0  "Color"
                               MemberName 63(PS_OUTPUT) 1  "Depth"
                               Name 65  "psout"
-                              Name 75  "g_tTex1df4a"
-                              Name 76  "g_tTex1df4"
-                              Name 79  "g_tTex1di4"
-                              Name 82  "g_tTex1du4"
+                              Name 72  "Color"
+                              Name 76  "Depth"
+                              Name 82  "g_tTex1df4a"
+                              Name 83  "g_tTex1df4"
+                              Name 86  "g_tTex1di4"
+                              Name 89  "g_tTex1du4"
                               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 51(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 63(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 75(g_tTex1df4a) DescriptorSet 0
-                              Decorate 75(g_tTex1df4a) Binding 1
-                              Decorate 76(g_tTex1df4) DescriptorSet 0
-                              Decorate 76(g_tTex1df4) Binding 0
-                              Decorate 79(g_tTex1di4) DescriptorSet 0
-                              Decorate 82(g_tTex1du4) DescriptorSet 0
+                              Decorate 72(Color) Location 0
+                              Decorate 76(Depth) BuiltIn FragDepth
+                              Decorate 82(g_tTex1df4a) DescriptorSet 0
+                              Decorate 82(g_tTex1df4a) Binding 1
+                              Decorate 83(g_tTex1df4) DescriptorSet 0
+                              Decorate 83(g_tTex1df4) Binding 0
+                              Decorate 86(g_tTex1di4) DescriptorSet 0
+                              Decorate 89(g_tTex1du4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -245,16 +277,20 @@
               66:    6(float) Constant 1065353216
               67:    7(fvec4) ConstantComposite 66 66 66 66
               69:             TypePointer Function 6(float)
-              73:             TypeImage 6(float) 1D array sampled format:Unknown
-              74:             TypePointer UniformConstant 73
- 75(g_tTex1df4a):     74(ptr) Variable UniformConstant
-  76(g_tTex1df4):     74(ptr) Variable UniformConstant
-              77:             TypeImage 25(int) 1D array sampled format:Unknown
-              78:             TypePointer UniformConstant 77
-  79(g_tTex1di4):     78(ptr) Variable UniformConstant
-              80:             TypeImage 45(int) 1D array sampled format:Unknown
+              71:             TypePointer Output 7(fvec4)
+       72(Color):     71(ptr) Variable Output
+              75:             TypePointer Output 6(float)
+       76(Depth):     75(ptr) Variable Output
+              80:             TypeImage 6(float) 1D array sampled format:Unknown
               81:             TypePointer UniformConstant 80
-  82(g_tTex1du4):     81(ptr) Variable UniformConstant
+ 82(g_tTex1df4a):     81(ptr) Variable UniformConstant
+  83(g_tTex1df4):     81(ptr) Variable UniformConstant
+              84:             TypeImage 25(int) 1D array sampled format:Unknown
+              85:             TypePointer UniformConstant 84
+  86(g_tTex1di4):     85(ptr) Variable UniformConstant
+              87:             TypeImage 45(int) 1D array sampled format:Unknown
+              88:             TypePointer UniformConstant 87
+  89(g_tTex1du4):     88(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval20):      8(ptr) Variable Function
@@ -280,6 +316,11 @@
                               Store 68 67
               70:     69(ptr) AccessChain 65(psout) 27
                               Store 70 66
-              71:63(PS_OUTPUT) Load 65(psout)
-                              ReturnValue 71
+              73:      8(ptr) AccessChain 65(psout) 28
+              74:    7(fvec4) Load 73
+                              Store 72(Color) 74
+              77:     69(ptr) AccessChain 65(psout) 27
+              78:    6(float) Load 77
+                              Store 76(Depth) 78
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
index cad56b6..026fd1b 100644
--- a/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
@@ -2,7 +2,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:33      Sequence
@@ -247,7 +247,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:67          Constant:
 0:67            0 (const int)
 0:67        Constant:
@@ -256,14 +256,27 @@
 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        Depth: direct index for structure (temp float)
+0:68          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:70          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:70            Color: direct index for structure (temp 4-component vector of float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                0 (const int)
+0:70          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:70            Depth: direct index for structure (temp float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                1 (const int)
+0:70        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -280,6 +293,8 @@
 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:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -288,7 +303,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:33      Sequence
@@ -533,7 +548,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:67          Constant:
 0:67            0 (const int)
 0:67        Constant:
@@ -542,14 +557,27 @@
 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        Depth: direct index for structure (temp float)
+0:68          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:70          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:70            Color: direct index for structure (temp 4-component vector of float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                0 (const int)
+0:70          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:70            Depth: direct index for structure (temp float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                1 (const int)
+0:70        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -566,19 +594,20 @@
 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:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 220
+// Id's are bound by 227
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 204 208
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval00"
                               Name 12  "g_tTex2df4a"
@@ -617,12 +646,14 @@
                               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"
+                              Name 204  "Color"
+                              Name 208  "Depth"
+                              Name 212  "g_sSamp2d"
+                              Name 215  "g_tTex1df4a"
+                              Name 218  "g_tTex1di4a"
+                              Name 221  "g_tTex1du4a"
+                              Name 223  "c1"
+                              Name 226  "c2"
                               Decorate 12(g_tTex2df4a) DescriptorSet 0
                               Decorate 16(g_sSamp) DescriptorSet 0
                               Decorate 16(g_sSamp) Binding 0
@@ -631,12 +662,13 @@
                               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
+                              Decorate 204(Color) Location 0
+                              Decorate 208(Depth) BuiltIn FragDepth
+                              Decorate 212(g_sSamp2d) DescriptorSet 0
+                              Decorate 215(g_tTex1df4a) DescriptorSet 0
+                              Decorate 215(g_tTex1df4a) Binding 0
+                              Decorate 218(g_tTex1di4a) DescriptorSet 0
+                              Decorate 221(g_tTex1du4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -689,21 +721,25 @@
              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
+             203:             TypePointer Output 7(fvec4)
+      204(Color):    203(ptr) Variable Output
+             207:             TypePointer Output 6(float)
+      208(Depth):    207(ptr) Variable Output
+  212(g_sSamp2d):     15(ptr) Variable UniformConstant
+             213:             TypeImage 6(float) 1D array sampled format:Unknown
+             214:             TypePointer UniformConstant 213
+215(g_tTex1df4a):    214(ptr) Variable UniformConstant
+             216:             TypeImage 24(int) 1D array sampled format:Unknown
+             217:             TypePointer UniformConstant 216
+218(g_tTex1di4a):    217(ptr) Variable UniformConstant
+             219:             TypeImage 39(int) 1D array sampled format:Unknown
+             220:             TypePointer UniformConstant 219
+221(g_tTex1du4a):    220(ptr) Variable UniformConstant
+             222:             TypePointer UniformConstant 6(float)
+         223(c1):    222(ptr) Variable UniformConstant
+             224:             TypeVector 6(float) 2
+             225:             TypePointer UniformConstant 224(fvec2)
+         226(c2):    225(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval00):      8(ptr) Variable Function
@@ -879,6 +915,11 @@
                               Store 200 199
              202:    201(ptr) AccessChain 197(psout) 57
                               Store 202 198
-             203:195(PS_OUTPUT) Load 197(psout)
-                              ReturnValue 203
+             205:      8(ptr) AccessChain 197(psout) 25
+             206:    7(fvec4) Load 205
+                              Store 204(Color) 206
+             209:    201(ptr) AccessChain 197(psout) 57
+             210:    6(float) Load 209
+                              Store 208(Depth) 210
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
index 8fd9691..2ec5343 100644
--- a/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:34    Function Parameters: 
 0:?     Sequence
 0:39      Sequence
@@ -247,7 +247,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:73          Constant:
 0:73            0 (const int)
 0:73        Constant:
@@ -256,14 +256,27 @@
 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        Depth: direct index for structure (temp float)
+0:74          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:76          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:76            Color: direct index for structure (temp 4-component vector of float)
+0:76              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:76              Constant:
+0:76                0 (const int)
+0:76          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:76            Depth: direct index for structure (temp float)
+0:76              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:76              Constant:
+0:76                1 (const int)
+0:76        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -284,6 +297,8 @@
 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:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -292,7 +307,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:34    Function Parameters: 
 0:?     Sequence
 0:39      Sequence
@@ -537,7 +552,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:73          Constant:
 0:73            0 (const int)
 0:73        Constant:
@@ -546,14 +561,27 @@
 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        Depth: direct index for structure (temp float)
+0:74          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:76          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:76            Color: direct index for structure (temp 4-component vector of float)
+0:76              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:76              Constant:
+0:76                0 (const int)
+0:76          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:76            Depth: direct index for structure (temp float)
+0:76              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:76              Constant:
+0:76                1 (const int)
+0:76        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -574,18 +602,19 @@
 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:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 230
+// Id's are bound by 237
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 205 209
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval00"
                               Name 12  "g_tTex2df4"
@@ -624,16 +653,18 @@
                               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"
+                              Name 205  "Color"
+                              Name 209  "Depth"
+                              Name 213  "g_sSamp2d"
+                              Name 216  "g_tTex1df4a"
+                              Name 217  "g_tTex1df4"
+                              Name 220  "g_tTex1di4"
+                              Name 223  "g_tTex1du4"
+                              Name 226  "g_tTex3df4"
+                              Name 229  "g_tTex3di4"
+                              Name 232  "g_tTex3du4"
+                              Name 234  "c1"
+                              Name 236  "c4"
                               Decorate 12(g_tTex2df4) DescriptorSet 0
                               Decorate 16(g_sSamp) DescriptorSet 0
                               Decorate 16(g_sSamp) Binding 0
@@ -642,17 +673,18 @@
                               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
+                              Decorate 205(Color) Location 0
+                              Decorate 209(Depth) BuiltIn FragDepth
+                              Decorate 213(g_sSamp2d) DescriptorSet 0
+                              Decorate 216(g_tTex1df4a) DescriptorSet 0
+                              Decorate 216(g_tTex1df4a) Binding 1
+                              Decorate 217(g_tTex1df4) DescriptorSet 0
+                              Decorate 217(g_tTex1df4) Binding 0
+                              Decorate 220(g_tTex1di4) DescriptorSet 0
+                              Decorate 223(g_tTex1du4) DescriptorSet 0
+                              Decorate 226(g_tTex3df4) DescriptorSet 0
+                              Decorate 229(g_tTex3di4) DescriptorSet 0
+                              Decorate 232(g_tTex3du4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -706,30 +738,34 @@
              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
+             204:             TypePointer Output 7(fvec4)
+      205(Color):    204(ptr) Variable Output
+             208:             TypePointer Output 6(float)
+      209(Depth):    208(ptr) Variable Output
+  213(g_sSamp2d):     15(ptr) Variable UniformConstant
+             214:             TypeImage 6(float) 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
+216(g_tTex1df4a):    215(ptr) Variable UniformConstant
+ 217(g_tTex1df4):    215(ptr) Variable UniformConstant
+             218:             TypeImage 24(int) 1D sampled format:Unknown
+             219:             TypePointer UniformConstant 218
+ 220(g_tTex1di4):    219(ptr) Variable UniformConstant
+             221:             TypeImage 39(int) 1D sampled format:Unknown
+             222:             TypePointer UniformConstant 221
+ 223(g_tTex1du4):    222(ptr) Variable UniformConstant
+             224:             TypeImage 6(float) 3D sampled format:Unknown
+             225:             TypePointer UniformConstant 224
+ 226(g_tTex3df4):    225(ptr) Variable UniformConstant
+             227:             TypeImage 24(int) 3D sampled format:Unknown
+             228:             TypePointer UniformConstant 227
+ 229(g_tTex3di4):    228(ptr) Variable UniformConstant
+             230:             TypeImage 39(int) 3D sampled format:Unknown
+             231:             TypePointer UniformConstant 230
+ 232(g_tTex3du4):    231(ptr) Variable UniformConstant
+             233:             TypePointer UniformConstant 6(float)
+         234(c1):    233(ptr) Variable UniformConstant
+             235:             TypePointer UniformConstant 7(fvec4)
+         236(c4):    235(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval00):      8(ptr) Variable Function
@@ -905,6 +941,11 @@
                               Store 201 200
              203:    202(ptr) AccessChain 198(psout) 57
                               Store 203 199
-             204:196(PS_OUTPUT) Load 198(psout)
-                              ReturnValue 204
+             206:      8(ptr) AccessChain 198(psout) 25
+             207:    7(fvec4) Load 206
+                              Store 205(Color) 207
+             210:    202(ptr) AccessChain 198(psout) 57
+             211:    6(float) Load 210
+                              Store 209(Depth) 211
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
index ea0d94a..a869ba7 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:39    Function Parameters: 
 0:?     Sequence
 0:46      Sequence
@@ -319,7 +319,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:112          Constant:
 0:112            0 (const int)
 0:112        Constant:
@@ -328,14 +328,27 @@
 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        Depth: direct index for structure (temp float)
+0:113          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:115          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:115            Color: direct index for structure (temp 4-component vector of float)
+0:115              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:115              Constant:
+0:115                0 (const int)
+0:115          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:115            Depth: direct index for structure (temp float)
+0:115              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:115              Constant:
+0:115                1 (const int)
+0:115        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -360,6 +373,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -368,7 +383,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:39    Function Parameters: 
 0:?     Sequence
 0:46      Sequence
@@ -685,7 +700,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:112          Constant:
 0:112            0 (const int)
 0:112        Constant:
@@ -694,14 +709,27 @@
 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        Depth: direct index for structure (temp float)
+0:113          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:115          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:115            Color: direct index for structure (temp 4-component vector of float)
+0:115              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:115              Constant:
+0:115                0 (const int)
+0:115          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:115            Depth: direct index for structure (temp float)
+0:115              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:115              Constant:
+0:115                1 (const int)
+0:115        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -726,19 +754,20 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 311
+// Id's are bound by 318
 
                               Capability Shader
                               Capability ImageGatherExtended
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 267 271
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval001"
                               Name 12  "g_tTex2df4"
@@ -774,42 +803,45 @@
                               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"
+                              Name 267  "Color"
+                              Name 271  "Depth"
+                              Name 275  "g_sSamp2d"
+                              Name 278  "g_tTex1df4a"
+                              Name 279  "g_tTex1df4"
+                              Name 282  "g_tTex1di4"
+                              Name 285  "g_tTex1du4"
+                              Name 288  "g_tTex3df4"
+                              Name 291  "g_tTex3di4"
+                              Name 294  "g_tTex3du4"
+                              Name 297  "g_tTexcdf4"
+                              Name 300  "g_tTexcdi4"
+                              Name 303  "g_tTexcdu4"
+                              Name 305  "c1"
+                              Name 308  "c3"
+                              Name 310  "c4"
+                              Name 312  "o1"
+                              Name 315  "o3"
+                              Name 317  "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
+                              Decorate 267(Color) Location 0
+                              Decorate 271(Depth) BuiltIn FragDepth
+                              Decorate 275(g_sSamp2d) DescriptorSet 0
+                              Decorate 278(g_tTex1df4a) DescriptorSet 0
+                              Decorate 278(g_tTex1df4a) Binding 1
+                              Decorate 279(g_tTex1df4) DescriptorSet 0
+                              Decorate 279(g_tTex1df4) Binding 0
+                              Decorate 282(g_tTex1di4) DescriptorSet 0
+                              Decorate 285(g_tTex1du4) DescriptorSet 0
+                              Decorate 288(g_tTex3df4) DescriptorSet 0
+                              Decorate 291(g_tTex3di4) DescriptorSet 0
+                              Decorate 294(g_tTex3du4) DescriptorSet 0
+                              Decorate 297(g_tTexcdf4) DescriptorSet 0
+                              Decorate 300(g_tTexcdi4) DescriptorSet 0
+                              Decorate 303(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -853,49 +885,53 @@
              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
+             266:             TypePointer Output 7(fvec4)
+      267(Color):    266(ptr) Variable Output
+             270:             TypePointer Output 6(float)
+      271(Depth):    270(ptr) Variable Output
+  275(g_sSamp2d):     15(ptr) Variable UniformConstant
+             276:             TypeImage 6(float) 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
+278(g_tTex1df4a):    277(ptr) Variable UniformConstant
+ 279(g_tTex1df4):    277(ptr) Variable UniformConstant
+             280:             TypeImage 24(int) 1D sampled format:Unknown
+             281:             TypePointer UniformConstant 280
+ 282(g_tTex1di4):    281(ptr) Variable UniformConstant
+             283:             TypeImage 44(int) 1D sampled format:Unknown
+             284:             TypePointer UniformConstant 283
+ 285(g_tTex1du4):    284(ptr) Variable UniformConstant
+             286:             TypeImage 6(float) 3D sampled format:Unknown
+             287:             TypePointer UniformConstant 286
+ 288(g_tTex3df4):    287(ptr) Variable UniformConstant
+             289:             TypeImage 24(int) 3D sampled format:Unknown
+             290:             TypePointer UniformConstant 289
+ 291(g_tTex3di4):    290(ptr) Variable UniformConstant
+             292:             TypeImage 44(int) 3D sampled format:Unknown
+             293:             TypePointer UniformConstant 292
+ 294(g_tTex3du4):    293(ptr) Variable UniformConstant
+             295:             TypeImage 6(float) Cube sampled format:Unknown
+             296:             TypePointer UniformConstant 295
+ 297(g_tTexcdf4):    296(ptr) Variable UniformConstant
+             298:             TypeImage 24(int) Cube sampled format:Unknown
+             299:             TypePointer UniformConstant 298
+ 300(g_tTexcdi4):    299(ptr) Variable UniformConstant
+             301:             TypeImage 44(int) Cube sampled format:Unknown
+             302:             TypePointer UniformConstant 301
+ 303(g_tTexcdu4):    302(ptr) Variable UniformConstant
+             304:             TypePointer UniformConstant 6(float)
+         305(c1):    304(ptr) Variable UniformConstant
+             306:             TypeVector 6(float) 3
+             307:             TypePointer UniformConstant 306(fvec3)
+         308(c3):    307(ptr) Variable UniformConstant
+             309:             TypePointer UniformConstant 7(fvec4)
+         310(c4):    309(ptr) Variable UniformConstant
+             311:             TypePointer UniformConstant 24(int)
+         312(o1):    311(ptr) Variable UniformConstant
+             313:             TypeVector 24(int) 3
+             314:             TypePointer UniformConstant 313(ivec3)
+         315(o3):    314(ptr) Variable UniformConstant
+             316:             TypePointer UniformConstant 31(ivec4)
+         317(o4):    316(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
      9(txval001):      8(ptr) Variable Function
@@ -1143,6 +1179,11 @@
                               Store 263 262
              265:    264(ptr) AccessChain 260(psout) 99
                               Store 265 261
-             266:258(PS_OUTPUT) Load 260(psout)
-                              ReturnValue 266
+             268:      8(ptr) AccessChain 260(psout) 29
+             269:    7(fvec4) Load 268
+                              Store 267(Color) 269
+             272:    264(ptr) AccessChain 260(psout) 99
+             273:    6(float) Load 272
+                              Store 271(Depth) 273
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
index f9c28d0..022f63e 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:33    Function Parameters: 
 0:?     Sequence
 0:40      Sequence
@@ -319,7 +319,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:106          Constant:
 0:106            0 (const int)
 0:106        Constant:
@@ -328,14 +328,27 @@
 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        Depth: direct index for structure (temp float)
+0:107          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:109          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:109            Color: direct index for structure (temp 4-component vector of float)
+0:109              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:109              Constant:
+0:109                0 (const int)
+0:109          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:109            Depth: direct index for structure (temp float)
+0:109              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:109              Constant:
+0:109                1 (const int)
+0:109        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -356,6 +369,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -364,7 +379,7 @@
 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 Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:33    Function Parameters: 
 0:?     Sequence
 0:40      Sequence
@@ -681,7 +696,7 @@
 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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:106          Constant:
 0:106            0 (const int)
 0:106        Constant:
@@ -690,14 +705,27 @@
 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        Depth: direct index for structure (temp float)
+0:107          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:109          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:109            Color: direct index for structure (temp 4-component vector of float)
+0:109              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:109              Constant:
+0:109                0 (const int)
+0:109          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:109            Depth: direct index for structure (temp float)
+0:109              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:109              Constant:
+0:109                1 (const int)
+0:109        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -718,10 +746,12 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 301
+// Id's are bound by 308
 
                               Capability Shader
                               Capability ImageGatherExtended
@@ -729,9 +759,8 @@
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 267 271
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval001"
                               Name 12  "g_tTex2df4a"
@@ -767,33 +796,36 @@
                               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"
+                              Name 267  "Color"
+                              Name 271  "Depth"
+                              Name 275  "g_sSamp2d"
+                              Name 278  "g_tTex1df4a"
+                              Name 281  "g_tTex1di4a"
+                              Name 284  "g_tTex1du4a"
+                              Name 287  "g_tTexcdf4a"
+                              Name 290  "g_tTexcdi4a"
+                              Name 293  "g_tTexcdu4a"
+                              Name 295  "c1"
+                              Name 298  "c2"
+                              Name 300  "c4"
+                              Name 302  "o1"
+                              Name 305  "o3"
+                              Name 307  "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
+                              Decorate 267(Color) Location 0
+                              Decorate 271(Depth) BuiltIn FragDepth
+                              Decorate 275(g_sSamp2d) DescriptorSet 0
+                              Decorate 278(g_tTex1df4a) DescriptorSet 0
+                              Decorate 278(g_tTex1df4a) Binding 0
+                              Decorate 281(g_tTex1di4a) DescriptorSet 0
+                              Decorate 284(g_tTex1du4a) DescriptorSet 0
+                              Decorate 287(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 290(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 293(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -837,39 +869,43 @@
              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
+             266:             TypePointer Output 7(fvec4)
+      267(Color):    266(ptr) Variable Output
+             270:             TypePointer Output 6(float)
+      271(Depth):    270(ptr) Variable Output
+  275(g_sSamp2d):     15(ptr) Variable UniformConstant
+             276:             TypeImage 6(float) 1D array sampled format:Unknown
+             277:             TypePointer UniformConstant 276
+278(g_tTex1df4a):    277(ptr) Variable UniformConstant
+             279:             TypeImage 24(int) 1D array sampled format:Unknown
+             280:             TypePointer UniformConstant 279
+281(g_tTex1di4a):    280(ptr) Variable UniformConstant
+             282:             TypeImage 44(int) 1D array sampled format:Unknown
+             283:             TypePointer UniformConstant 282
+284(g_tTex1du4a):    283(ptr) Variable UniformConstant
+             285:             TypeImage 6(float) Cube array sampled format:Unknown
+             286:             TypePointer UniformConstant 285
+287(g_tTexcdf4a):    286(ptr) Variable UniformConstant
+             288:             TypeImage 24(int) Cube array sampled format:Unknown
+             289:             TypePointer UniformConstant 288
+290(g_tTexcdi4a):    289(ptr) Variable UniformConstant
+             291:             TypeImage 44(int) Cube array sampled format:Unknown
+             292:             TypePointer UniformConstant 291
+293(g_tTexcdu4a):    292(ptr) Variable UniformConstant
+             294:             TypePointer UniformConstant 6(float)
+         295(c1):    294(ptr) Variable UniformConstant
+             296:             TypeVector 6(float) 2
+             297:             TypePointer UniformConstant 296(fvec2)
+         298(c2):    297(ptr) Variable UniformConstant
+             299:             TypePointer UniformConstant 7(fvec4)
+         300(c4):    299(ptr) Variable UniformConstant
+             301:             TypePointer UniformConstant 24(int)
+         302(o1):    301(ptr) Variable UniformConstant
+             303:             TypeVector 24(int) 3
+             304:             TypePointer UniformConstant 303(ivec3)
+         305(o3):    304(ptr) Variable UniformConstant
+             306:             TypePointer UniformConstant 31(ivec4)
+         307(o4):    306(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
      9(txval001):      8(ptr) Variable Function
@@ -1117,6 +1153,11 @@
                               Store 263 262
              265:    264(ptr) AccessChain 260(psout) 99
                               Store 265 261
-             266:258(PS_OUTPUT) Load 260(psout)
-                              ReturnValue 266
+             268:      8(ptr) AccessChain 260(psout) 29
+             269:    7(fvec4) Load 268
+                              Store 267(Color) 269
+             272:    264(ptr) AccessChain 260(psout) 99
+             273:    6(float) Load 272
+                              Store 271(Depth) 273
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.getdimensions.dx10.frag.out b/Test/baseResults/hlsl.getdimensions.dx10.frag.out
index dd47567..18b35e4 100644
--- a/Test/baseResults/hlsl.getdimensions.dx10.frag.out
+++ b/Test/baseResults/hlsl.getdimensions.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:281  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:46    Function Parameters: 
 0:?     Sequence
 0:65      Sequence
@@ -1045,7 +1045,7 @@
 0:164            'g_tTex2dmsu4a' (uniform utexture2DMSArray)
 0:276      move second child to first child (temp 4-component vector of float)
 0:276        Color: direct index for structure (temp 4-component vector of float)
-0:276          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:276          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:276          Constant:
 0:276            0 (const int)
 0:276        Constant:
@@ -1054,14 +1054,27 @@
 0:276          1.000000
 0:276          1.000000
 0:277      move second child to first child (temp float)
-0:277        Depth: direct index for structure (temp float FragDepth)
-0:277          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:277        Depth: direct index for structure (temp float)
+0:277          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:277          Constant:
 0:277            1 (const int)
 0:277        Constant:
 0:277          1.000000
-0:279      Branch: Return with expression
-0:279        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:279          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:279            Color: direct index for structure (temp 4-component vector of float)
+0:279              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:279              Constant:
+0:279                0 (const int)
+0:279          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:279            Depth: direct index for structure (temp float)
+0:279              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:279              Constant:
+0:279                1 (const int)
+0:279        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -1091,6 +1104,8 @@
 0:?     'g_tTex2dmsf4a' (uniform texture2DMSArray)
 0:?     'g_tTex2dmsi4a' (uniform itexture2DMSArray)
 0:?     'g_tTex2dmsu4a' (uniform utexture2DMSArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -1099,7 +1114,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:281  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:46    Function Parameters: 
 0:?     Sequence
 0:65      Sequence
@@ -2142,7 +2157,7 @@
 0:164            'g_tTex2dmsu4a' (uniform utexture2DMSArray)
 0:276      move second child to first child (temp 4-component vector of float)
 0:276        Color: direct index for structure (temp 4-component vector of float)
-0:276          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:276          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:276          Constant:
 0:276            0 (const int)
 0:276        Constant:
@@ -2151,14 +2166,27 @@
 0:276          1.000000
 0:276          1.000000
 0:277      move second child to first child (temp float)
-0:277        Depth: direct index for structure (temp float FragDepth)
-0:277          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:277        Depth: direct index for structure (temp float)
+0:277          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:277          Constant:
 0:277            1 (const int)
 0:277        Constant:
 0:277          1.000000
-0:279      Branch: Return with expression
-0:279        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:279          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:279            Color: direct index for structure (temp 4-component vector of float)
+0:279              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:279              Constant:
+0:279                0 (const int)
+0:279          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:279            Depth: direct index for structure (temp float)
+0:279              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:279              Constant:
+0:279                1 (const int)
+0:279        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -2188,10 +2216,12 @@
 0:?     'g_tTex2dmsf4a' (uniform texture2DMSArray)
 0:?     'g_tTex2dmsi4a' (uniform itexture2DMSArray)
 0:?     'g_tTex2dmsu4a' (uniform utexture2DMSArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 538
+// Id's are bound by 545
 
                               Capability Shader
                               Capability Sampled1D
@@ -2200,9 +2230,8 @@
                               Capability ImageQuery
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 534 538
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "sizeQueryTemp"
                               Name 12  "g_tTex1df4"
@@ -2289,7 +2318,9 @@
                               MemberName 522(PS_OUTPUT) 0  "Color"
                               MemberName 522(PS_OUTPUT) 1  "Depth"
                               Name 524  "psout"
-                              Name 537  "g_sSamp"
+                              Name 534  "Color"
+                              Name 538  "Depth"
+                              Name 544  "g_sSamp"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 29(g_tTex1di4) DescriptorSet 0
@@ -2318,9 +2349,10 @@
                               Decorate 482(g_tTex2dmsf4a) DescriptorSet 0
                               Decorate 496(g_tTex2dmsi4a) DescriptorSet 0
                               Decorate 510(g_tTex2dmsu4a) DescriptorSet 0
-                              MemberDecorate 522(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 537(g_sSamp) DescriptorSet 0
-                              Decorate 537(g_sSamp) Binding 0
+                              Decorate 534(Color) Location 0
+                              Decorate 538(Depth) BuiltIn FragDepth
+                              Decorate 544(g_sSamp) DescriptorSet 0
+                              Decorate 544(g_sSamp) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -2427,9 +2459,13 @@
              528:             TypePointer Function 521(fvec4)
              530:     14(int) Constant 1
              531:             TypePointer Function 9(float)
-             535:             TypeSampler
-             536:             TypePointer UniformConstant 535
-    537(g_sSamp):    536(ptr) Variable UniformConstant
+             533:             TypePointer Output 521(fvec4)
+      534(Color):    533(ptr) Variable Output
+             537:             TypePointer Output 9(float)
+      538(Depth):    537(ptr) Variable Output
+             542:             TypeSampler
+             543:             TypePointer UniformConstant 542
+    544(g_sSamp):    543(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
 8(sizeQueryTemp):      7(ptr) Variable Function
@@ -3043,6 +3079,11 @@
                               Store 529 527
              532:    531(ptr) AccessChain 524(psout) 530
                               Store 532 526
-             533:522(PS_OUTPUT) Load 524(psout)
-                              ReturnValue 533
+             535:    528(ptr) AccessChain 524(psout) 525
+             536:  521(fvec4) Load 535
+                              Store 534(Color) 536
+             539:    531(ptr) AccessChain 524(psout) 530
+             540:    9(float) Load 539
+                              Store 538(Depth) 540
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.getdimensions.dx10.vert.out b/Test/baseResults/hlsl.getdimensions.dx10.vert.out
index 9170402..3c063c1 100644
--- a/Test/baseResults/hlsl.getdimensions.dx10.vert.out
+++ b/Test/baseResults/hlsl.getdimensions.dx10.vert.out
@@ -1,7 +1,7 @@
 hlsl.getdimensions.dx10.vert
 Shader version: 450
 0:? Sequence
-0:28  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:11  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:11    Function Parameters: 
 0:?     Sequence
 0:21      Sequence
@@ -27,8 +27,8 @@
 0:22          textureQueryLevels (temp uint)
 0:22            'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
 0:24      move second child to first child (temp 4-component vector of float)
-0:24        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:24          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:24        Pos: direct index for structure (temp 4-component vector of float)
+0:24          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:24          Constant:
 0:24            0 (const int)
 0:?         Constant:
@@ -36,11 +36,19 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:26      Branch: Return with expression
-0:26        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:26          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:26            Pos: direct index for structure (temp 4-component vector of float)
+0:26              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:26              Constant:
+0:26                0 (const int)
+0:26        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
+0:?     'Pos' (out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -48,7 +56,7 @@
 
 Shader version: 450
 0:? Sequence
-0:28  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:11  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:11    Function Parameters: 
 0:?     Sequence
 0:21      Sequence
@@ -74,8 +82,8 @@
 0:22          textureQueryLevels (temp uint)
 0:22            'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
 0:24      move second child to first child (temp 4-component vector of float)
-0:24        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:24          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:24        Pos: direct index for structure (temp 4-component vector of float)
+0:24          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:24          Constant:
 0:24            0 (const int)
 0:?         Constant:
@@ -83,23 +91,30 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:26      Branch: Return with expression
-0:26        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:26          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:26            Pos: direct index for structure (temp 4-component vector of float)
+0:26              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:26              Constant:
+0:26                0 (const int)
+0:26        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
+0:?     'Pos' (out 4-component vector of float Position)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 40
+// Id's are bound by 43
 
                               Capability Shader
                               Capability Sampled1D
                               Capability ImageQuery
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main"
-                              Source HLSL 450
+                              EntryPoint Vertex 4  "main" 36
                               Name 4  "main"
                               Name 8  "sizeQueryTemp"
                               Name 12  "g_tTex1df4"
@@ -109,12 +124,13 @@
                               Name 27  "VS_OUTPUT"
                               MemberName 27(VS_OUTPUT) 0  "Pos"
                               Name 29  "vsout"
-                              Name 39  "g_sSamp"
+                              Name 36  "Pos"
+                              Name 42  "g_sSamp"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
-                              MemberDecorate 27(VS_OUTPUT) 0 BuiltIn FragCoord
-                              Decorate 39(g_sSamp) DescriptorSet 0
-                              Decorate 39(g_sSamp) Binding 0
+                              Decorate 36(Pos) BuiltIn Position
+                              Decorate 42(g_sSamp) DescriptorSet 0
+                              Decorate 42(g_sSamp) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -132,9 +148,11 @@
               31:    9(float) Constant 0
               32:   26(fvec4) ConstantComposite 31 31 31 31
               33:             TypePointer Function 26(fvec4)
-              37:             TypeSampler
-              38:             TypePointer UniformConstant 37
-     39(g_sSamp):     38(ptr) Variable UniformConstant
+              35:             TypePointer Output 26(fvec4)
+         36(Pos):     35(ptr) Variable Output
+              40:             TypeSampler
+              41:             TypePointer UniformConstant 40
+     42(g_sSamp):     41(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
 8(sizeQueryTemp):      7(ptr) Variable Function
@@ -157,6 +175,8 @@
                               Store 23(NumberOfLevelsU) 25
               34:     33(ptr) AccessChain 29(vsout) 30
                               Store 34 32
-              35:27(VS_OUTPUT) Load 29(vsout)
-                              ReturnValue 35
+              37:     33(ptr) AccessChain 29(vsout) 30
+              38:   26(fvec4) Load 37
+                              Store 36(Pos) 38
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.getsampleposition.dx10.frag.out b/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
index e2cf6fe..a44e944 100644
--- a/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
+++ b/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
@@ -7,7 +7,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:13  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:13    Function Parameters: 
 0:?     Sequence
 0:16      Sequence
@@ -28,7 +28,7 @@
 0:17              2 (const int)
 0:19      move second child to first child (temp 4-component vector of float)
 0:19        Color: direct index for structure (temp 4-component vector of float)
-0:19          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:19          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:19          Constant:
 0:19            0 (const int)
 0:19        Constant:
@@ -37,18 +37,33 @@
 0:19          1.000000
 0:19          1.000000
 0:20      move second child to first child (temp float)
-0:20        Depth: direct index for structure (temp float FragDepth)
-0:20          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20        Depth: direct index for structure (temp float)
+0:20          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:20          Constant:
 0:20            1 (const int)
 0:20        Constant:
 0:20          1.000000
-0:22      Branch: Return with expression
-0:22        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:22          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:22            Color: direct index for structure (temp 4-component vector of float)
+0:22              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:22              Constant:
+0:22                0 (const int)
+0:22          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:22            Depth: direct index for structure (temp float)
+0:22              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:22              Constant:
+0:22                1 (const int)
+0:22        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex2dmsf4' (uniform texture2DMS)
 0:?     'g_tTex2dmsf4a' (uniform texture2DMSArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -57,7 +72,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:13  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:13    Function Parameters: 
 0:?     Sequence
 0:16      Sequence
@@ -78,7 +93,7 @@
 0:17              2 (const int)
 0:19      move second child to first child (temp 4-component vector of float)
 0:19        Color: direct index for structure (temp 4-component vector of float)
-0:19          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:19          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:19          Constant:
 0:19            0 (const int)
 0:19        Constant:
@@ -87,17 +102,32 @@
 0:19          1.000000
 0:19          1.000000
 0:20      move second child to first child (temp float)
-0:20        Depth: direct index for structure (temp float FragDepth)
-0:20          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20        Depth: direct index for structure (temp float)
+0:20          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:20          Constant:
 0:20            1 (const int)
 0:20        Constant:
 0:20          1.000000
-0:22      Branch: Return with expression
-0:22        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:22          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:22            Color: direct index for structure (temp 4-component vector of float)
+0:22              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:22              Constant:
+0:22                0 (const int)
+0:22          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:22            Depth: direct index for structure (temp float)
+0:22              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:22              Constant:
+0:22                1 (const int)
+0:22        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex2dmsf4' (uniform texture2DMS)
 0:?     'g_tTex2dmsf4a' (uniform texture2DMSArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.if.frag.out b/Test/baseResults/hlsl.if.frag.out
index 4554ec6..499015a 100755
--- a/Test/baseResults/hlsl.if.frag.out
+++ b/Test/baseResults/hlsl.if.frag.out
@@ -2,71 +2,89 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:34  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Test condition and select (temp void)
 0:3        Condition
 0:3        Compare Equal (temp bool)
-0:3          'input' (in 4-component vector of float)
-0:3          'input' (in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
 0:3        true case
-0:4        Branch: Return with expression
-0:4          'input' (in 4-component vector of float)
+0:4        Sequence
+0:4          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:4            'input' (layout(location=0 ) in 4-component vector of float)
+0:4          Branch: Return
 0:6      Test condition and select (temp void)
 0:6        Condition
 0:6        Compare Equal (temp bool)
-0:6          'input' (in 4-component vector of float)
-0:6          'input' (in 4-component vector of float)
+0:6          'input' (layout(location=0 ) in 4-component vector of float)
+0:6          'input' (layout(location=0 ) in 4-component vector of float)
 0:6        true case
-0:7        Branch: Return with expression
-0:7          'input' (in 4-component vector of float)
+0:7        Sequence
+0:7          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
+0:7          Branch: Return
 0:6        false case
-0:9        Branch: Return with expression
-0:9          Negate value (temp 4-component vector of float)
-0:9            'input' (in 4-component vector of float)
+0:9        Sequence
+0:9          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:9            Negate value (temp 4-component vector of float)
+0:9              'input' (layout(location=0 ) in 4-component vector of float)
+0:9          Branch: Return
 0:11      Test condition and select (temp void)
 0:11        Condition
 0:11        Compare Equal (temp bool)
-0:11          'input' (in 4-component vector of float)
-0:11          'input' (in 4-component vector of float)
+0:11          'input' (layout(location=0 ) in 4-component vector of float)
+0:11          'input' (layout(location=0 ) in 4-component vector of float)
 0:11        true case is null
 0:14      Test condition and select (temp void)
 0:14        Condition
 0:14        Compare Equal (temp bool)
-0:14          'input' (in 4-component vector of float)
-0:14          'input' (in 4-component vector of float)
+0:14          'input' (layout(location=0 ) in 4-component vector of float)
+0:14          'input' (layout(location=0 ) in 4-component vector of float)
 0:14        true case is null
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Compare Equal (temp bool)
-0:19          'input' (in 4-component vector of float)
-0:19          'input' (in 4-component vector of float)
+0:19          'input' (layout(location=0 ) in 4-component vector of float)
+0:19          'input' (layout(location=0 ) in 4-component vector of float)
 0:19        true case
 0:?         Sequence
-0:20          Branch: Return with expression
-0:20            'input' (in 4-component vector of float)
+0:20          Sequence
+0:20            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:20              'input' (layout(location=0 ) in 4-component vector of float)
+0:20            Branch: Return
 0:23      Test condition and select (temp void)
 0:23        Condition
 0:23        Compare Equal (temp bool)
-0:23          'input' (in 4-component vector of float)
-0:23          'input' (in 4-component vector of float)
+0:23          'input' (layout(location=0 ) in 4-component vector of float)
+0:23          'input' (layout(location=0 ) in 4-component vector of float)
 0:23        true case
 0:?         Sequence
-0:24          Branch: Return with expression
-0:24            'input' (in 4-component vector of float)
+0:24          Sequence
+0:24            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:24              'input' (layout(location=0 ) in 4-component vector of float)
+0:24            Branch: Return
 0:23        false case
 0:?         Sequence
-0:26          Branch: Return with expression
-0:26            Negate value (temp 4-component vector of float)
-0:26              'input' (in 4-component vector of float)
+0:26          Sequence
+0:26            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:26              Negate value (temp 4-component vector of float)
+0:26                'input' (layout(location=0 ) in 4-component vector of float)
+0:26            Branch: Return
 0:30      Test condition and select (temp void)
 0:30        Condition
 0:30        move second child to first child (temp float)
 0:30          'ii' (temp float)
 0:30          direct index (temp float)
-0:30            'input' (in 4-component vector of float)
+0:30            'input' (layout(location=0 ) in 4-component vector of float)
 0:30            Constant:
 0:30              2 (const int)
 0:30        true case
@@ -75,6 +93,8 @@
 0:32      Pre-Increment (temp int)
 0:32        'ii' (temp int)
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -83,71 +103,89 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:34  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Test condition and select (temp void)
 0:3        Condition
 0:3        Compare Equal (temp bool)
-0:3          'input' (in 4-component vector of float)
-0:3          'input' (in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
 0:3        true case
-0:4        Branch: Return with expression
-0:4          'input' (in 4-component vector of float)
+0:4        Sequence
+0:4          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:4            'input' (layout(location=0 ) in 4-component vector of float)
+0:4          Branch: Return
 0:6      Test condition and select (temp void)
 0:6        Condition
 0:6        Compare Equal (temp bool)
-0:6          'input' (in 4-component vector of float)
-0:6          'input' (in 4-component vector of float)
+0:6          'input' (layout(location=0 ) in 4-component vector of float)
+0:6          'input' (layout(location=0 ) in 4-component vector of float)
 0:6        true case
-0:7        Branch: Return with expression
-0:7          'input' (in 4-component vector of float)
+0:7        Sequence
+0:7          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:7            'input' (layout(location=0 ) in 4-component vector of float)
+0:7          Branch: Return
 0:6        false case
-0:9        Branch: Return with expression
-0:9          Negate value (temp 4-component vector of float)
-0:9            'input' (in 4-component vector of float)
+0:9        Sequence
+0:9          move second child to first child (temp 4-component vector of float)
+0:?             '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:9            Negate value (temp 4-component vector of float)
+0:9              'input' (layout(location=0 ) in 4-component vector of float)
+0:9          Branch: Return
 0:11      Test condition and select (temp void)
 0:11        Condition
 0:11        Compare Equal (temp bool)
-0:11          'input' (in 4-component vector of float)
-0:11          'input' (in 4-component vector of float)
+0:11          'input' (layout(location=0 ) in 4-component vector of float)
+0:11          'input' (layout(location=0 ) in 4-component vector of float)
 0:11        true case is null
 0:14      Test condition and select (temp void)
 0:14        Condition
 0:14        Compare Equal (temp bool)
-0:14          'input' (in 4-component vector of float)
-0:14          'input' (in 4-component vector of float)
+0:14          'input' (layout(location=0 ) in 4-component vector of float)
+0:14          'input' (layout(location=0 ) in 4-component vector of float)
 0:14        true case is null
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Compare Equal (temp bool)
-0:19          'input' (in 4-component vector of float)
-0:19          'input' (in 4-component vector of float)
+0:19          'input' (layout(location=0 ) in 4-component vector of float)
+0:19          'input' (layout(location=0 ) in 4-component vector of float)
 0:19        true case
 0:?         Sequence
-0:20          Branch: Return with expression
-0:20            'input' (in 4-component vector of float)
+0:20          Sequence
+0:20            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:20              'input' (layout(location=0 ) in 4-component vector of float)
+0:20            Branch: Return
 0:23      Test condition and select (temp void)
 0:23        Condition
 0:23        Compare Equal (temp bool)
-0:23          'input' (in 4-component vector of float)
-0:23          'input' (in 4-component vector of float)
+0:23          'input' (layout(location=0 ) in 4-component vector of float)
+0:23          'input' (layout(location=0 ) in 4-component vector of float)
 0:23        true case
 0:?         Sequence
-0:24          Branch: Return with expression
-0:24            'input' (in 4-component vector of float)
+0:24          Sequence
+0:24            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:24              'input' (layout(location=0 ) in 4-component vector of float)
+0:24            Branch: Return
 0:23        false case
 0:?         Sequence
-0:26          Branch: Return with expression
-0:26            Negate value (temp 4-component vector of float)
-0:26              'input' (in 4-component vector of float)
+0:26          Sequence
+0:26            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:26              Negate value (temp 4-component vector of float)
+0:26                'input' (layout(location=0 ) in 4-component vector of float)
+0:26            Branch: Return
 0:30      Test condition and select (temp void)
 0:30        Condition
 0:30        move second child to first child (temp float)
 0:30          'ii' (temp float)
 0:30          direct index (temp float)
-0:30            'input' (in 4-component vector of float)
+0:30            'input' (layout(location=0 ) in 4-component vector of float)
 0:30            Constant:
 0:30              2 (const int)
 0:30        true case
@@ -156,21 +194,25 @@
 0:32      Pre-Increment (temp int)
 0:32        'ii' (temp int)
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 82
+// Id's are bound by 84
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 9
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 19
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 9  "input"
-                              Name 65  "ii"
-                              Name 78  "ii"
+                              Name 19  "@entryPointOutput"
+                              Name 67  "ii"
+                              Name 80  "ii"
+                              Decorate 9(input) Location 0
+                              Decorate 19(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -179,18 +221,20 @@
         9(input):      8(ptr) Variable Input
               12:             TypeBool
               13:             TypeVector 12(bool) 4
-              64:             TypePointer Function 6(float)
-              66:             TypeInt 32 0
-              67:     66(int) Constant 2
-              68:             TypePointer Input 6(float)
-              74:    6(float) Constant 1065353216
-              76:             TypeInt 32 1
-              77:             TypePointer Function 76(int)
-              80:     76(int) Constant 1
+              18:             TypePointer Output 7(fvec4)
+19(@entryPointOutput):     18(ptr) Variable Output
+              66:             TypePointer Function 6(float)
+              68:             TypeInt 32 0
+              69:     68(int) Constant 2
+              70:             TypePointer Input 6(float)
+              76:    6(float) Constant 1065353216
+              78:             TypeInt 32 1
+              79:             TypePointer Function 78(int)
+              82:     78(int) Constant 1
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-          65(ii):     64(ptr) Variable Function
-          78(ii):     77(ptr) Variable Function
+          67(ii):     66(ptr) Variable Function
+          80(ii):     79(ptr) Variable Function
               10:    7(fvec4) Load 9(input)
               11:    7(fvec4) Load 9(input)
               14:   13(bvec4) FOrdEqual 10 11
@@ -198,78 +242,84 @@
                               SelectionMerge 17 None
                               BranchConditional 15 16 17
               16:               Label
-              18:    7(fvec4)   Load 9(input)
-                                ReturnValue 18
+              20:    7(fvec4)   Load 9(input)
+                                Store 19(@entryPointOutput) 20
+                                Return
               17:             Label
-              20:    7(fvec4) Load 9(input)
-              21:    7(fvec4) Load 9(input)
-              22:   13(bvec4) FOrdEqual 20 21
-              23:    12(bool) All 22
-                              SelectionMerge 25 None
-                              BranchConditional 23 24 28
-              24:               Label
-              26:    7(fvec4)   Load 9(input)
-                                ReturnValue 26
-              28:               Label
-              29:    7(fvec4)   Load 9(input)
-              30:    7(fvec4)   FNegate 29
-                                ReturnValue 30
-              25:             Label
-              32:    7(fvec4) Load 9(input)
-              33:    7(fvec4) Load 9(input)
-              34:   13(bvec4) FOrdEqual 32 33
-              35:    12(bool) All 34
-                              SelectionMerge 37 None
-                              BranchConditional 35 36 37
-              36:               Label
-                                Branch 37
-              37:             Label
-              38:    7(fvec4) Load 9(input)
-              39:    7(fvec4) Load 9(input)
-              40:   13(bvec4) FOrdEqual 38 39
-              41:    12(bool) All 40
-                              SelectionMerge 43 None
-                              BranchConditional 41 42 43
-              42:               Label
-                                Branch 43
-              43:             Label
-              44:    7(fvec4) Load 9(input)
-              45:    7(fvec4) Load 9(input)
-              46:   13(bvec4) FOrdEqual 44 45
-              47:    12(bool) All 46
-                              SelectionMerge 49 None
-                              BranchConditional 47 48 49
-              48:               Label
-              50:    7(fvec4)   Load 9(input)
-                                ReturnValue 50
-              49:             Label
-              52:    7(fvec4) Load 9(input)
-              53:    7(fvec4) Load 9(input)
-              54:   13(bvec4) FOrdEqual 52 53
-              55:    12(bool) All 54
-                              SelectionMerge 57 None
-                              BranchConditional 55 56 60
-              56:               Label
-              58:    7(fvec4)   Load 9(input)
-                                ReturnValue 58
-              60:               Label
-              61:    7(fvec4)   Load 9(input)
-              62:    7(fvec4)   FNegate 61
-                                ReturnValue 62
-              57:             Label
-              69:     68(ptr) AccessChain 9(input) 67
-              70:    6(float) Load 69
-                              Store 65(ii) 70
-                              SelectionMerge 72 None
-                              BranchConditional 70 71 72
-              71:               Label
-              73:    6(float)   Load 65(ii)
-              75:    6(float)   FAdd 73 74
-                                Store 65(ii) 75
-                                Branch 72
-              72:             Label
-              79:     76(int) Load 78(ii)
-              81:     76(int) IAdd 79 80
-                              Store 78(ii) 81
+              22:    7(fvec4) Load 9(input)
+              23:    7(fvec4) Load 9(input)
+              24:   13(bvec4) FOrdEqual 22 23
+              25:    12(bool) All 24
+                              SelectionMerge 27 None
+                              BranchConditional 25 26 30
+              26:               Label
+              28:    7(fvec4)   Load 9(input)
+                                Store 19(@entryPointOutput) 28
+                                Return
+              30:               Label
+              31:    7(fvec4)   Load 9(input)
+              32:    7(fvec4)   FNegate 31
+                                Store 19(@entryPointOutput) 32
+                                Return
+              27:             Label
+              34:    7(fvec4) Load 9(input)
+              35:    7(fvec4) Load 9(input)
+              36:   13(bvec4) FOrdEqual 34 35
+              37:    12(bool) All 36
+                              SelectionMerge 39 None
+                              BranchConditional 37 38 39
+              38:               Label
+                                Branch 39
+              39:             Label
+              40:    7(fvec4) Load 9(input)
+              41:    7(fvec4) Load 9(input)
+              42:   13(bvec4) FOrdEqual 40 41
+              43:    12(bool) All 42
+                              SelectionMerge 45 None
+                              BranchConditional 43 44 45
+              44:               Label
+                                Branch 45
+              45:             Label
+              46:    7(fvec4) Load 9(input)
+              47:    7(fvec4) Load 9(input)
+              48:   13(bvec4) FOrdEqual 46 47
+              49:    12(bool) All 48
+                              SelectionMerge 51 None
+                              BranchConditional 49 50 51
+              50:               Label
+              52:    7(fvec4)   Load 9(input)
+                                Store 19(@entryPointOutput) 52
+                                Return
+              51:             Label
+              54:    7(fvec4) Load 9(input)
+              55:    7(fvec4) Load 9(input)
+              56:   13(bvec4) FOrdEqual 54 55
+              57:    12(bool) All 56
+                              SelectionMerge 59 None
+                              BranchConditional 57 58 62
+              58:               Label
+              60:    7(fvec4)   Load 9(input)
+                                Store 19(@entryPointOutput) 60
+                                Return
+              62:               Label
+              63:    7(fvec4)   Load 9(input)
+              64:    7(fvec4)   FNegate 63
+                                Store 19(@entryPointOutput) 64
+                                Return
+              59:             Label
+              71:     70(ptr) AccessChain 9(input) 69
+              72:    6(float) Load 71
+                              Store 67(ii) 72
+                              SelectionMerge 74 None
+                              BranchConditional 72 73 74
+              73:               Label
+              75:    6(float)   Load 67(ii)
+              77:    6(float)   FAdd 75 76
+                                Store 67(ii) 77
+                                Branch 74
+              74:             Label
+              81:     78(int) Load 80(ii)
+              83:     78(int) IAdd 81 82
+                              Store 80(ii) 83
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.init.frag.out b/Test/baseResults/hlsl.init.frag.out
index bc7c21b..99acc23 100755
--- a/Test/baseResults/hlsl.init.frag.out
+++ b/Test/baseResults/hlsl.init.frag.out
@@ -78,9 +78,9 @@
 0:18      Constant:
 0:18        4 (const uint)
 0:18        5 (const uint)
-0:37  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
+0:21  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
 0:21    Function Parameters: 
-0:21      'input' (in 4-component vector of float)
+0:21      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:22      Sequence
 0:22        move second child to first child (temp 4-component vector of float)
@@ -124,10 +124,13 @@
 0:33        move second child to first child (temp float)
 0:33          'a9' (temp float)
 0:33          'a5' (global float)
-0:35      Branch: Return with expression
-0:35        component-wise multiply (temp 4-component vector of float)
-0:35          'input' (in 4-component vector of float)
-0:35          'a1' (global 4-component vector of float)
+0:35      Sequence
+0:35        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:35          component-wise multiply (temp 4-component vector of float)
+0:35            'input' (layout(location=0 ) in 4-component vector of float)
+0:35            'a1' (global 4-component vector of float)
+0:35        Branch: Return
 0:?   Linker Objects
 0:?     'a1' (global 4-component vector of float)
 0:?     'b1' (global 4-component vector of float)
@@ -147,6 +150,8 @@
 0:?     'single2' (global structure{temp 2-component vector of uint v})
 0:?     'single3' (global structure{temp structure{temp int f} s1})
 0:?     'single4' (global structure{temp structure{temp 2-component vector of uint v} s1})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -231,9 +236,9 @@
 0:18      Constant:
 0:18        4 (const uint)
 0:18        5 (const uint)
-0:37  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
+0:21  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
 0:21    Function Parameters: 
-0:21      'input' (in 4-component vector of float)
+0:21      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:22      Sequence
 0:22        move second child to first child (temp 4-component vector of float)
@@ -277,10 +282,13 @@
 0:33        move second child to first child (temp float)
 0:33          'a9' (temp float)
 0:33          'a5' (global float)
-0:35      Branch: Return with expression
-0:35        component-wise multiply (temp 4-component vector of float)
-0:35          'input' (in 4-component vector of float)
-0:35          'a1' (global 4-component vector of float)
+0:35      Sequence
+0:35        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:35          component-wise multiply (temp 4-component vector of float)
+0:35            'input' (layout(location=0 ) in 4-component vector of float)
+0:35            'a1' (global 4-component vector of float)
+0:35        Branch: Return
 0:?   Linker Objects
 0:?     'a1' (global 4-component vector of float)
 0:?     'b1' (global 4-component vector of float)
@@ -300,17 +308,18 @@
 0:?     'single2' (global structure{temp 2-component vector of uint v})
 0:?     'single3' (global structure{temp structure{temp int f} s1})
 0:?     'single4' (global structure{temp structure{temp 2-component vector of uint v} s1})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 95
+// Id's are bound by 97
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "ShaderFunction" 88
+                              EntryPoint Fragment 4  "ShaderFunction" 88 90
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "ShaderFunction"
                               Name 9  "a1"
                               Name 14  "b1"
@@ -348,9 +357,12 @@
                               Name 82  "a8"
                               Name 83  "b2"
                               Name 85  "a9"
-                              Name 88  "input"
-                              Name 93  "c4"
-                              Name 94  "b5"
+                              Name 88  "@entryPointOutput"
+                              Name 90  "input"
+                              Name 95  "c4"
+                              Name 96  "b5"
+                              Decorate 88(@entryPointOutput) Location 0
+                              Decorate 90(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -419,10 +431,12 @@
               73:     32(int) Constant 12
               81:             TypePointer Function 6(float)
           83(b2):     22(ptr) Variable Private
-              87:             TypePointer Input 7(fvec4)
-       88(input):     87(ptr) Variable Input
-          93(c4):     22(ptr) Variable Private
-          94(b5):     22(ptr) Variable Private
+              87:             TypePointer Output 7(fvec4)
+88(@entryPointOutput):     87(ptr) Variable Output
+              89:             TypePointer Input 7(fvec4)
+       90(input):     89(ptr) Variable Input
+          95(c4):     22(ptr) Variable Private
+          96(b5):     22(ptr) Variable Private
 4(ShaderFunction):           2 Function None 3
                5:             Label
           62(a2):     61(ptr) Variable Function
@@ -458,8 +472,9 @@
                               Store 82(a8) 84
               86:    6(float) Load 29(a5)
                               Store 85(a9) 86
-              89:    7(fvec4) Load 88(input)
-              90:    7(fvec4) Load 9(a1)
-              91:    7(fvec4) FMul 89 90
-                              ReturnValue 91
+              91:    7(fvec4) Load 90(input)
+              92:    7(fvec4) Load 9(a1)
+              93:    7(fvec4) FMul 91 92
+                              Store 88(@entryPointOutput) 93
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.init2.frag.out b/Test/baseResults/hlsl.init2.frag.out
index 439fd37..3657cb2 100644
--- a/Test/baseResults/hlsl.init2.frag.out
+++ b/Test/baseResults/hlsl.init2.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:23  Function Definition: Test1( (global void)
+0:3  Function Definition: Test1( (global void)
 0:3    Function Parameters: 
 0:?     Sequence
 0:5      Sequence
@@ -29,7 +29,7 @@
 0:20            8.000000
 0:20            9.000000
 0:20            10.000000
-0:33  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:26  Function Definition: main( (global structure{temp 4-component vector of float color})
 0:26    Function Parameters: 
 0:?     Sequence
 0:27      Function Call: Test1( (global void)
@@ -43,9 +43,17 @@
 0:30          1.000000
 0:30          1.000000
 0:30          1.000000
-0:31      Branch: Return with expression
-0:31        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?       Sequence
+0:?         Sequence
+0:31          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:31            color: direct index for structure (temp 4-component vector of float)
+0:31              'ps_output' (temp structure{temp 4-component vector of float color})
+0:31              Constant:
+0:31                0 (const int)
+0:31        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -54,7 +62,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:23  Function Definition: Test1( (global void)
+0:3  Function Definition: Test1( (global void)
 0:3    Function Parameters: 
 0:?     Sequence
 0:5      Sequence
@@ -81,7 +89,7 @@
 0:20            8.000000
 0:20            9.000000
 0:20            10.000000
-0:33  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:26  Function Definition: main( (global structure{temp 4-component vector of float color})
 0:26    Function Parameters: 
 0:?     Sequence
 0:27      Function Call: Test1( (global void)
@@ -95,20 +103,27 @@
 0:30          1.000000
 0:30          1.000000
 0:30          1.000000
-0:31      Branch: Return with expression
-0:31        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?       Sequence
+0:?         Sequence
+0:31          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:31            color: direct index for structure (temp 4-component vector of float)
+0:31              'ps_output' (temp structure{temp 4-component vector of float color})
+0:31              Constant:
+0:31                0 (const int)
+0:31        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 44
+// Id's are bound by 47
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 43
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 6  "Test1("
                               Name 10  "mystruct"
@@ -124,6 +139,8 @@
                               Name 34  "PS_OUTPUT"
                               MemberName 34(PS_OUTPUT) 0  "color"
                               Name 36  "ps_output"
+                              Name 43  "color"
+                              Decorate 43(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
@@ -153,14 +170,18 @@
               38:     37(int) Constant 0
               39:   33(fvec4) ConstantComposite 13 13 13 13
               40:             TypePointer Function 33(fvec4)
+              42:             TypePointer Output 33(fvec4)
+       43(color):     42(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
    36(ps_output):     35(ptr) Variable Function
               32:           2 FunctionCall 6(Test1()
               41:     40(ptr) AccessChain 36(ps_output) 38
                               Store 41 39
-              42:34(PS_OUTPUT) Load 36(ps_output)
-                              ReturnValue 42
+              44:     40(ptr) AccessChain 36(ps_output) 38
+              45:   33(fvec4) Load 44
+                              Store 43(color) 45
+                              Return
                               FunctionEnd
        6(Test1():           2 Function None 3
                7:             Label
diff --git a/Test/baseResults/hlsl.inoutquals.frag.out b/Test/baseResults/hlsl.inoutquals.frag.out
index 3fb207b..2fcb722 100644
--- a/Test/baseResults/hlsl.inoutquals.frag.out
+++ b/Test/baseResults/hlsl.inoutquals.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: MyFunc(f1;f1;f1; (global void)
+0:8  Function Definition: MyFunc(f1;f1;f1; (global void)
 0:8    Function Parameters: 
 0:8      'x' (in float)
 0:8      'y' (out float)
@@ -18,7 +18,7 @@
 0:11        'x' (in float)
 0:11        Constant:
 0:11          -1.000000
-0:26  Function Definition: main(vf4; (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:15  Function Definition: main(vf4; (global structure{temp 4-component vector of float Color, temp float Depth})
 0:15    Function Parameters: 
 0:15      'inpos' (noperspective in 4-component vector of float FragCoord)
 0:?     Sequence
@@ -37,7 +37,7 @@
 0:19        'z' (temp float)
 0:21      move second child to first child (temp 4-component vector of float)
 0:21        Color: direct index for structure (temp 4-component vector of float)
-0:21          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:21          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:21          Constant:
 0:21            0 (const int)
 0:?         Construct vec4 (temp 4-component vector of float)
@@ -47,17 +47,33 @@
 0:21          Constant:
 0:21            1.000000
 0:22      move second child to first child (temp float)
-0:22        Depth: direct index for structure (temp float FragDepth)
-0:22          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:22        Depth: direct index for structure (temp float)
+0:22          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:22          Constant:
 0:22            1 (const int)
 0:22        direct index (temp float)
 0:22          'inpos' (noperspective in 4-component vector of float FragCoord)
 0:22          Constant:
 0:22            3 (const int)
-0:24      Branch: Return with expression
-0:24        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:24          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:24            Color: direct index for structure (temp 4-component vector of float)
+0:24              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:24              Constant:
+0:24                0 (const int)
+0:24          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:24            Depth: direct index for structure (temp float)
+0:24              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:24              Constant:
+0:24                1 (const int)
+0:24        Branch: Return
 0:?   Linker Objects
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
+0:?     'inpos' (noperspective in 4-component vector of float FragCoord)
 
 
 Linked fragment stage:
@@ -66,7 +82,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:14  Function Definition: MyFunc(f1;f1;f1; (global void)
+0:8  Function Definition: MyFunc(f1;f1;f1; (global void)
 0:8    Function Parameters: 
 0:8      'x' (in float)
 0:8      'y' (out float)
@@ -82,7 +98,7 @@
 0:11        'x' (in float)
 0:11        Constant:
 0:11          -1.000000
-0:26  Function Definition: main(vf4; (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:15  Function Definition: main(vf4; (global structure{temp 4-component vector of float Color, temp float Depth})
 0:15    Function Parameters: 
 0:15      'inpos' (noperspective in 4-component vector of float FragCoord)
 0:?     Sequence
@@ -101,7 +117,7 @@
 0:19        'z' (temp float)
 0:21      move second child to first child (temp 4-component vector of float)
 0:21        Color: direct index for structure (temp 4-component vector of float)
-0:21          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:21          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:21          Constant:
 0:21            0 (const int)
 0:?         Construct vec4 (temp 4-component vector of float)
@@ -111,28 +127,43 @@
 0:21          Constant:
 0:21            1.000000
 0:22      move second child to first child (temp float)
-0:22        Depth: direct index for structure (temp float FragDepth)
-0:22          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:22        Depth: direct index for structure (temp float)
+0:22          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:22          Constant:
 0:22            1 (const int)
 0:22        direct index (temp float)
 0:22          'inpos' (noperspective in 4-component vector of float FragCoord)
 0:22          Constant:
 0:22            3 (const int)
-0:24      Branch: Return with expression
-0:24        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:24          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:24            Color: direct index for structure (temp 4-component vector of float)
+0:24              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:24              Constant:
+0:24                0 (const int)
+0:24          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:24            Depth: direct index for structure (temp float)
+0:24              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:24              Constant:
+0:24                1 (const int)
+0:24        Branch: Return
 0:?   Linker Objects
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
+0:?     'inpos' (noperspective in 4-component vector of float FragCoord)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 54
+// Id's are bound by 61
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 45
+                              EntryPoint Fragment 4  "main" 45 53 57
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 12  "MyFunc(f1;f1;f1;"
                               Name 9  "x"
@@ -149,9 +180,12 @@
                               MemberName 31(PS_OUTPUT) 1  "Depth"
                               Name 33  "psout"
                               Name 45  "inpos"
-                              MemberDecorate 31(PS_OUTPUT) 1 BuiltIn FragDepth
+                              Name 53  "Color"
+                              Name 57  "Depth"
                               Decorate 45(inpos) NoPerspective
                               Decorate 45(inpos) BuiltIn FragCoord
+                              Decorate 53(Color) Location 0
+                              Decorate 57(Depth) BuiltIn FragDepth
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -173,6 +207,10 @@
               46:             TypeInt 32 0
               47:     46(int) Constant 3
               48:             TypePointer Input 6(float)
+              52:             TypePointer Output 30(fvec4)
+       53(Color):     52(ptr) Variable Output
+              56:             TypePointer Output 6(float)
+       57(Depth):     56(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            17(x):      7(ptr) Variable Function
@@ -203,8 +241,13 @@
               50:    6(float) Load 49
               51:      7(ptr) AccessChain 33(psout) 43
                               Store 51 50
-              52:31(PS_OUTPUT) Load 33(psout)
-                              ReturnValue 52
+              54:     41(ptr) AccessChain 33(psout) 35
+              55:   30(fvec4) Load 54
+                              Store 53(Color) 55
+              58:      7(ptr) AccessChain 33(psout) 43
+              59:    6(float) Load 58
+                              Store 57(Depth) 59
+                              Return
                               FunctionEnd
 12(MyFunc(f1;f1;f1;):           2 Function None 8
             9(x):      7(ptr) FunctionParameter
diff --git a/Test/baseResults/hlsl.intrinsics.barriers.comp.out b/Test/baseResults/hlsl.intrinsics.barriers.comp.out
index c400fea..95e1725 100644
--- a/Test/baseResults/hlsl.intrinsics.barriers.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.barriers.comp.out
@@ -2,7 +2,7 @@
 Shader version: 450
 local_size = (1, 1, 1)
 0:? Sequence
-0:14  Function Definition: ComputeShaderFunction( (global float)
+0:3  Function Definition: ComputeShaderFunction( (global float)
 0:3    Function Parameters: 
 0:?     Sequence
 0:4      MemoryBarrier (global void)
@@ -11,10 +11,14 @@
 0:7      GroupMemoryBarrierWithGroupSync (global void)
 0:8      WorkgroupMemoryBarrier (global void)
 0:9      WorkgroupMemoryBarrierWithGroupSync (global void)
-0:11      Branch: Return with expression
-0:11        Constant:
-0:11          0.000000
+0:11      Sequence
+0:11        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:11          Constant:
+0:11            0.000000
+0:11        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
 
 
 Linked compute stage:
@@ -23,7 +27,7 @@
 Shader version: 450
 local_size = (1, 1, 1)
 0:? Sequence
-0:14  Function Definition: ComputeShaderFunction( (global float)
+0:3  Function Definition: ComputeShaderFunction( (global float)
 0:3    Function Parameters: 
 0:?     Sequence
 0:4      MemoryBarrier (global void)
@@ -32,22 +36,27 @@
 0:7      GroupMemoryBarrierWithGroupSync (global void)
 0:8      WorkgroupMemoryBarrier (global void)
 0:9      WorkgroupMemoryBarrierWithGroupSync (global void)
-0:11      Branch: Return with expression
-0:11        Constant:
-0:11          0.000000
+0:11      Sequence
+0:11        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:11          Constant:
+0:11            0.000000
+0:11        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 15
+// Id's are bound by 17
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "ComputeShaderFunction"
+                              EntryPoint GLCompute 4  "ComputeShaderFunction" 14
                               ExecutionMode 4 LocalSize 1 1 1
-                              Source HLSL 450
                               Name 4  "ComputeShaderFunction"
+                              Name 14  "@entryPointOutput"
+                              Decorate 14(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -57,7 +66,9 @@
               10:      6(int) Constant 2
               11:      6(int) Constant 256
               12:             TypeFloat 32
-              13:   12(float) Constant 0
+              13:             TypePointer Output 12(float)
+14(@entryPointOutput):     13(ptr) Variable Output
+              15:   12(float) Constant 0
 4(ComputeShaderFunction):           2 Function None 3
                5:             Label
                               MemoryBarrier 7 8
@@ -66,5 +77,6 @@
                               ControlBarrier 7 7 9
                               MemoryBarrier 10 11
                               ControlBarrier 10 10 11
-                              ReturnValue 13
+                              Store 14(@entryPointOutput) 15
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.comp.out b/Test/baseResults/hlsl.intrinsics.comp.out
index 4c7eabb..b760c65 100644
--- a/Test/baseResults/hlsl.intrinsics.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.comp.out
@@ -2,7 +2,7 @@
 Shader version: 450
 local_size = (1, 1, 1)
 0:? Sequence
-0:44  Function Definition: ComputeShaderFunctionS(f1;f1;f1;u1;u1; (global float)
+0:17  Function Definition: ComputeShaderFunctionS(f1;f1;f1;u1;u1; (global float)
 0:17    Function Parameters: 
 0:17      'inF0' (in float)
 0:17      'inF1' (in float)
@@ -74,7 +74,7 @@
 0:41      Branch: Return with expression
 0:41        Constant:
 0:41          0.000000
-0:50  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
+0:45  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
 0:45    Function Parameters: 
 0:45      'inF0' (in 1-component vector of float)
 0:45      'inF1' (in 1-component vector of float)
@@ -83,7 +83,7 @@
 0:47      Branch: Return with expression
 0:47        Constant:
 0:47          0.000000
-0:77  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
+0:51  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
 0:51    Function Parameters: 
 0:51      'inF0' (in 2-component vector of float)
 0:51      'inF1' (in 2-component vector of float)
@@ -156,7 +156,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:104  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
+0:78  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
 0:78    Function Parameters: 
 0:78      'inF0' (in 3-component vector of float)
 0:78      'inF1' (in 3-component vector of float)
@@ -230,16 +230,16 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:130  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
+0:105  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
 0:105    Function Parameters: 
-0:105      'inF0' (in 4-component vector of float)
-0:105      'inF1' (in 4-component vector of float)
-0:105      'inF2' (in 4-component vector of float)
-0:105      'inU0' (in 4-component vector of uint)
-0:105      'inU1' (in 4-component vector of uint)
+0:105      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:105      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:105      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:105      'inU0' (layout(location=3 ) in 4-component vector of uint)
+0:105      'inU1' (layout(location=4 ) in 4-component vector of uint)
 0:?     Sequence
 0:109      all (global bool)
-0:109        'inF0' (in 4-component vector of float)
+0:109        'inF0' (layout(location=0 ) in 4-component vector of float)
 0:112      AtomicAdd (global void)
 0:112        'gs_ua4' (global 4-component vector of uint)
 0:112        'gs_ub4' (global 4-component vector of uint)
@@ -299,12 +299,15 @@
 0:125        AtomicXor (temp 4-component vector of uint)
 0:125          'gs_ua4' (global 4-component vector of uint)
 0:125          'gs_ub4' (global 4-component vector of uint)
-0:128      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
+0:128      Sequence
+0:128        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:128        Branch: Return
 0:?   Linker Objects
 0:?     'gs_ua' (global uint)
 0:?     'gs_ub' (global uint)
@@ -318,6 +321,12 @@
 0:?     'gs_ua4' (global 4-component vector of uint)
 0:?     'gs_ub4' (global 4-component vector of uint)
 0:?     'gs_uc4' (global 4-component vector of uint)
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inU0' (layout(location=3 ) in 4-component vector of uint)
+0:?     'inU1' (layout(location=4 ) in 4-component vector of uint)
 
 
 Linked compute stage:
@@ -326,7 +335,7 @@
 Shader version: 450
 local_size = (1, 1, 1)
 0:? Sequence
-0:44  Function Definition: ComputeShaderFunctionS(f1;f1;f1;u1;u1; (global float)
+0:17  Function Definition: ComputeShaderFunctionS(f1;f1;f1;u1;u1; (global float)
 0:17    Function Parameters: 
 0:17      'inF0' (in float)
 0:17      'inF1' (in float)
@@ -398,7 +407,7 @@
 0:41      Branch: Return with expression
 0:41        Constant:
 0:41          0.000000
-0:50  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
+0:45  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
 0:45    Function Parameters: 
 0:45      'inF0' (in 1-component vector of float)
 0:45      'inF1' (in 1-component vector of float)
@@ -407,7 +416,7 @@
 0:47      Branch: Return with expression
 0:47        Constant:
 0:47          0.000000
-0:77  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
+0:51  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
 0:51    Function Parameters: 
 0:51      'inF0' (in 2-component vector of float)
 0:51      'inF1' (in 2-component vector of float)
@@ -480,7 +489,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:104  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
+0:78  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
 0:78    Function Parameters: 
 0:78      'inF0' (in 3-component vector of float)
 0:78      'inF1' (in 3-component vector of float)
@@ -554,16 +563,16 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:130  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
+0:105  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
 0:105    Function Parameters: 
-0:105      'inF0' (in 4-component vector of float)
-0:105      'inF1' (in 4-component vector of float)
-0:105      'inF2' (in 4-component vector of float)
-0:105      'inU0' (in 4-component vector of uint)
-0:105      'inU1' (in 4-component vector of uint)
+0:105      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:105      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:105      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:105      'inU0' (layout(location=3 ) in 4-component vector of uint)
+0:105      'inU1' (layout(location=4 ) in 4-component vector of uint)
 0:?     Sequence
 0:109      all (global bool)
-0:109        'inF0' (in 4-component vector of float)
+0:109        'inF0' (layout(location=0 ) in 4-component vector of float)
 0:112      AtomicAdd (global void)
 0:112        'gs_ua4' (global 4-component vector of uint)
 0:112        'gs_ub4' (global 4-component vector of uint)
@@ -623,12 +632,15 @@
 0:125        AtomicXor (temp 4-component vector of uint)
 0:125          'gs_ua4' (global 4-component vector of uint)
 0:125          'gs_ub4' (global 4-component vector of uint)
-0:128      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
+0:128      Sequence
+0:128        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:128        Branch: Return
 0:?   Linker Objects
 0:?     'gs_ua' (global uint)
 0:?     'gs_ub' (global uint)
@@ -642,17 +654,22 @@
 0:?     'gs_ua4' (global 4-component vector of uint)
 0:?     'gs_ub4' (global 4-component vector of uint)
 0:?     'gs_uc4' (global 4-component vector of uint)
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inU0' (layout(location=3 ) in 4-component vector of uint)
+0:?     'inU1' (layout(location=4 ) in 4-component vector of uint)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 217
+// Id's are bound by 224
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "ComputeShaderFunction" 175
+                              EntryPoint GLCompute 4  "ComputeShaderFunction" 175 215 219 220 222 223
                               ExecutionMode 4 LocalSize 1 1 1
-                              Source HLSL 450
                               Name 4  "ComputeShaderFunction"
                               Name 16  "ComputeShaderFunctionS(f1;f1;f1;u1;u1;"
                               Name 11  "inF0"
@@ -693,6 +710,17 @@
                               Name 181  "gs_ub4"
                               Name 185  "out_u4"
                               Name 193  "gs_uc4"
+                              Name 215  "@entryPointOutput"
+                              Name 219  "inF1"
+                              Name 220  "inF2"
+                              Name 222  "inU0"
+                              Name 223  "inU1"
+                              Decorate 175(inF0) Location 0
+                              Decorate 215(@entryPointOutput) Location 0
+                              Decorate 219(inF1) Location 1
+                              Decorate 220(inF2) Location 2
+                              Decorate 222(inU0) Location 3
+                              Decorate 223(inU1) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -741,8 +769,15 @@
      181(gs_ub4):    179(ptr) Variable Private
              184:             TypePointer Function 178(ivec4)
      193(gs_uc4):    179(ptr) Variable Private
-             214:    6(float) Constant 1082130432
-             215:  173(fvec4) ConstantComposite 128 129 169 214
+             214:             TypePointer Output 173(fvec4)
+215(@entryPointOutput):    214(ptr) Variable Output
+             216:    6(float) Constant 1082130432
+             217:  173(fvec4) ConstantComposite 128 129 169 216
+       219(inF1):    174(ptr) Variable Input
+       220(inF2):    174(ptr) Variable Input
+             221:             TypePointer Input 178(ivec4)
+       222(inU0):    221(ptr) Variable Input
+       223(inU1):    221(ptr) Variable Input
 4(ComputeShaderFunction):           2 Function None 3
                5:             Label
      185(out_u4):    184(ptr) Variable Function
@@ -785,7 +820,8 @@
              212:  178(ivec4) Load 181(gs_ub4)
              213:  178(ivec4) AtomicXor 180(gs_ua4) 55 56 212
                               Store 185(out_u4) 213
-                              ReturnValue 215
+                              Store 215(@entryPointOutput) 217
+                              Return
                               FunctionEnd
 16(ComputeShaderFunctionS(f1;f1;f1;u1;u1;):    6(float) Function None 10
         11(inF0):      7(ptr) FunctionParameter
diff --git a/Test/baseResults/hlsl.intrinsics.double.frag.out b/Test/baseResults/hlsl.intrinsics.double.frag.out
index 8bfc072..0dba032 100644
--- a/Test/baseResults/hlsl.intrinsics.double.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.double.frag.out
@@ -2,35 +2,47 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:12  Function Definition: PixelShaderFunction(d1;d1;d1;vd2;vd3;vd4;u1;u1; (global float)
+0:5  Function Definition: PixelShaderFunction(d1;d1;d1;vd2;vd3;vd4;u1;u1; (global float)
 0:5    Function Parameters: 
-0:5      'inDV1a' (in double)
-0:5      'inDV1b' (in double)
-0:5      'inDV1c' (in double)
-0:5      'inDV2' (in 2-component vector of double)
-0:5      'inDV3' (in 3-component vector of double)
-0:5      'inDV4' (in 4-component vector of double)
-0:5      'inU1a' (in uint)
-0:5      'inU1b' (in uint)
+0:5      'inDV1a' (layout(location=0 ) in double)
+0:5      'inDV1b' (layout(location=1 ) in double)
+0:5      'inDV1c' (layout(location=2 ) in double)
+0:5      'inDV2' (layout(location=3 ) in 2-component vector of double)
+0:5      'inDV3' (layout(location=4 ) in 3-component vector of double)
+0:5      'inDV4' (layout(location=6 ) in 4-component vector of double)
+0:5      'inU1a' (layout(location=8 ) in uint)
+0:5      'inU1b' (layout(location=9 ) in uint)
 0:?     Sequence
 0:6      Sequence
 0:6        move second child to first child (temp double)
 0:6          'r00' (temp double)
 0:6          fma (global double)
-0:6            'inDV1a' (in double)
-0:6            'inDV1b' (in double)
-0:6            'inDV1c' (in double)
+0:6            'inDV1a' (layout(location=0 ) in double)
+0:6            'inDV1b' (layout(location=1 ) in double)
+0:6            'inDV1c' (layout(location=2 ) in double)
 0:7      Sequence
 0:7        move second child to first child (temp double)
 0:7          'r01' (temp double)
 0:7          uint64BitsToDouble (temp double)
 0:7            Construct uvec2 (temp 2-component vector of uint)
-0:7              'inU1a' (in uint)
-0:7              'inU1b' (in uint)
-0:9      Branch: Return with expression
-0:9        Constant:
-0:9          0.000000
+0:7              'inU1a' (layout(location=8 ) in uint)
+0:7              'inU1b' (layout(location=9 ) in uint)
+0:9      Sequence
+0:9        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:9          Constant:
+0:9            0.000000
+0:9        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
+0:?     'inDV1a' (layout(location=0 ) in double)
+0:?     'inDV1b' (layout(location=1 ) in double)
+0:?     'inDV1c' (layout(location=2 ) in double)
+0:?     'inDV2' (layout(location=3 ) in 2-component vector of double)
+0:?     'inDV3' (layout(location=4 ) in 3-component vector of double)
+0:?     'inDV4' (layout(location=6 ) in 4-component vector of double)
+0:?     'inU1a' (layout(location=8 ) in uint)
+0:?     'inU1b' (layout(location=9 ) in uint)
 
 
 Linked fragment stage:
@@ -39,47 +51,58 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:12  Function Definition: PixelShaderFunction(d1;d1;d1;vd2;vd3;vd4;u1;u1; (global float)
+0:5  Function Definition: PixelShaderFunction(d1;d1;d1;vd2;vd3;vd4;u1;u1; (global float)
 0:5    Function Parameters: 
-0:5      'inDV1a' (in double)
-0:5      'inDV1b' (in double)
-0:5      'inDV1c' (in double)
-0:5      'inDV2' (in 2-component vector of double)
-0:5      'inDV3' (in 3-component vector of double)
-0:5      'inDV4' (in 4-component vector of double)
-0:5      'inU1a' (in uint)
-0:5      'inU1b' (in uint)
+0:5      'inDV1a' (layout(location=0 ) in double)
+0:5      'inDV1b' (layout(location=1 ) in double)
+0:5      'inDV1c' (layout(location=2 ) in double)
+0:5      'inDV2' (layout(location=3 ) in 2-component vector of double)
+0:5      'inDV3' (layout(location=4 ) in 3-component vector of double)
+0:5      'inDV4' (layout(location=6 ) in 4-component vector of double)
+0:5      'inU1a' (layout(location=8 ) in uint)
+0:5      'inU1b' (layout(location=9 ) in uint)
 0:?     Sequence
 0:6      Sequence
 0:6        move second child to first child (temp double)
 0:6          'r00' (temp double)
 0:6          fma (global double)
-0:6            'inDV1a' (in double)
-0:6            'inDV1b' (in double)
-0:6            'inDV1c' (in double)
+0:6            'inDV1a' (layout(location=0 ) in double)
+0:6            'inDV1b' (layout(location=1 ) in double)
+0:6            'inDV1c' (layout(location=2 ) in double)
 0:7      Sequence
 0:7        move second child to first child (temp double)
 0:7          'r01' (temp double)
 0:7          uint64BitsToDouble (temp double)
 0:7            Construct uvec2 (temp 2-component vector of uint)
-0:7              'inU1a' (in uint)
-0:7              'inU1b' (in uint)
-0:9      Branch: Return with expression
-0:9        Constant:
-0:9          0.000000
+0:7              'inU1a' (layout(location=8 ) in uint)
+0:7              'inU1b' (layout(location=9 ) in uint)
+0:9      Sequence
+0:9        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:9          Constant:
+0:9            0.000000
+0:9        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
+0:?     'inDV1a' (layout(location=0 ) in double)
+0:?     'inDV1b' (layout(location=1 ) in double)
+0:?     'inDV1c' (layout(location=2 ) in double)
+0:?     'inDV2' (layout(location=3 ) in 2-component vector of double)
+0:?     'inDV3' (layout(location=4 ) in 3-component vector of double)
+0:?     'inDV4' (layout(location=6 ) in 4-component vector of double)
+0:?     'inU1a' (layout(location=8 ) in uint)
+0:?     'inU1b' (layout(location=9 ) in uint)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 30
+// Id's are bound by 41
 
                               Capability Shader
                               Capability Float64
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 10 12 14 20 22
+                              EntryPoint Fragment 4  "PixelShaderFunction" 10 12 14 20 22 29 34 37 40
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 8  "r00"
                               Name 10  "inDV1a"
@@ -88,6 +111,19 @@
                               Name 17  "r01"
                               Name 20  "inU1a"
                               Name 22  "inU1b"
+                              Name 29  "@entryPointOutput"
+                              Name 34  "inDV2"
+                              Name 37  "inDV3"
+                              Name 40  "inDV4"
+                              Decorate 10(inDV1a) Location 0
+                              Decorate 12(inDV1b) Location 1
+                              Decorate 14(inDV1c) Location 2
+                              Decorate 20(inU1a) Location 8
+                              Decorate 22(inU1b) Location 9
+                              Decorate 29(@entryPointOutput) Location 0
+                              Decorate 34(inDV2) Location 3
+                              Decorate 37(inDV3) Location 4
+                              Decorate 40(inDV4) Location 6
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 64
@@ -102,7 +138,18 @@
        22(inU1b):     19(ptr) Variable Input
               24:             TypeVector 18(int) 2
               27:             TypeFloat 32
-              28:   27(float) Constant 0
+              28:             TypePointer Output 27(float)
+29(@entryPointOutput):     28(ptr) Variable Output
+              30:   27(float) Constant 0
+              32:             TypeVector 6(float) 2
+              33:             TypePointer Input 32(fvec2)
+       34(inDV2):     33(ptr) Variable Input
+              35:             TypeVector 6(float) 3
+              36:             TypePointer Input 35(fvec3)
+       37(inDV3):     36(ptr) Variable Input
+              38:             TypeVector 6(float) 4
+              39:             TypePointer Input 38(fvec4)
+       40(inDV4):     39(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
           8(r00):      7(ptr) Variable Function
@@ -117,5 +164,6 @@
               25:   24(ivec2) CompositeConstruct 21 23
               26:    6(float) Bitcast 25
                               Store 17(r01) 26
-                              ReturnValue 28
+                              Store 29(@entryPointOutput) 30
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
index f1b6411..a23a883 100644
--- a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
@@ -2,41 +2,41 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:11  Function Definition: main(f1;vf2;vf3;vf4;vi2; (global void)
+0:3  Function Definition: main(f1;vf2;vf3;vf4;vi2; (global void)
 0:3    Function Parameters: 
-0:3      'inF1' (in float)
-0:3      'inF2' (in 2-component vector of float)
-0:3      'inF3' (in 3-component vector of float)
-0:3      'inF4' (in 4-component vector of float)
-0:3      'inI2' (in 2-component vector of int)
+0:3      'inF1' (layout(location=0 ) in float)
+0:3      'inF2' (layout(location=1 ) in 2-component vector of float)
+0:3      'inF3' (layout(location=2 ) in 3-component vector of float)
+0:3      'inF4' (layout(location=3 ) in 4-component vector of float)
+0:3      'inI2' (layout(location=4 ) in 2-component vector of int)
 0:?     Sequence
 0:4      interpolateAtOffset (temp float)
-0:4        'inF1' (in float)
+0:4        'inF1' (layout(location=0 ) in float)
 0:?         Constant:
 0:?           -0.500000
 0:?           -0.062500
 0:5      interpolateAtOffset (temp 2-component vector of float)
-0:5        'inF2' (in 2-component vector of float)
+0:5        'inF2' (layout(location=1 ) in 2-component vector of float)
 0:?         Constant:
 0:?           0.000000
 0:?           0.062500
 0:6      interpolateAtOffset (temp 3-component vector of float)
-0:6        'inF3' (in 3-component vector of float)
+0:6        'inF3' (layout(location=2 ) in 3-component vector of float)
 0:?         Constant:
 0:?           0.187500
 0:?           -0.375000
 0:7      interpolateAtOffset (temp 4-component vector of float)
-0:7        'inF4' (in 4-component vector of float)
+0:7        'inF4' (layout(location=3 ) in 4-component vector of float)
 0:?         Constant:
 0:?           0.437500
 0:?           -0.500000
 0:9      interpolateAtOffset (temp float)
-0:9        'inF1' (in float)
+0:9        'inF1' (layout(location=0 ) in float)
 0:9        vector-scale (temp 2-component vector of float)
 0:9          Convert int to float (temp 2-component vector of float)
 0:9            right-shift (temp 2-component vector of int)
 0:9              left-shift (temp 2-component vector of int)
-0:9                'inI2' (in 2-component vector of int)
+0:9                'inI2' (layout(location=4 ) in 2-component vector of int)
 0:9                Constant:
 0:9                  28 (const int)
 0:9              Constant:
@@ -44,6 +44,11 @@
 0:9          Constant:
 0:9            0.062500
 0:?   Linker Objects
+0:?     'inF1' (layout(location=0 ) in float)
+0:?     'inF2' (layout(location=1 ) in 2-component vector of float)
+0:?     'inF3' (layout(location=2 ) in 3-component vector of float)
+0:?     'inF4' (layout(location=3 ) in 4-component vector of float)
+0:?     'inI2' (layout(location=4 ) in 2-component vector of int)
 
 
 Linked fragment stage:
@@ -52,41 +57,41 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:11  Function Definition: main(f1;vf2;vf3;vf4;vi2; (global void)
+0:3  Function Definition: main(f1;vf2;vf3;vf4;vi2; (global void)
 0:3    Function Parameters: 
-0:3      'inF1' (in float)
-0:3      'inF2' (in 2-component vector of float)
-0:3      'inF3' (in 3-component vector of float)
-0:3      'inF4' (in 4-component vector of float)
-0:3      'inI2' (in 2-component vector of int)
+0:3      'inF1' (layout(location=0 ) in float)
+0:3      'inF2' (layout(location=1 ) in 2-component vector of float)
+0:3      'inF3' (layout(location=2 ) in 3-component vector of float)
+0:3      'inF4' (layout(location=3 ) in 4-component vector of float)
+0:3      'inI2' (layout(location=4 ) in 2-component vector of int)
 0:?     Sequence
 0:4      interpolateAtOffset (temp float)
-0:4        'inF1' (in float)
+0:4        'inF1' (layout(location=0 ) in float)
 0:?         Constant:
 0:?           -0.500000
 0:?           -0.062500
 0:5      interpolateAtOffset (temp 2-component vector of float)
-0:5        'inF2' (in 2-component vector of float)
+0:5        'inF2' (layout(location=1 ) in 2-component vector of float)
 0:?         Constant:
 0:?           0.000000
 0:?           0.062500
 0:6      interpolateAtOffset (temp 3-component vector of float)
-0:6        'inF3' (in 3-component vector of float)
+0:6        'inF3' (layout(location=2 ) in 3-component vector of float)
 0:?         Constant:
 0:?           0.187500
 0:?           -0.375000
 0:7      interpolateAtOffset (temp 4-component vector of float)
-0:7        'inF4' (in 4-component vector of float)
+0:7        'inF4' (layout(location=3 ) in 4-component vector of float)
 0:?         Constant:
 0:?           0.437500
 0:?           -0.500000
 0:9      interpolateAtOffset (temp float)
-0:9        'inF1' (in float)
+0:9        'inF1' (layout(location=0 ) in float)
 0:9        vector-scale (temp 2-component vector of float)
 0:9          Convert int to float (temp 2-component vector of float)
 0:9            right-shift (temp 2-component vector of int)
 0:9              left-shift (temp 2-component vector of int)
-0:9                'inI2' (in 2-component vector of int)
+0:9                'inI2' (layout(location=4 ) in 2-component vector of int)
 0:9                Constant:
 0:9                  28 (const int)
 0:9              Constant:
@@ -94,6 +99,11 @@
 0:9          Constant:
 0:9            0.062500
 0:?   Linker Objects
+0:?     'inF1' (layout(location=0 ) in float)
+0:?     'inF2' (layout(location=1 ) in 2-component vector of float)
+0:?     'inF3' (layout(location=2 ) in 3-component vector of float)
+0:?     'inF4' (layout(location=3 ) in 4-component vector of float)
+0:?     'inI2' (layout(location=4 ) in 2-component vector of int)
 
 // Module Version 10000
 // Generated by (magic number): 80001
@@ -105,13 +115,17 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 8 15 22 29 36
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "inF1"
                               Name 15  "inF2"
                               Name 22  "inF3"
                               Name 29  "inF4"
                               Name 36  "inI2"
+                              Decorate 8(inF1) Location 0
+                              Decorate 15(inF2) Location 1
+                              Decorate 22(inF3) Location 2
+                              Decorate 29(inF4) Location 3
+                              Decorate 36(inI2) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/hlsl.intrinsics.f1632.frag.out b/Test/baseResults/hlsl.intrinsics.f1632.frag.out
index 7340531..21daced 100644
--- a/Test/baseResults/hlsl.intrinsics.f1632.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.f1632.frag.out
@@ -9,7 +9,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:8  Function Definition: PixelShaderFunctionS(f1; (global float)
+0:2  Function Definition: PixelShaderFunctionS(f1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:?     Sequence
@@ -19,14 +19,14 @@
 0:5      Branch: Return with expression
 0:5        Constant:
 0:5          0.000000
-0:14  Function Definition: PixelShaderFunction1(vf1; (global 1-component vector of float)
+0:9  Function Definition: PixelShaderFunction1(vf1; (global 1-component vector of float)
 0:9    Function Parameters: 
 0:9      'inF0' (in 1-component vector of float)
 0:?     Sequence
 0:11      Branch: Return with expression
 0:11        Constant:
 0:11          0.000000
-0:21  Function Definition: PixelShaderFunction2(vf2; (global 2-component vector of float)
+0:15  Function Definition: PixelShaderFunction2(vf2; (global 2-component vector of float)
 0:15    Function Parameters: 
 0:15      'inF0' (in 2-component vector of float)
 0:?     Sequence
@@ -37,7 +37,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:28  Function Definition: PixelShaderFunction3(vf3; (global 3-component vector of float)
+0:22  Function Definition: PixelShaderFunction3(vf3; (global 3-component vector of float)
 0:22    Function Parameters: 
 0:22      'inF0' (in 3-component vector of float)
 0:?     Sequence
@@ -49,20 +49,25 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:35  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:29  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:29    Function Parameters: 
-0:29      'inF0' (in 4-component vector of float)
+0:29      'inF0' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:30      ERROR: Bad unary op
  (global 4-component vector of uint)
-0:30        'inF0' (in 4-component vector of float)
-0:32      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
+0:30        'inF0' (layout(location=0 ) in 4-component vector of float)
+0:32      Sequence
+0:32        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:32        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -71,7 +76,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:8  Function Definition: PixelShaderFunctionS(f1; (global float)
+0:2  Function Definition: PixelShaderFunctionS(f1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:?     Sequence
@@ -81,14 +86,14 @@
 0:5      Branch: Return with expression
 0:5        Constant:
 0:5          0.000000
-0:14  Function Definition: PixelShaderFunction1(vf1; (global 1-component vector of float)
+0:9  Function Definition: PixelShaderFunction1(vf1; (global 1-component vector of float)
 0:9    Function Parameters: 
 0:9      'inF0' (in 1-component vector of float)
 0:?     Sequence
 0:11      Branch: Return with expression
 0:11        Constant:
 0:11          0.000000
-0:21  Function Definition: PixelShaderFunction2(vf2; (global 2-component vector of float)
+0:15  Function Definition: PixelShaderFunction2(vf2; (global 2-component vector of float)
 0:15    Function Parameters: 
 0:15      'inF0' (in 2-component vector of float)
 0:?     Sequence
@@ -99,7 +104,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:28  Function Definition: PixelShaderFunction3(vf3; (global 3-component vector of float)
+0:22  Function Definition: PixelShaderFunction3(vf3; (global 3-component vector of float)
 0:22    Function Parameters: 
 0:22      'inF0' (in 3-component vector of float)
 0:?     Sequence
@@ -111,19 +116,24 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:35  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:29  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:29    Function Parameters: 
-0:29      'inF0' (in 4-component vector of float)
+0:29      'inF0' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:30      ERROR: Bad unary op
  (global 4-component vector of uint)
-0:30        'inF0' (in 4-component vector of float)
-0:32      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
+0:30        'inF0' (layout(location=0 ) in 4-component vector of float)
+0:32      Sequence
+0:32        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:32        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.intrinsics.frag.out b/Test/baseResults/hlsl.intrinsics.frag.out
index f4e2434..151bdb4 100644
--- a/Test/baseResults/hlsl.intrinsics.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:88  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;u1; (global float)
+0:17  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;u1; (global float)
 0:17    Function Parameters: 
 0:17      'inF0' (in float)
 0:17      'inF1' (in float)
@@ -339,7 +339,7 @@
 0:85      Branch: Return with expression
 0:85        Constant:
 0:85          0.000000
-0:94  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
+0:89  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
 0:89    Function Parameters: 
 0:89      'inF0' (in 1-component vector of float)
 0:89      'inF1' (in 1-component vector of float)
@@ -348,7 +348,7 @@
 0:91      Branch: Return with expression
 0:91        Constant:
 0:91          0.000000
-0:177  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
+0:95  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
 0:95    Function Parameters: 
 0:95      'inF0' (in 2-component vector of float)
 0:95      'inF1' (in 2-component vector of float)
@@ -733,7 +733,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:259  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
+0:178  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
 0:178    Function Parameters: 
 0:178      'inF0' (in 3-component vector of float)
 0:178      'inF1' (in 3-component vector of float)
@@ -1138,7 +1138,7 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:400  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
+0:260  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
 0:260    Function Parameters: 
 0:260      'inF0' (in 4-component vector of float)
 0:260      'inF1' (in 4-component vector of float)
@@ -1558,7 +1558,7 @@
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:409  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:401  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
 0:401    Function Parameters: 
 0:401      'inF0' (in 2X2 matrix of float)
 0:401      'inF1' (in 2X2 matrix of float)
@@ -1846,7 +1846,7 @@
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:418  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:410  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
 0:410    Function Parameters: 
 0:410      'inF0' (in 3X3 matrix of float)
 0:410      'inF1' (in 3X3 matrix of float)
@@ -2144,7 +2144,7 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:439  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:419  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
 0:419    Function Parameters: 
 0:419      'inF0' (in 4X4 matrix of float)
 0:419      'inF1' (in 4X4 matrix of float)
@@ -2456,7 +2456,7 @@
 0:?           4.000000
 0:?           4.000000
 0:?           4.000000
-0:446  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
+0:442  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
 0:442    Function Parameters: 
 0:442      'inF0' (in float)
 0:442      'inF1' (in float)
@@ -2469,20 +2469,20 @@
 0:443        move second child to first child (temp float)
 0:443          'r0' (temp float)
 0:443          component-wise multiply (temp float)
-0:443            'inF0' (in float)
 0:443            'inF1' (in float)
+0:443            'inF0' (in float)
 0:443      Sequence
 0:443        move second child to first child (temp 2-component vector of float)
 0:443          'r1' (temp 2-component vector of float)
 0:443          vector-scale (temp 2-component vector of float)
-0:443            'inFV0' (in 2-component vector of float)
 0:443            'inF0' (in float)
+0:443            'inFV0' (in 2-component vector of float)
 0:443      Sequence
 0:443        move second child to first child (temp 2-component vector of float)
 0:443          'r2' (temp 2-component vector of float)
 0:443          vector-scale (temp 2-component vector of float)
-0:443            'inF0' (in float)
 0:443            'inFV0' (in 2-component vector of float)
+0:443            'inF0' (in float)
 0:443      Sequence
 0:443        move second child to first child (temp float)
 0:443          'r3' (temp float)
@@ -2492,34 +2492,34 @@
 0:443      Sequence
 0:443        move second child to first child (temp 2-component vector of float)
 0:443          'r4' (temp 2-component vector of float)
-0:443          matrix-times-vector (temp 2-component vector of float)
-0:443            'inFM0' (in 2X2 matrix of float)
-0:443            'inFV0' (in 2-component vector of float)
-0:443      Sequence
-0:443        move second child to first child (temp 2-component vector of float)
-0:443          'r5' (temp 2-component vector of float)
 0:443          vector-times-matrix (temp 2-component vector of float)
 0:443            'inFV0' (in 2-component vector of float)
 0:443            'inFM0' (in 2X2 matrix of float)
 0:443      Sequence
+0:443        move second child to first child (temp 2-component vector of float)
+0:443          'r5' (temp 2-component vector of float)
+0:443          matrix-times-vector (temp 2-component vector of float)
+0:443            'inFM0' (in 2X2 matrix of float)
+0:443            'inFV0' (in 2-component vector of float)
+0:443      Sequence
 0:443        move second child to first child (temp 2X2 matrix of float)
 0:443          'r6' (temp 2X2 matrix of float)
 0:443          matrix-scale (temp 2X2 matrix of float)
-0:443            'inFM0' (in 2X2 matrix of float)
 0:443            'inF0' (in float)
+0:443            'inFM0' (in 2X2 matrix of float)
 0:443      Sequence
 0:443        move second child to first child (temp 2X2 matrix of float)
 0:443          'r7' (temp 2X2 matrix of float)
 0:443          matrix-scale (temp 2X2 matrix of float)
-0:443            'inF0' (in float)
 0:443            'inFM0' (in 2X2 matrix of float)
+0:443            'inF0' (in float)
 0:443      Sequence
 0:443        move second child to first child (temp 2X2 matrix of float)
 0:443          'r8' (temp 2X2 matrix of float)
 0:443          matrix-multiply (temp 2X2 matrix of float)
-0:443            'inFM0' (in 2X2 matrix of float)
 0:443            'inFM1' (in 2X2 matrix of float)
-0:453  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
+0:443            'inFM0' (in 2X2 matrix of float)
+0:449  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
 0:449    Function Parameters: 
 0:449      'inF0' (in float)
 0:449      'inF1' (in float)
@@ -2532,20 +2532,20 @@
 0:450        move second child to first child (temp float)
 0:450          'r0' (temp float)
 0:450          component-wise multiply (temp float)
-0:450            'inF0' (in float)
 0:450            'inF1' (in float)
+0:450            'inF0' (in float)
 0:450      Sequence
 0:450        move second child to first child (temp 3-component vector of float)
 0:450          'r1' (temp 3-component vector of float)
 0:450          vector-scale (temp 3-component vector of float)
-0:450            'inFV0' (in 3-component vector of float)
 0:450            'inF0' (in float)
+0:450            'inFV0' (in 3-component vector of float)
 0:450      Sequence
 0:450        move second child to first child (temp 3-component vector of float)
 0:450          'r2' (temp 3-component vector of float)
 0:450          vector-scale (temp 3-component vector of float)
-0:450            'inF0' (in float)
 0:450            'inFV0' (in 3-component vector of float)
+0:450            'inF0' (in float)
 0:450      Sequence
 0:450        move second child to first child (temp float)
 0:450          'r3' (temp float)
@@ -2555,34 +2555,34 @@
 0:450      Sequence
 0:450        move second child to first child (temp 3-component vector of float)
 0:450          'r4' (temp 3-component vector of float)
-0:450          matrix-times-vector (temp 3-component vector of float)
-0:450            'inFM0' (in 3X3 matrix of float)
-0:450            'inFV0' (in 3-component vector of float)
-0:450      Sequence
-0:450        move second child to first child (temp 3-component vector of float)
-0:450          'r5' (temp 3-component vector of float)
 0:450          vector-times-matrix (temp 3-component vector of float)
 0:450            'inFV0' (in 3-component vector of float)
 0:450            'inFM0' (in 3X3 matrix of float)
 0:450      Sequence
+0:450        move second child to first child (temp 3-component vector of float)
+0:450          'r5' (temp 3-component vector of float)
+0:450          matrix-times-vector (temp 3-component vector of float)
+0:450            'inFM0' (in 3X3 matrix of float)
+0:450            'inFV0' (in 3-component vector of float)
+0:450      Sequence
 0:450        move second child to first child (temp 3X3 matrix of float)
 0:450          'r6' (temp 3X3 matrix of float)
 0:450          matrix-scale (temp 3X3 matrix of float)
-0:450            'inFM0' (in 3X3 matrix of float)
 0:450            'inF0' (in float)
+0:450            'inFM0' (in 3X3 matrix of float)
 0:450      Sequence
 0:450        move second child to first child (temp 3X3 matrix of float)
 0:450          'r7' (temp 3X3 matrix of float)
 0:450          matrix-scale (temp 3X3 matrix of float)
-0:450            'inF0' (in float)
 0:450            'inFM0' (in 3X3 matrix of float)
+0:450            'inF0' (in float)
 0:450      Sequence
 0:450        move second child to first child (temp 3X3 matrix of float)
 0:450          'r8' (temp 3X3 matrix of float)
 0:450          matrix-multiply (temp 3X3 matrix of float)
-0:450            'inFM0' (in 3X3 matrix of float)
 0:450            'inFM1' (in 3X3 matrix of float)
-0:461  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
+0:450            'inFM0' (in 3X3 matrix of float)
+0:456  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
 0:456    Function Parameters: 
 0:456      'inF0' (in float)
 0:456      'inF1' (in float)
@@ -2595,20 +2595,20 @@
 0:457        move second child to first child (temp float)
 0:457          'r0' (temp float)
 0:457          component-wise multiply (temp float)
-0:457            'inF0' (in float)
 0:457            'inF1' (in float)
+0:457            'inF0' (in float)
 0:457      Sequence
 0:457        move second child to first child (temp 4-component vector of float)
 0:457          'r1' (temp 4-component vector of float)
 0:457          vector-scale (temp 4-component vector of float)
-0:457            'inFV0' (in 4-component vector of float)
 0:457            'inF0' (in float)
+0:457            'inFV0' (in 4-component vector of float)
 0:457      Sequence
 0:457        move second child to first child (temp 4-component vector of float)
 0:457          'r2' (temp 4-component vector of float)
 0:457          vector-scale (temp 4-component vector of float)
-0:457            'inF0' (in float)
 0:457            'inFV0' (in 4-component vector of float)
+0:457            'inF0' (in float)
 0:457      Sequence
 0:457        move second child to first child (temp float)
 0:457          'r3' (temp float)
@@ -2618,75 +2618,75 @@
 0:457      Sequence
 0:457        move second child to first child (temp 4-component vector of float)
 0:457          'r4' (temp 4-component vector of float)
-0:457          matrix-times-vector (temp 4-component vector of float)
-0:457            'inFM0' (in 4X4 matrix of float)
-0:457            'inFV0' (in 4-component vector of float)
-0:457      Sequence
-0:457        move second child to first child (temp 4-component vector of float)
-0:457          'r5' (temp 4-component vector of float)
 0:457          vector-times-matrix (temp 4-component vector of float)
 0:457            'inFV0' (in 4-component vector of float)
 0:457            'inFM0' (in 4X4 matrix of float)
 0:457      Sequence
+0:457        move second child to first child (temp 4-component vector of float)
+0:457          'r5' (temp 4-component vector of float)
+0:457          matrix-times-vector (temp 4-component vector of float)
+0:457            'inFM0' (in 4X4 matrix of float)
+0:457            'inFV0' (in 4-component vector of float)
+0:457      Sequence
 0:457        move second child to first child (temp 4X4 matrix of float)
 0:457          'r6' (temp 4X4 matrix of float)
 0:457          matrix-scale (temp 4X4 matrix of float)
-0:457            'inFM0' (in 4X4 matrix of float)
 0:457            'inF0' (in float)
+0:457            'inFM0' (in 4X4 matrix of float)
 0:457      Sequence
 0:457        move second child to first child (temp 4X4 matrix of float)
 0:457          'r7' (temp 4X4 matrix of float)
 0:457          matrix-scale (temp 4X4 matrix of float)
-0:457            'inF0' (in float)
 0:457            'inFM0' (in 4X4 matrix of float)
+0:457            'inF0' (in float)
 0:457      Sequence
 0:457        move second child to first child (temp 4X4 matrix of float)
 0:457          'r8' (temp 4X4 matrix of float)
 0:457          matrix-multiply (temp 4X4 matrix of float)
-0:457            'inFM0' (in 4X4 matrix of float)
 0:457            'inFM1' (in 4X4 matrix of float)
-0:485  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42; (global void)
+0:457            'inFM0' (in 4X4 matrix of float)
+0:466  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; (global void)
 0:466    Function Parameters: 
 0:466      'inF0' (in float)
 0:466      'inF1' (in float)
 0:466      'inFV2' (in 2-component vector of float)
 0:466      'inFV3' (in 3-component vector of float)
-0:466      'inFM2x3' (in 3X2 matrix of float)
-0:466      'inFM3x2' (in 2X3 matrix of float)
+0:466      'inFM2x3' (in 2X3 matrix of float)
+0:466      'inFM3x2' (in 3X2 matrix of float)
 0:466      'inFM3x3' (in 3X3 matrix of float)
-0:466      'inFM3x4' (in 4X3 matrix of float)
-0:466      'inFM2x4' (in 4X2 matrix of float)
+0:466      'inFM3x4' (in 3X4 matrix of float)
+0:466      'inFM2x4' (in 2X4 matrix of float)
 0:?     Sequence
 0:467      Sequence
 0:467        move second child to first child (temp float)
 0:467          'r00' (temp float)
 0:467          component-wise multiply (temp float)
-0:467            'inF0' (in float)
 0:467            'inF1' (in float)
+0:467            'inF0' (in float)
 0:468      Sequence
 0:468        move second child to first child (temp 2-component vector of float)
 0:468          'r01' (temp 2-component vector of float)
 0:468          vector-scale (temp 2-component vector of float)
-0:468            'inFV2' (in 2-component vector of float)
 0:468            'inF0' (in float)
+0:468            'inFV2' (in 2-component vector of float)
 0:469      Sequence
 0:469        move second child to first child (temp 3-component vector of float)
 0:469          'r02' (temp 3-component vector of float)
 0:469          vector-scale (temp 3-component vector of float)
-0:469            'inFV3' (in 3-component vector of float)
 0:469            'inF0' (in float)
+0:469            'inFV3' (in 3-component vector of float)
 0:470      Sequence
 0:470        move second child to first child (temp 2-component vector of float)
 0:470          'r03' (temp 2-component vector of float)
 0:470          vector-scale (temp 2-component vector of float)
-0:470            'inF0' (in float)
 0:470            'inFV2' (in 2-component vector of float)
+0:470            'inF0' (in float)
 0:471      Sequence
 0:471        move second child to first child (temp 3-component vector of float)
 0:471          'r04' (temp 3-component vector of float)
 0:471          vector-scale (temp 3-component vector of float)
-0:471            'inF0' (in float)
 0:471            'inFV3' (in 3-component vector of float)
+0:471            'inF0' (in float)
 0:472      Sequence
 0:472        move second child to first child (temp float)
 0:472          'r05' (temp float)
@@ -2702,63 +2702,85 @@
 0:474      Sequence
 0:474        move second child to first child (temp 3-component vector of float)
 0:474          'r07' (temp 3-component vector of float)
-0:474          vector-times-matrix (temp 3-component vector of float)
+0:474          matrix-times-vector (temp 3-component vector of float)
+0:474            'inFM2x3' (in 2X3 matrix of float)
 0:474            'inFV2' (in 2-component vector of float)
-0:474            'inFM2x3' (in 3X2 matrix of float)
 0:475      Sequence
 0:475        move second child to first child (temp 2-component vector of float)
 0:475          'r08' (temp 2-component vector of float)
-0:475          vector-times-matrix (temp 2-component vector of float)
+0:475          matrix-times-vector (temp 2-component vector of float)
+0:475            'inFM3x2' (in 3X2 matrix of float)
 0:475            'inFV3' (in 3-component vector of float)
-0:475            'inFM3x2' (in 2X3 matrix of float)
 0:476      Sequence
 0:476        move second child to first child (temp 2-component vector of float)
 0:476          'r09' (temp 2-component vector of float)
-0:476          matrix-times-vector (temp 2-component vector of float)
-0:476            'inFM2x3' (in 3X2 matrix of float)
+0:476          vector-times-matrix (temp 2-component vector of float)
 0:476            'inFV3' (in 3-component vector of float)
+0:476            'inFM2x3' (in 2X3 matrix of float)
 0:477      Sequence
 0:477        move second child to first child (temp 3-component vector of float)
 0:477          'r10' (temp 3-component vector of float)
-0:477          matrix-times-vector (temp 3-component vector of float)
-0:477            'inFM3x2' (in 2X3 matrix of float)
+0:477          vector-times-matrix (temp 3-component vector of float)
 0:477            'inFV2' (in 2-component vector of float)
+0:477            'inFM3x2' (in 3X2 matrix of float)
 0:478      Sequence
-0:478        move second child to first child (temp 3X2 matrix of float)
-0:478          'r11' (temp 3X2 matrix of float)
-0:478          matrix-scale (temp 3X2 matrix of float)
-0:478            'inFM2x3' (in 3X2 matrix of float)
+0:478        move second child to first child (temp 2X3 matrix of float)
+0:478          'r11' (temp 2X3 matrix of float)
+0:478          matrix-scale (temp 2X3 matrix of float)
 0:478            'inF0' (in float)
+0:478            'inFM2x3' (in 2X3 matrix of float)
 0:479      Sequence
-0:479        move second child to first child (temp 2X3 matrix of float)
-0:479          'r12' (temp 2X3 matrix of float)
-0:479          matrix-scale (temp 2X3 matrix of float)
-0:479            'inFM3x2' (in 2X3 matrix of float)
+0:479        move second child to first child (temp 3X2 matrix of float)
+0:479          'r12' (temp 3X2 matrix of float)
+0:479          matrix-scale (temp 3X2 matrix of float)
 0:479            'inF0' (in float)
+0:479            'inFM3x2' (in 3X2 matrix of float)
 0:480      Sequence
 0:480        move second child to first child (temp 2X2 matrix of float)
 0:480          'r13' (temp 2X2 matrix of float)
 0:480          matrix-multiply (temp 2X2 matrix of float)
-0:480            'inFM2x3' (in 3X2 matrix of float)
-0:480            'inFM3x2' (in 2X3 matrix of float)
+0:480            'inFM3x2' (in 3X2 matrix of float)
+0:480            'inFM2x3' (in 2X3 matrix of float)
 0:481      Sequence
-0:481        move second child to first child (temp 3X2 matrix of float)
-0:481          'r14' (temp 3X2 matrix of float)
-0:481          matrix-multiply (temp 3X2 matrix of float)
-0:481            'inFM2x3' (in 3X2 matrix of float)
+0:481        move second child to first child (temp 2X3 matrix of float)
+0:481          'r14' (temp 2X3 matrix of float)
+0:481          matrix-multiply (temp 2X3 matrix of float)
 0:481            'inFM3x3' (in 3X3 matrix of float)
+0:481            'inFM2x3' (in 2X3 matrix of float)
 0:482      Sequence
-0:482        move second child to first child (temp 4X2 matrix of float)
-0:482          'r15' (temp 4X2 matrix of float)
-0:482          matrix-multiply (temp 4X2 matrix of float)
-0:482            'inFM2x3' (in 3X2 matrix of float)
-0:482            'inFM3x4' (in 4X3 matrix of float)
+0:482        move second child to first child (temp 2X4 matrix of float)
+0:482          'r15' (temp 2X4 matrix of float)
+0:482          matrix-multiply (temp 2X4 matrix of float)
+0:482            'inFM3x4' (in 3X4 matrix of float)
+0:482            'inFM2x3' (in 2X3 matrix of float)
 0:483      Sequence
-0:483        move second child to first child (temp 4X3 matrix of float)
-0:483          'r16' (temp 4X3 matrix of float)
-0:483          matrix-multiply (temp 4X3 matrix of float)
-0:483            'inFM3x2' (in 2X3 matrix of float)
-0:483            'inFM2x4' (in 4X2 matrix of float)
+0:483        move second child to first child (temp 3X4 matrix of float)
+0:483          'r16' (temp 3X4 matrix of float)
+0:483          matrix-multiply (temp 3X4 matrix of float)
+0:483            'inFM2x4' (in 2X4 matrix of float)
+0:483            'inFM3x2' (in 3X2 matrix of float)
+0:489  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:489    Function Parameters: 
+0:?     Sequence
+0:491      move second child to first child (temp 4-component vector of float)
+0:491        color: direct index for structure (temp 4-component vector of float)
+0:491          'ps_output' (temp structure{temp 4-component vector of float color})
+0:491          Constant:
+0:491            0 (const int)
+0:491        Constant:
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:?       Sequence
+0:?         Sequence
+0:492          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:492            color: direct index for structure (temp 4-component vector of float)
+0:492              'ps_output' (temp structure{temp 4-component vector of float color})
+0:492              Constant:
+0:492                0 (const int)
+0:492        Branch: Return
 0:?   Linker Objects
 0:?     'gs_ua' (global uint)
 0:?     'gs_ub' (global uint)
@@ -2772,6 +2794,7 @@
 0:?     'gs_ua4' (global 4-component vector of uint)
 0:?     'gs_ub4' (global 4-component vector of uint)
 0:?     'gs_uc4' (global 4-component vector of uint)
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -2780,7 +2803,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:88  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;u1; (global float)
+0:17  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;u1; (global float)
 0:17    Function Parameters: 
 0:17      'inF0' (in float)
 0:17      'inF1' (in float)
@@ -3117,7 +3140,7 @@
 0:85      Branch: Return with expression
 0:85        Constant:
 0:85          0.000000
-0:94  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
+0:89  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
 0:89    Function Parameters: 
 0:89      'inF0' (in 1-component vector of float)
 0:89      'inF1' (in 1-component vector of float)
@@ -3126,7 +3149,7 @@
 0:91      Branch: Return with expression
 0:91        Constant:
 0:91          0.000000
-0:177  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
+0:95  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
 0:95    Function Parameters: 
 0:95      'inF0' (in 2-component vector of float)
 0:95      'inF1' (in 2-component vector of float)
@@ -3511,7 +3534,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:259  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
+0:178  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
 0:178    Function Parameters: 
 0:178      'inF0' (in 3-component vector of float)
 0:178      'inF1' (in 3-component vector of float)
@@ -3916,7 +3939,7 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:400  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
+0:260  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
 0:260    Function Parameters: 
 0:260      'inF0' (in 4-component vector of float)
 0:260      'inF1' (in 4-component vector of float)
@@ -4336,7 +4359,7 @@
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:409  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:401  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
 0:401    Function Parameters: 
 0:401      'inF0' (in 2X2 matrix of float)
 0:401      'inF1' (in 2X2 matrix of float)
@@ -4624,7 +4647,7 @@
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:418  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:410  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
 0:410    Function Parameters: 
 0:410      'inF0' (in 3X3 matrix of float)
 0:410      'inF1' (in 3X3 matrix of float)
@@ -4922,7 +4945,7 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:439  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:419  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
 0:419    Function Parameters: 
 0:419      'inF0' (in 4X4 matrix of float)
 0:419      'inF1' (in 4X4 matrix of float)
@@ -5234,7 +5257,7 @@
 0:?           4.000000
 0:?           4.000000
 0:?           4.000000
-0:446  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
+0:442  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
 0:442    Function Parameters: 
 0:442      'inF0' (in float)
 0:442      'inF1' (in float)
@@ -5247,20 +5270,20 @@
 0:443        move second child to first child (temp float)
 0:443          'r0' (temp float)
 0:443          component-wise multiply (temp float)
-0:443            'inF0' (in float)
 0:443            'inF1' (in float)
+0:443            'inF0' (in float)
 0:443      Sequence
 0:443        move second child to first child (temp 2-component vector of float)
 0:443          'r1' (temp 2-component vector of float)
 0:443          vector-scale (temp 2-component vector of float)
-0:443            'inFV0' (in 2-component vector of float)
 0:443            'inF0' (in float)
+0:443            'inFV0' (in 2-component vector of float)
 0:443      Sequence
 0:443        move second child to first child (temp 2-component vector of float)
 0:443          'r2' (temp 2-component vector of float)
 0:443          vector-scale (temp 2-component vector of float)
-0:443            'inF0' (in float)
 0:443            'inFV0' (in 2-component vector of float)
+0:443            'inF0' (in float)
 0:443      Sequence
 0:443        move second child to first child (temp float)
 0:443          'r3' (temp float)
@@ -5270,34 +5293,34 @@
 0:443      Sequence
 0:443        move second child to first child (temp 2-component vector of float)
 0:443          'r4' (temp 2-component vector of float)
-0:443          matrix-times-vector (temp 2-component vector of float)
-0:443            'inFM0' (in 2X2 matrix of float)
-0:443            'inFV0' (in 2-component vector of float)
-0:443      Sequence
-0:443        move second child to first child (temp 2-component vector of float)
-0:443          'r5' (temp 2-component vector of float)
 0:443          vector-times-matrix (temp 2-component vector of float)
 0:443            'inFV0' (in 2-component vector of float)
 0:443            'inFM0' (in 2X2 matrix of float)
 0:443      Sequence
+0:443        move second child to first child (temp 2-component vector of float)
+0:443          'r5' (temp 2-component vector of float)
+0:443          matrix-times-vector (temp 2-component vector of float)
+0:443            'inFM0' (in 2X2 matrix of float)
+0:443            'inFV0' (in 2-component vector of float)
+0:443      Sequence
 0:443        move second child to first child (temp 2X2 matrix of float)
 0:443          'r6' (temp 2X2 matrix of float)
 0:443          matrix-scale (temp 2X2 matrix of float)
-0:443            'inFM0' (in 2X2 matrix of float)
 0:443            'inF0' (in float)
+0:443            'inFM0' (in 2X2 matrix of float)
 0:443      Sequence
 0:443        move second child to first child (temp 2X2 matrix of float)
 0:443          'r7' (temp 2X2 matrix of float)
 0:443          matrix-scale (temp 2X2 matrix of float)
-0:443            'inF0' (in float)
 0:443            'inFM0' (in 2X2 matrix of float)
+0:443            'inF0' (in float)
 0:443      Sequence
 0:443        move second child to first child (temp 2X2 matrix of float)
 0:443          'r8' (temp 2X2 matrix of float)
 0:443          matrix-multiply (temp 2X2 matrix of float)
-0:443            'inFM0' (in 2X2 matrix of float)
 0:443            'inFM1' (in 2X2 matrix of float)
-0:453  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
+0:443            'inFM0' (in 2X2 matrix of float)
+0:449  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
 0:449    Function Parameters: 
 0:449      'inF0' (in float)
 0:449      'inF1' (in float)
@@ -5310,20 +5333,20 @@
 0:450        move second child to first child (temp float)
 0:450          'r0' (temp float)
 0:450          component-wise multiply (temp float)
-0:450            'inF0' (in float)
 0:450            'inF1' (in float)
+0:450            'inF0' (in float)
 0:450      Sequence
 0:450        move second child to first child (temp 3-component vector of float)
 0:450          'r1' (temp 3-component vector of float)
 0:450          vector-scale (temp 3-component vector of float)
-0:450            'inFV0' (in 3-component vector of float)
 0:450            'inF0' (in float)
+0:450            'inFV0' (in 3-component vector of float)
 0:450      Sequence
 0:450        move second child to first child (temp 3-component vector of float)
 0:450          'r2' (temp 3-component vector of float)
 0:450          vector-scale (temp 3-component vector of float)
-0:450            'inF0' (in float)
 0:450            'inFV0' (in 3-component vector of float)
+0:450            'inF0' (in float)
 0:450      Sequence
 0:450        move second child to first child (temp float)
 0:450          'r3' (temp float)
@@ -5333,34 +5356,34 @@
 0:450      Sequence
 0:450        move second child to first child (temp 3-component vector of float)
 0:450          'r4' (temp 3-component vector of float)
-0:450          matrix-times-vector (temp 3-component vector of float)
-0:450            'inFM0' (in 3X3 matrix of float)
-0:450            'inFV0' (in 3-component vector of float)
-0:450      Sequence
-0:450        move second child to first child (temp 3-component vector of float)
-0:450          'r5' (temp 3-component vector of float)
 0:450          vector-times-matrix (temp 3-component vector of float)
 0:450            'inFV0' (in 3-component vector of float)
 0:450            'inFM0' (in 3X3 matrix of float)
 0:450      Sequence
+0:450        move second child to first child (temp 3-component vector of float)
+0:450          'r5' (temp 3-component vector of float)
+0:450          matrix-times-vector (temp 3-component vector of float)
+0:450            'inFM0' (in 3X3 matrix of float)
+0:450            'inFV0' (in 3-component vector of float)
+0:450      Sequence
 0:450        move second child to first child (temp 3X3 matrix of float)
 0:450          'r6' (temp 3X3 matrix of float)
 0:450          matrix-scale (temp 3X3 matrix of float)
-0:450            'inFM0' (in 3X3 matrix of float)
 0:450            'inF0' (in float)
+0:450            'inFM0' (in 3X3 matrix of float)
 0:450      Sequence
 0:450        move second child to first child (temp 3X3 matrix of float)
 0:450          'r7' (temp 3X3 matrix of float)
 0:450          matrix-scale (temp 3X3 matrix of float)
-0:450            'inF0' (in float)
 0:450            'inFM0' (in 3X3 matrix of float)
+0:450            'inF0' (in float)
 0:450      Sequence
 0:450        move second child to first child (temp 3X3 matrix of float)
 0:450          'r8' (temp 3X3 matrix of float)
 0:450          matrix-multiply (temp 3X3 matrix of float)
-0:450            'inFM0' (in 3X3 matrix of float)
 0:450            'inFM1' (in 3X3 matrix of float)
-0:461  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
+0:450            'inFM0' (in 3X3 matrix of float)
+0:456  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
 0:456    Function Parameters: 
 0:456      'inF0' (in float)
 0:456      'inF1' (in float)
@@ -5373,20 +5396,20 @@
 0:457        move second child to first child (temp float)
 0:457          'r0' (temp float)
 0:457          component-wise multiply (temp float)
-0:457            'inF0' (in float)
 0:457            'inF1' (in float)
+0:457            'inF0' (in float)
 0:457      Sequence
 0:457        move second child to first child (temp 4-component vector of float)
 0:457          'r1' (temp 4-component vector of float)
 0:457          vector-scale (temp 4-component vector of float)
-0:457            'inFV0' (in 4-component vector of float)
 0:457            'inF0' (in float)
+0:457            'inFV0' (in 4-component vector of float)
 0:457      Sequence
 0:457        move second child to first child (temp 4-component vector of float)
 0:457          'r2' (temp 4-component vector of float)
 0:457          vector-scale (temp 4-component vector of float)
-0:457            'inF0' (in float)
 0:457            'inFV0' (in 4-component vector of float)
+0:457            'inF0' (in float)
 0:457      Sequence
 0:457        move second child to first child (temp float)
 0:457          'r3' (temp float)
@@ -5396,75 +5419,75 @@
 0:457      Sequence
 0:457        move second child to first child (temp 4-component vector of float)
 0:457          'r4' (temp 4-component vector of float)
-0:457          matrix-times-vector (temp 4-component vector of float)
-0:457            'inFM0' (in 4X4 matrix of float)
-0:457            'inFV0' (in 4-component vector of float)
-0:457      Sequence
-0:457        move second child to first child (temp 4-component vector of float)
-0:457          'r5' (temp 4-component vector of float)
 0:457          vector-times-matrix (temp 4-component vector of float)
 0:457            'inFV0' (in 4-component vector of float)
 0:457            'inFM0' (in 4X4 matrix of float)
 0:457      Sequence
+0:457        move second child to first child (temp 4-component vector of float)
+0:457          'r5' (temp 4-component vector of float)
+0:457          matrix-times-vector (temp 4-component vector of float)
+0:457            'inFM0' (in 4X4 matrix of float)
+0:457            'inFV0' (in 4-component vector of float)
+0:457      Sequence
 0:457        move second child to first child (temp 4X4 matrix of float)
 0:457          'r6' (temp 4X4 matrix of float)
 0:457          matrix-scale (temp 4X4 matrix of float)
-0:457            'inFM0' (in 4X4 matrix of float)
 0:457            'inF0' (in float)
+0:457            'inFM0' (in 4X4 matrix of float)
 0:457      Sequence
 0:457        move second child to first child (temp 4X4 matrix of float)
 0:457          'r7' (temp 4X4 matrix of float)
 0:457          matrix-scale (temp 4X4 matrix of float)
-0:457            'inF0' (in float)
 0:457            'inFM0' (in 4X4 matrix of float)
+0:457            'inF0' (in float)
 0:457      Sequence
 0:457        move second child to first child (temp 4X4 matrix of float)
 0:457          'r8' (temp 4X4 matrix of float)
 0:457          matrix-multiply (temp 4X4 matrix of float)
-0:457            'inFM0' (in 4X4 matrix of float)
 0:457            'inFM1' (in 4X4 matrix of float)
-0:485  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42; (global void)
+0:457            'inFM0' (in 4X4 matrix of float)
+0:466  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; (global void)
 0:466    Function Parameters: 
 0:466      'inF0' (in float)
 0:466      'inF1' (in float)
 0:466      'inFV2' (in 2-component vector of float)
 0:466      'inFV3' (in 3-component vector of float)
-0:466      'inFM2x3' (in 3X2 matrix of float)
-0:466      'inFM3x2' (in 2X3 matrix of float)
+0:466      'inFM2x3' (in 2X3 matrix of float)
+0:466      'inFM3x2' (in 3X2 matrix of float)
 0:466      'inFM3x3' (in 3X3 matrix of float)
-0:466      'inFM3x4' (in 4X3 matrix of float)
-0:466      'inFM2x4' (in 4X2 matrix of float)
+0:466      'inFM3x4' (in 3X4 matrix of float)
+0:466      'inFM2x4' (in 2X4 matrix of float)
 0:?     Sequence
 0:467      Sequence
 0:467        move second child to first child (temp float)
 0:467          'r00' (temp float)
 0:467          component-wise multiply (temp float)
-0:467            'inF0' (in float)
 0:467            'inF1' (in float)
+0:467            'inF0' (in float)
 0:468      Sequence
 0:468        move second child to first child (temp 2-component vector of float)
 0:468          'r01' (temp 2-component vector of float)
 0:468          vector-scale (temp 2-component vector of float)
-0:468            'inFV2' (in 2-component vector of float)
 0:468            'inF0' (in float)
+0:468            'inFV2' (in 2-component vector of float)
 0:469      Sequence
 0:469        move second child to first child (temp 3-component vector of float)
 0:469          'r02' (temp 3-component vector of float)
 0:469          vector-scale (temp 3-component vector of float)
-0:469            'inFV3' (in 3-component vector of float)
 0:469            'inF0' (in float)
+0:469            'inFV3' (in 3-component vector of float)
 0:470      Sequence
 0:470        move second child to first child (temp 2-component vector of float)
 0:470          'r03' (temp 2-component vector of float)
 0:470          vector-scale (temp 2-component vector of float)
-0:470            'inF0' (in float)
 0:470            'inFV2' (in 2-component vector of float)
+0:470            'inF0' (in float)
 0:471      Sequence
 0:471        move second child to first child (temp 3-component vector of float)
 0:471          'r04' (temp 3-component vector of float)
 0:471          vector-scale (temp 3-component vector of float)
-0:471            'inF0' (in float)
 0:471            'inFV3' (in 3-component vector of float)
+0:471            'inF0' (in float)
 0:472      Sequence
 0:472        move second child to first child (temp float)
 0:472          'r05' (temp float)
@@ -5480,63 +5503,85 @@
 0:474      Sequence
 0:474        move second child to first child (temp 3-component vector of float)
 0:474          'r07' (temp 3-component vector of float)
-0:474          vector-times-matrix (temp 3-component vector of float)
+0:474          matrix-times-vector (temp 3-component vector of float)
+0:474            'inFM2x3' (in 2X3 matrix of float)
 0:474            'inFV2' (in 2-component vector of float)
-0:474            'inFM2x3' (in 3X2 matrix of float)
 0:475      Sequence
 0:475        move second child to first child (temp 2-component vector of float)
 0:475          'r08' (temp 2-component vector of float)
-0:475          vector-times-matrix (temp 2-component vector of float)
+0:475          matrix-times-vector (temp 2-component vector of float)
+0:475            'inFM3x2' (in 3X2 matrix of float)
 0:475            'inFV3' (in 3-component vector of float)
-0:475            'inFM3x2' (in 2X3 matrix of float)
 0:476      Sequence
 0:476        move second child to first child (temp 2-component vector of float)
 0:476          'r09' (temp 2-component vector of float)
-0:476          matrix-times-vector (temp 2-component vector of float)
-0:476            'inFM2x3' (in 3X2 matrix of float)
+0:476          vector-times-matrix (temp 2-component vector of float)
 0:476            'inFV3' (in 3-component vector of float)
+0:476            'inFM2x3' (in 2X3 matrix of float)
 0:477      Sequence
 0:477        move second child to first child (temp 3-component vector of float)
 0:477          'r10' (temp 3-component vector of float)
-0:477          matrix-times-vector (temp 3-component vector of float)
-0:477            'inFM3x2' (in 2X3 matrix of float)
+0:477          vector-times-matrix (temp 3-component vector of float)
 0:477            'inFV2' (in 2-component vector of float)
+0:477            'inFM3x2' (in 3X2 matrix of float)
 0:478      Sequence
-0:478        move second child to first child (temp 3X2 matrix of float)
-0:478          'r11' (temp 3X2 matrix of float)
-0:478          matrix-scale (temp 3X2 matrix of float)
-0:478            'inFM2x3' (in 3X2 matrix of float)
+0:478        move second child to first child (temp 2X3 matrix of float)
+0:478          'r11' (temp 2X3 matrix of float)
+0:478          matrix-scale (temp 2X3 matrix of float)
 0:478            'inF0' (in float)
+0:478            'inFM2x3' (in 2X3 matrix of float)
 0:479      Sequence
-0:479        move second child to first child (temp 2X3 matrix of float)
-0:479          'r12' (temp 2X3 matrix of float)
-0:479          matrix-scale (temp 2X3 matrix of float)
-0:479            'inFM3x2' (in 2X3 matrix of float)
+0:479        move second child to first child (temp 3X2 matrix of float)
+0:479          'r12' (temp 3X2 matrix of float)
+0:479          matrix-scale (temp 3X2 matrix of float)
 0:479            'inF0' (in float)
+0:479            'inFM3x2' (in 3X2 matrix of float)
 0:480      Sequence
 0:480        move second child to first child (temp 2X2 matrix of float)
 0:480          'r13' (temp 2X2 matrix of float)
 0:480          matrix-multiply (temp 2X2 matrix of float)
-0:480            'inFM2x3' (in 3X2 matrix of float)
-0:480            'inFM3x2' (in 2X3 matrix of float)
+0:480            'inFM3x2' (in 3X2 matrix of float)
+0:480            'inFM2x3' (in 2X3 matrix of float)
 0:481      Sequence
-0:481        move second child to first child (temp 3X2 matrix of float)
-0:481          'r14' (temp 3X2 matrix of float)
-0:481          matrix-multiply (temp 3X2 matrix of float)
-0:481            'inFM2x3' (in 3X2 matrix of float)
+0:481        move second child to first child (temp 2X3 matrix of float)
+0:481          'r14' (temp 2X3 matrix of float)
+0:481          matrix-multiply (temp 2X3 matrix of float)
 0:481            'inFM3x3' (in 3X3 matrix of float)
+0:481            'inFM2x3' (in 2X3 matrix of float)
 0:482      Sequence
-0:482        move second child to first child (temp 4X2 matrix of float)
-0:482          'r15' (temp 4X2 matrix of float)
-0:482          matrix-multiply (temp 4X2 matrix of float)
-0:482            'inFM2x3' (in 3X2 matrix of float)
-0:482            'inFM3x4' (in 4X3 matrix of float)
+0:482        move second child to first child (temp 2X4 matrix of float)
+0:482          'r15' (temp 2X4 matrix of float)
+0:482          matrix-multiply (temp 2X4 matrix of float)
+0:482            'inFM3x4' (in 3X4 matrix of float)
+0:482            'inFM2x3' (in 2X3 matrix of float)
 0:483      Sequence
-0:483        move second child to first child (temp 4X3 matrix of float)
-0:483          'r16' (temp 4X3 matrix of float)
-0:483          matrix-multiply (temp 4X3 matrix of float)
-0:483            'inFM3x2' (in 2X3 matrix of float)
-0:483            'inFM2x4' (in 4X2 matrix of float)
+0:483        move second child to first child (temp 3X4 matrix of float)
+0:483          'r16' (temp 3X4 matrix of float)
+0:483          matrix-multiply (temp 3X4 matrix of float)
+0:483            'inFM2x4' (in 2X4 matrix of float)
+0:483            'inFM3x2' (in 3X2 matrix of float)
+0:489  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:489    Function Parameters: 
+0:?     Sequence
+0:491      move second child to first child (temp 4-component vector of float)
+0:491        color: direct index for structure (temp 4-component vector of float)
+0:491          'ps_output' (temp structure{temp 4-component vector of float color})
+0:491          Constant:
+0:491            0 (const int)
+0:491        Constant:
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:?       Sequence
+0:?         Sequence
+0:492          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:492            color: direct index for structure (temp 4-component vector of float)
+0:492              'ps_output' (temp structure{temp 4-component vector of float color})
+0:492              Constant:
+0:492                0 (const int)
+0:492        Branch: Return
 0:?   Linker Objects
 0:?     'gs_ua' (global uint)
 0:?     'gs_ub' (global uint)
@@ -5550,19 +5595,19 @@
 0:?     'gs_ua4' (global 4-component vector of uint)
 0:?     'gs_ub4' (global 4-component vector of uint)
 0:?     'gs_uc4' (global 4-component vector of uint)
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 1812
+// Id's are bound by 1825
 
                               Capability Shader
                               Capability DerivativeControl
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 810 837 845 854
+                              EntryPoint Fragment 4  "main" 1805
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
-                              Name 4  "PixelShaderFunction"
+                              Name 4  "main"
                               Name 16  "PixelShaderFunctionS(f1;f1;f1;u1;u1;"
                               Name 11  "inF0"
                               Name 12  "inF1"
@@ -5585,502 +5630,509 @@
                               Name 43  "inF2"
                               Name 44  "inU0"
                               Name 45  "inU1"
-                              Name 54  "PixelShaderFunction2x2(mf22;mf22;mf22;"
-                              Name 51  "inF0"
-                              Name 52  "inF1"
-                              Name 53  "inF2"
-                              Name 62  "PixelShaderFunction3x3(mf33;mf33;mf33;"
-                              Name 59  "inF0"
-                              Name 60  "inF1"
-                              Name 61  "inF2"
-                              Name 71  "PixelShaderFunction4x4(mf44;mf44;mf44;"
-                              Name 68  "inF0"
-                              Name 69  "inF1"
-                              Name 70  "inF2"
-                              Name 80  "TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;"
-                              Name 74  "inF0"
-                              Name 75  "inF1"
-                              Name 76  "inFV0"
-                              Name 77  "inFV1"
-                              Name 78  "inFM0"
-                              Name 79  "inFM1"
-                              Name 89  "TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;"
-                              Name 83  "inF0"
-                              Name 84  "inF1"
-                              Name 85  "inFV0"
-                              Name 86  "inFV1"
-                              Name 87  "inFM0"
-                              Name 88  "inFM1"
-                              Name 99  "TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;"
-                              Name 93  "inF0"
-                              Name 94  "inF1"
-                              Name 95  "inFV0"
-                              Name 96  "inFV1"
-                              Name 97  "inFM0"
-                              Name 98  "inFM1"
-                              Name 119  "TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42;"
-                              Name 110  "inF0"
-                              Name 111  "inF1"
-                              Name 112  "inFV2"
-                              Name 113  "inFV3"
-                              Name 114  "inFM2x3"
-                              Name 115  "inFM3x2"
-                              Name 116  "inFM3x3"
-                              Name 117  "inFM3x4"
-                              Name 118  "inFM2x4"
-                              Name 123  "r000"
-                              Name 126  "r001"
-                              Name 129  "r002"
-                              Name 132  "r003"
-                              Name 135  "r004"
-                              Name 140  "r005"
-                              Name 143  "r006"
-                              Name 146  "r007"
-                              Name 149  "r009"
-                              Name 152  "r010"
-                              Name 156  "r011"
-                              Name 159  "r012"
-                              Name 170  "r014"
-                              Name 173  "r015"
-                              Name 176  "r016"
-                              Name 179  "r017"
-                              Name 182  "r018"
-                              Name 185  "r019"
-                              Name 188  "r020"
-                              Name 191  "r021"
-                              Name 194  "r022"
-                              Name 197  "r023"
-                              Name 200  "r027"
-                              Name 203  "r028"
-                              Name 206  "r029"
-                              Name 210  "r030"
-                              Name 213  "r031"
-                              Name 216  "r033"
-                              Name 220  "r034"
-                              Name 223  "r035"
-                              Name 225  "ResType"
-                              Name 229  "r036"
-                              Name 232  "r037"
-                              Name 235  "r038"
-                              Name 238  "r039"
-                              Name 242  "r039a"
-                              Name 247  "r040"
-                              Name 250  "r041"
-                              Name 255  "r042"
-                              Name 258  "r043"
-                              Name 262  "r044"
-                              Name 266  "r045"
-                              Name 270  "r046"
-                              Name 273  "r047"
-                              Name 277  "r048"
-                              Name 280  "r049"
-                              Name 283  "r050"
-                              Name 286  "r051"
-                              Name 289  "r052"
-                              Name 292  "r053"
-                              Name 299  "r055"
-                              Name 302  "r056"
-                              Name 307  "r057"
-                              Name 310  "r058"
-                              Name 314  "r059"
-                              Name 317  "r060"
-                              Name 320  "r061"
-                              Name 327  "r000"
-                              Name 330  "r001"
-                              Name 333  "r002"
-                              Name 336  "r003"
-                              Name 339  "r004"
-                              Name 344  "r005"
-                              Name 347  "r006"
-                              Name 350  "r007"
-                              Name 353  "r009"
-                              Name 356  "r010"
-                              Name 360  "r011"
-                              Name 363  "r012"
-                              Name 376  "r013"
-                              Name 379  "r015"
-                              Name 382  "r016"
-                              Name 386  "r017"
-                              Name 389  "r018"
-                              Name 392  "r019"
-                              Name 395  "r020"
-                              Name 398  "r021"
-                              Name 401  "r022"
-                              Name 404  "r023"
-                              Name 407  "r026"
-                              Name 411  "r027"
-                              Name 415  "r028"
-                              Name 418  "r029"
-                              Name 421  "r030"
-                              Name 426  "r031"
-                              Name 430  "r032"
-                              Name 432  "r033"
-                              Name 435  "r035"
-                              Name 439  "r036"
-                              Name 442  "r037"
-                              Name 444  "ResType"
-                              Name 448  "r038"
-                              Name 452  "r039"
-                              Name 455  "r040"
-                              Name 458  "r041"
-                              Name 462  "r039a"
-                              Name 467  "r042"
-                              Name 470  "r043"
-                              Name 473  "r044"
-                              Name 477  "r045"
-                              Name 480  "r046"
-                              Name 484  "r047"
-                              Name 488  "r048"
-                              Name 491  "r049"
-                              Name 495  "r050"
-                              Name 498  "r051"
-                              Name 502  "r052"
-                              Name 506  "r053"
-                              Name 511  "r054"
-                              Name 515  "r055"
-                              Name 518  "r056"
-                              Name 521  "r057"
-                              Name 526  "r058"
-                              Name 529  "r059"
-                              Name 536  "r060"
-                              Name 539  "r061"
-                              Name 544  "r062"
-                              Name 547  "r063"
-                              Name 551  "r064"
-                              Name 554  "r065"
-                              Name 557  "r066"
-                              Name 563  "r000"
-                              Name 566  "r001"
-                              Name 569  "r002"
-                              Name 572  "r003"
-                              Name 575  "r004"
-                              Name 580  "r005"
-                              Name 583  "r006"
-                              Name 586  "r007"
-                              Name 589  "r009"
-                              Name 592  "r010"
-                              Name 596  "r011"
-                              Name 599  "r012"
-                              Name 612  "r013"
-                              Name 615  "r014"
-                              Name 618  "r015"
-                              Name 622  "r016"
-                              Name 626  "r017"
-                              Name 629  "r018"
-                              Name 632  "r019"
-                              Name 635  "r020"
-                              Name 638  "r021"
-                              Name 641  "r022"
-                              Name 644  "r023"
-                              Name 647  "r024"
-                              Name 651  "r025"
-                              Name 655  "r029"
-                              Name 658  "r030"
-                              Name 661  "r031"
-                              Name 666  "r032"
-                              Name 670  "r033"
-                              Name 672  "r034"
-                              Name 675  "r036"
-                              Name 679  "r037"
-                              Name 682  "r038"
-                              Name 684  "ResType"
-                              Name 688  "r039"
-                              Name 692  "r040"
-                              Name 695  "r041"
-                              Name 698  "r042"
-                              Name 702  "r039a"
-                              Name 707  "r039b"
-                              Name 713  "r043"
-                              Name 716  "r044"
-                              Name 719  "r045"
-                              Name 723  "r046"
-                              Name 726  "r047"
-                              Name 730  "r048"
-                              Name 734  "r049"
-                              Name 737  "r050"
-                              Name 741  "r051"
-                              Name 744  "r052"
-                              Name 748  "r053"
-                              Name 752  "r054"
-                              Name 756  "r055"
-                              Name 759  "r056"
-                              Name 762  "r057"
-                              Name 765  "r058"
-                              Name 770  "r059"
-                              Name 773  "r060"
-                              Name 780  "r061"
-                              Name 783  "r062"
-                              Name 788  "r063"
-                              Name 791  "r064"
-                              Name 795  "r065"
-                              Name 798  "r066"
-                              Name 801  "r067"
-                              Name 808  "r000"
-                              Name 810  "inF0"
-                              Name 813  "r001"
-                              Name 816  "r002"
-                              Name 819  "r003"
-                              Name 822  "r004"
-                              Name 827  "r005"
-                              Name 832  "r006"
-                              Name 835  "r007"
-                              Name 837  "inU0"
-                              Name 840  "r009"
-                              Name 843  "r010"
-                              Name 845  "inF1"
-                              Name 848  "r011"
-                              Name 851  "r012"
-                              Name 854  "inF2"
-                              Name 865  "r013"
-                              Name 868  "r014"
-                              Name 871  "r015"
-                              Name 874  "r016"
-                              Name 877  "r017"
-                              Name 880  "r018"
-                              Name 883  "r019"
-                              Name 886  "r020"
-                              Name 889  "r021"
-                              Name 892  "r022"
-                              Name 895  "r023"
-                              Name 899  "r024"
-                              Name 903  "r025"
-                              Name 915  "r029"
-                              Name 918  "r030"
-                              Name 921  "r031"
-                              Name 926  "r032"
-                              Name 931  "r033"
-                              Name 933  "r034"
-                              Name 936  "r036"
-                              Name 940  "r037"
-                              Name 943  "r038"
-                              Name 945  "ResType"
-                              Name 949  "r039"
-                              Name 953  "r040"
-                              Name 956  "r041"
-                              Name 959  "r042"
-                              Name 963  "r039a"
-                              Name 968  "r043"
-                              Name 971  "r044"
-                              Name 974  "r045"
-                              Name 978  "r046"
-                              Name 981  "r047"
-                              Name 985  "r048"
-                              Name 989  "r049"
-                              Name 992  "r050"
-                              Name 996  "r051"
-                              Name 999  "r052"
-                              Name 1003  "r053"
-                              Name 1007  "r054"
-                              Name 1011  "r055"
-                              Name 1014  "r056"
-                              Name 1017  "r057"
-                              Name 1020  "r058"
-                              Name 1025  "r059"
-                              Name 1028  "r060"
-                              Name 1035  "r061"
-                              Name 1038  "r062"
-                              Name 1043  "r063"
-                              Name 1046  "r064"
-                              Name 1050  "r065"
-                              Name 1053  "r066"
-                              Name 1056  "r067"
-                              Name 1062  "r000"
-                              Name 1065  "r001"
-                              Name 1070  "r003"
-                              Name 1073  "r004"
-                              Name 1076  "r005"
-                              Name 1079  "r006"
-                              Name 1083  "r007"
-                              Name 1094  "r008"
-                              Name 1099  "r009"
-                              Name 1102  "r010"
-                              Name 1105  "r011"
-                              Name 1108  "r012"
-                              Name 1111  "r013"
-                              Name 1114  "r014"
-                              Name 1117  "r015"
-                              Name 1120  "r016"
-                              Name 1123  "r017"
-                              Name 1126  "r018"
-                              Name 1129  "r019"
-                              Name 1132  "R020"
-                              Name 1135  "r021"
-                              Name 1138  "r022"
-                              Name 1148  "r023"
-                              Name 1151  "r024"
-                              Name 1153  "ResType"
-                              Name 1157  "r025"
-                              Name 1160  "r026"
-                              Name 1164  "r026a"
-                              Name 1169  "r027"
-                              Name 1172  "r028"
-                              Name 1176  "r029"
-                              Name 1179  "r030"
-                              Name 1183  "r031"
-                              Name 1187  "r032"
-                              Name 1191  "r033"
-                              Name 1194  "r034"
-                              Name 1197  "r035"
-                              Name 1200  "r036"
-                              Name 1205  "r037"
-                              Name 1208  "r038"
-                              Name 1215  "r039"
-                              Name 1218  "r049"
-                              Name 1223  "r041"
-                              Name 1226  "r042"
-                              Name 1230  "r043"
-                              Name 1233  "r044"
-                              Name 1238  "r046"
-                              Name 1245  "r000"
-                              Name 1248  "r001"
-                              Name 1253  "r003"
-                              Name 1256  "r004"
-                              Name 1259  "r005"
-                              Name 1262  "r006"
-                              Name 1266  "r007"
-                              Name 1277  "r008"
-                              Name 1282  "r009"
-                              Name 1285  "r010"
-                              Name 1288  "r011"
-                              Name 1291  "r012"
-                              Name 1294  "r013"
-                              Name 1297  "r014"
-                              Name 1300  "r015"
-                              Name 1303  "r016"
-                              Name 1306  "r017"
-                              Name 1309  "r018"
-                              Name 1312  "r019"
-                              Name 1315  "R020"
-                              Name 1318  "r021"
-                              Name 1321  "r022"
-                              Name 1334  "r023"
-                              Name 1337  "r024"
-                              Name 1339  "ResType"
-                              Name 1343  "r025"
-                              Name 1346  "r026"
-                              Name 1350  "r026a"
-                              Name 1355  "r027"
-                              Name 1358  "r028"
-                              Name 1362  "r029"
-                              Name 1365  "r030"
-                              Name 1369  "r031"
-                              Name 1373  "r032"
-                              Name 1377  "r033"
-                              Name 1380  "r034"
-                              Name 1383  "r035"
-                              Name 1386  "r036"
-                              Name 1391  "r037"
-                              Name 1394  "r038"
-                              Name 1401  "r039"
-                              Name 1404  "r049"
-                              Name 1409  "r041"
-                              Name 1412  "r042"
-                              Name 1416  "r043"
-                              Name 1419  "r044"
-                              Name 1424  "r046"
-                              Name 1431  "r000"
-                              Name 1434  "r001"
-                              Name 1439  "r003"
-                              Name 1442  "r004"
-                              Name 1445  "r005"
-                              Name 1448  "r006"
-                              Name 1452  "r007"
-                              Name 1463  "r008"
-                              Name 1468  "r009"
-                              Name 1471  "r010"
-                              Name 1474  "r011"
-                              Name 1477  "r012"
-                              Name 1480  "r013"
-                              Name 1483  "r014"
-                              Name 1486  "r015"
-                              Name 1489  "r016"
-                              Name 1492  "r017"
-                              Name 1495  "r018"
-                              Name 1498  "r019"
-                              Name 1501  "R020"
-                              Name 1504  "r021"
-                              Name 1507  "r022"
-                              Name 1523  "r023"
-                              Name 1526  "r024"
-                              Name 1528  "ResType"
-                              Name 1532  "r025"
-                              Name 1535  "r026"
-                              Name 1539  "r026a"
-                              Name 1544  "r027"
-                              Name 1547  "r028"
-                              Name 1551  "r029"
-                              Name 1554  "r030"
-                              Name 1558  "r031"
-                              Name 1562  "r032"
-                              Name 1566  "r033"
-                              Name 1569  "r034"
-                              Name 1572  "r035"
-                              Name 1575  "r036"
-                              Name 1580  "r037"
-                              Name 1583  "r038"
-                              Name 1590  "r039"
-                              Name 1593  "r049"
-                              Name 1598  "r041"
-                              Name 1601  "r042"
-                              Name 1605  "r043"
-                              Name 1608  "r044"
-                              Name 1613  "r046"
-                              Name 1620  "r0"
-                              Name 1624  "r1"
-                              Name 1628  "r2"
-                              Name 1632  "r3"
-                              Name 1636  "r4"
-                              Name 1640  "r5"
-                              Name 1644  "r6"
-                              Name 1648  "r7"
-                              Name 1652  "r8"
-                              Name 1656  "r0"
-                              Name 1660  "r1"
-                              Name 1664  "r2"
-                              Name 1668  "r3"
-                              Name 1672  "r4"
-                              Name 1676  "r5"
-                              Name 1680  "r6"
-                              Name 1684  "r7"
-                              Name 1688  "r8"
-                              Name 1692  "r0"
-                              Name 1696  "r1"
-                              Name 1700  "r2"
-                              Name 1704  "r3"
-                              Name 1708  "r4"
-                              Name 1712  "r5"
-                              Name 1716  "r6"
-                              Name 1720  "r7"
-                              Name 1724  "r8"
-                              Name 1728  "r00"
-                              Name 1732  "r01"
-                              Name 1736  "r02"
-                              Name 1740  "r03"
-                              Name 1744  "r04"
-                              Name 1748  "r05"
-                              Name 1752  "r06"
-                              Name 1756  "r07"
-                              Name 1760  "r08"
-                              Name 1764  "r09"
-                              Name 1768  "r10"
-                              Name 1772  "r11"
-                              Name 1776  "r12"
-                              Name 1780  "r13"
-                              Name 1784  "r14"
-                              Name 1788  "r15"
-                              Name 1792  "r16"
-                              Name 1797  "gs_ua"
-                              Name 1798  "gs_ub"
-                              Name 1799  "gs_uc"
-                              Name 1801  "gs_ua2"
-                              Name 1802  "gs_ub2"
-                              Name 1803  "gs_uc2"
-                              Name 1805  "gs_ua3"
-                              Name 1806  "gs_ub3"
-                              Name 1807  "gs_uc3"
-                              Name 1809  "gs_ua4"
-                              Name 1810  "gs_ub4"
-                              Name 1811  "gs_uc4"
+                              Name 58  "PixelShaderFunction(vf4;vf4;vf4;vu4;vu4;"
+                              Name 53  "inF0"
+                              Name 54  "inF1"
+                              Name 55  "inF2"
+                              Name 56  "inU0"
+                              Name 57  "inU1"
+                              Name 66  "PixelShaderFunction2x2(mf22;mf22;mf22;"
+                              Name 63  "inF0"
+                              Name 64  "inF1"
+                              Name 65  "inF2"
+                              Name 74  "PixelShaderFunction3x3(mf33;mf33;mf33;"
+                              Name 71  "inF0"
+                              Name 72  "inF1"
+                              Name 73  "inF2"
+                              Name 82  "PixelShaderFunction4x4(mf44;mf44;mf44;"
+                              Name 79  "inF0"
+                              Name 80  "inF1"
+                              Name 81  "inF2"
+                              Name 91  "TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;"
+                              Name 85  "inF0"
+                              Name 86  "inF1"
+                              Name 87  "inFV0"
+                              Name 88  "inFV1"
+                              Name 89  "inFM0"
+                              Name 90  "inFM1"
+                              Name 100  "TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;"
+                              Name 94  "inF0"
+                              Name 95  "inF1"
+                              Name 96  "inFV0"
+                              Name 97  "inFV1"
+                              Name 98  "inFM0"
+                              Name 99  "inFM1"
+                              Name 109  "TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;"
+                              Name 103  "inF0"
+                              Name 104  "inF1"
+                              Name 105  "inFV0"
+                              Name 106  "inFV1"
+                              Name 107  "inFM0"
+                              Name 108  "inFM1"
+                              Name 129  "TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;"
+                              Name 120  "inF0"
+                              Name 121  "inF1"
+                              Name 122  "inFV2"
+                              Name 123  "inFV3"
+                              Name 124  "inFM2x3"
+                              Name 125  "inFM3x2"
+                              Name 126  "inFM3x3"
+                              Name 127  "inFM3x4"
+                              Name 128  "inFM2x4"
+                              Name 133  "r000"
+                              Name 136  "r001"
+                              Name 139  "r002"
+                              Name 142  "r003"
+                              Name 145  "r004"
+                              Name 150  "r005"
+                              Name 153  "r006"
+                              Name 156  "r007"
+                              Name 159  "r009"
+                              Name 162  "r010"
+                              Name 166  "r011"
+                              Name 169  "r012"
+                              Name 180  "r014"
+                              Name 183  "r015"
+                              Name 186  "r016"
+                              Name 189  "r017"
+                              Name 192  "r018"
+                              Name 195  "r019"
+                              Name 198  "r020"
+                              Name 201  "r021"
+                              Name 204  "r022"
+                              Name 207  "r023"
+                              Name 210  "r027"
+                              Name 213  "r028"
+                              Name 216  "r029"
+                              Name 220  "r030"
+                              Name 223  "r031"
+                              Name 226  "r033"
+                              Name 230  "r034"
+                              Name 233  "r035"
+                              Name 235  "ResType"
+                              Name 239  "r036"
+                              Name 242  "r037"
+                              Name 245  "r038"
+                              Name 248  "r039"
+                              Name 252  "r039a"
+                              Name 257  "r040"
+                              Name 260  "r041"
+                              Name 265  "r042"
+                              Name 268  "r043"
+                              Name 272  "r044"
+                              Name 276  "r045"
+                              Name 280  "r046"
+                              Name 283  "r047"
+                              Name 287  "r048"
+                              Name 290  "r049"
+                              Name 293  "r050"
+                              Name 296  "r051"
+                              Name 299  "r052"
+                              Name 302  "r053"
+                              Name 309  "r055"
+                              Name 312  "r056"
+                              Name 317  "r057"
+                              Name 320  "r058"
+                              Name 324  "r059"
+                              Name 327  "r060"
+                              Name 330  "r061"
+                              Name 337  "r000"
+                              Name 340  "r001"
+                              Name 343  "r002"
+                              Name 346  "r003"
+                              Name 349  "r004"
+                              Name 354  "r005"
+                              Name 357  "r006"
+                              Name 360  "r007"
+                              Name 363  "r009"
+                              Name 366  "r010"
+                              Name 370  "r011"
+                              Name 373  "r012"
+                              Name 386  "r013"
+                              Name 389  "r015"
+                              Name 392  "r016"
+                              Name 396  "r017"
+                              Name 399  "r018"
+                              Name 402  "r019"
+                              Name 405  "r020"
+                              Name 408  "r021"
+                              Name 411  "r022"
+                              Name 414  "r023"
+                              Name 417  "r026"
+                              Name 421  "r027"
+                              Name 425  "r028"
+                              Name 428  "r029"
+                              Name 431  "r030"
+                              Name 436  "r031"
+                              Name 440  "r032"
+                              Name 442  "r033"
+                              Name 445  "r035"
+                              Name 449  "r036"
+                              Name 452  "r037"
+                              Name 454  "ResType"
+                              Name 458  "r038"
+                              Name 462  "r039"
+                              Name 465  "r040"
+                              Name 468  "r041"
+                              Name 472  "r039a"
+                              Name 477  "r042"
+                              Name 480  "r043"
+                              Name 483  "r044"
+                              Name 487  "r045"
+                              Name 490  "r046"
+                              Name 494  "r047"
+                              Name 498  "r048"
+                              Name 501  "r049"
+                              Name 505  "r050"
+                              Name 508  "r051"
+                              Name 512  "r052"
+                              Name 516  "r053"
+                              Name 521  "r054"
+                              Name 525  "r055"
+                              Name 528  "r056"
+                              Name 531  "r057"
+                              Name 536  "r058"
+                              Name 539  "r059"
+                              Name 546  "r060"
+                              Name 549  "r061"
+                              Name 554  "r062"
+                              Name 557  "r063"
+                              Name 561  "r064"
+                              Name 564  "r065"
+                              Name 567  "r066"
+                              Name 573  "r000"
+                              Name 576  "r001"
+                              Name 579  "r002"
+                              Name 582  "r003"
+                              Name 585  "r004"
+                              Name 590  "r005"
+                              Name 593  "r006"
+                              Name 596  "r007"
+                              Name 599  "r009"
+                              Name 602  "r010"
+                              Name 606  "r011"
+                              Name 609  "r012"
+                              Name 622  "r013"
+                              Name 625  "r014"
+                              Name 628  "r015"
+                              Name 632  "r016"
+                              Name 636  "r017"
+                              Name 639  "r018"
+                              Name 642  "r019"
+                              Name 645  "r020"
+                              Name 648  "r021"
+                              Name 651  "r022"
+                              Name 654  "r023"
+                              Name 657  "r024"
+                              Name 661  "r025"
+                              Name 665  "r029"
+                              Name 668  "r030"
+                              Name 671  "r031"
+                              Name 676  "r032"
+                              Name 680  "r033"
+                              Name 682  "r034"
+                              Name 685  "r036"
+                              Name 689  "r037"
+                              Name 692  "r038"
+                              Name 694  "ResType"
+                              Name 698  "r039"
+                              Name 702  "r040"
+                              Name 705  "r041"
+                              Name 708  "r042"
+                              Name 712  "r039a"
+                              Name 717  "r039b"
+                              Name 723  "r043"
+                              Name 726  "r044"
+                              Name 729  "r045"
+                              Name 733  "r046"
+                              Name 736  "r047"
+                              Name 740  "r048"
+                              Name 744  "r049"
+                              Name 747  "r050"
+                              Name 751  "r051"
+                              Name 754  "r052"
+                              Name 758  "r053"
+                              Name 762  "r054"
+                              Name 766  "r055"
+                              Name 769  "r056"
+                              Name 772  "r057"
+                              Name 775  "r058"
+                              Name 780  "r059"
+                              Name 783  "r060"
+                              Name 790  "r061"
+                              Name 793  "r062"
+                              Name 798  "r063"
+                              Name 801  "r064"
+                              Name 805  "r065"
+                              Name 808  "r066"
+                              Name 811  "r067"
+                              Name 818  "r000"
+                              Name 821  "r001"
+                              Name 824  "r002"
+                              Name 827  "r003"
+                              Name 830  "r004"
+                              Name 835  "r005"
+                              Name 838  "r006"
+                              Name 841  "r007"
+                              Name 844  "r009"
+                              Name 847  "r010"
+                              Name 851  "r011"
+                              Name 854  "r012"
+                              Name 867  "r013"
+                              Name 870  "r014"
+                              Name 873  "r015"
+                              Name 876  "r016"
+                              Name 879  "r017"
+                              Name 882  "r018"
+                              Name 885  "r019"
+                              Name 888  "r020"
+                              Name 891  "r021"
+                              Name 894  "r022"
+                              Name 897  "r023"
+                              Name 901  "r024"
+                              Name 905  "r025"
+                              Name 916  "r029"
+                              Name 919  "r030"
+                              Name 922  "r031"
+                              Name 927  "r032"
+                              Name 932  "r033"
+                              Name 934  "r034"
+                              Name 937  "r036"
+                              Name 941  "r037"
+                              Name 944  "r038"
+                              Name 946  "ResType"
+                              Name 950  "r039"
+                              Name 954  "r040"
+                              Name 957  "r041"
+                              Name 960  "r042"
+                              Name 964  "r039a"
+                              Name 969  "r043"
+                              Name 972  "r044"
+                              Name 975  "r045"
+                              Name 979  "r046"
+                              Name 982  "r047"
+                              Name 986  "r048"
+                              Name 990  "r049"
+                              Name 993  "r050"
+                              Name 997  "r051"
+                              Name 1000  "r052"
+                              Name 1004  "r053"
+                              Name 1008  "r054"
+                              Name 1012  "r055"
+                              Name 1015  "r056"
+                              Name 1018  "r057"
+                              Name 1021  "r058"
+                              Name 1026  "r059"
+                              Name 1029  "r060"
+                              Name 1036  "r061"
+                              Name 1039  "r062"
+                              Name 1044  "r063"
+                              Name 1047  "r064"
+                              Name 1051  "r065"
+                              Name 1054  "r066"
+                              Name 1057  "r067"
+                              Name 1064  "r000"
+                              Name 1067  "r001"
+                              Name 1072  "r003"
+                              Name 1075  "r004"
+                              Name 1078  "r005"
+                              Name 1081  "r006"
+                              Name 1085  "r007"
+                              Name 1096  "r008"
+                              Name 1101  "r009"
+                              Name 1104  "r010"
+                              Name 1107  "r011"
+                              Name 1110  "r012"
+                              Name 1113  "r013"
+                              Name 1116  "r014"
+                              Name 1119  "r015"
+                              Name 1122  "r016"
+                              Name 1125  "r017"
+                              Name 1128  "r018"
+                              Name 1131  "r019"
+                              Name 1134  "R020"
+                              Name 1137  "r021"
+                              Name 1140  "r022"
+                              Name 1150  "r023"
+                              Name 1153  "r024"
+                              Name 1155  "ResType"
+                              Name 1159  "r025"
+                              Name 1162  "r026"
+                              Name 1166  "r026a"
+                              Name 1171  "r027"
+                              Name 1174  "r028"
+                              Name 1178  "r029"
+                              Name 1181  "r030"
+                              Name 1185  "r031"
+                              Name 1189  "r032"
+                              Name 1193  "r033"
+                              Name 1196  "r034"
+                              Name 1199  "r035"
+                              Name 1202  "r036"
+                              Name 1207  "r037"
+                              Name 1210  "r038"
+                              Name 1217  "r039"
+                              Name 1220  "r049"
+                              Name 1225  "r041"
+                              Name 1228  "r042"
+                              Name 1232  "r043"
+                              Name 1235  "r044"
+                              Name 1240  "r046"
+                              Name 1247  "r000"
+                              Name 1250  "r001"
+                              Name 1255  "r003"
+                              Name 1258  "r004"
+                              Name 1261  "r005"
+                              Name 1264  "r006"
+                              Name 1268  "r007"
+                              Name 1279  "r008"
+                              Name 1284  "r009"
+                              Name 1287  "r010"
+                              Name 1290  "r011"
+                              Name 1293  "r012"
+                              Name 1296  "r013"
+                              Name 1299  "r014"
+                              Name 1302  "r015"
+                              Name 1305  "r016"
+                              Name 1308  "r017"
+                              Name 1311  "r018"
+                              Name 1314  "r019"
+                              Name 1317  "R020"
+                              Name 1320  "r021"
+                              Name 1323  "r022"
+                              Name 1336  "r023"
+                              Name 1339  "r024"
+                              Name 1341  "ResType"
+                              Name 1345  "r025"
+                              Name 1348  "r026"
+                              Name 1352  "r026a"
+                              Name 1357  "r027"
+                              Name 1360  "r028"
+                              Name 1364  "r029"
+                              Name 1367  "r030"
+                              Name 1371  "r031"
+                              Name 1375  "r032"
+                              Name 1379  "r033"
+                              Name 1382  "r034"
+                              Name 1385  "r035"
+                              Name 1388  "r036"
+                              Name 1393  "r037"
+                              Name 1396  "r038"
+                              Name 1403  "r039"
+                              Name 1406  "r049"
+                              Name 1411  "r041"
+                              Name 1414  "r042"
+                              Name 1418  "r043"
+                              Name 1421  "r044"
+                              Name 1426  "r046"
+                              Name 1433  "r000"
+                              Name 1436  "r001"
+                              Name 1441  "r003"
+                              Name 1444  "r004"
+                              Name 1447  "r005"
+                              Name 1450  "r006"
+                              Name 1454  "r007"
+                              Name 1465  "r008"
+                              Name 1470  "r009"
+                              Name 1473  "r010"
+                              Name 1476  "r011"
+                              Name 1479  "r012"
+                              Name 1482  "r013"
+                              Name 1485  "r014"
+                              Name 1488  "r015"
+                              Name 1491  "r016"
+                              Name 1494  "r017"
+                              Name 1497  "r018"
+                              Name 1500  "r019"
+                              Name 1503  "R020"
+                              Name 1506  "r021"
+                              Name 1509  "r022"
+                              Name 1525  "r023"
+                              Name 1528  "r024"
+                              Name 1530  "ResType"
+                              Name 1534  "r025"
+                              Name 1537  "r026"
+                              Name 1541  "r026a"
+                              Name 1546  "r027"
+                              Name 1549  "r028"
+                              Name 1553  "r029"
+                              Name 1556  "r030"
+                              Name 1560  "r031"
+                              Name 1564  "r032"
+                              Name 1568  "r033"
+                              Name 1571  "r034"
+                              Name 1574  "r035"
+                              Name 1577  "r036"
+                              Name 1582  "r037"
+                              Name 1585  "r038"
+                              Name 1592  "r039"
+                              Name 1595  "r049"
+                              Name 1600  "r041"
+                              Name 1603  "r042"
+                              Name 1607  "r043"
+                              Name 1610  "r044"
+                              Name 1615  "r046"
+                              Name 1622  "r0"
+                              Name 1626  "r1"
+                              Name 1630  "r2"
+                              Name 1634  "r3"
+                              Name 1638  "r4"
+                              Name 1642  "r5"
+                              Name 1646  "r6"
+                              Name 1650  "r7"
+                              Name 1654  "r8"
+                              Name 1658  "r0"
+                              Name 1662  "r1"
+                              Name 1666  "r2"
+                              Name 1670  "r3"
+                              Name 1674  "r4"
+                              Name 1678  "r5"
+                              Name 1682  "r6"
+                              Name 1686  "r7"
+                              Name 1690  "r8"
+                              Name 1694  "r0"
+                              Name 1698  "r1"
+                              Name 1702  "r2"
+                              Name 1706  "r3"
+                              Name 1710  "r4"
+                              Name 1714  "r5"
+                              Name 1718  "r6"
+                              Name 1722  "r7"
+                              Name 1726  "r8"
+                              Name 1730  "r00"
+                              Name 1734  "r01"
+                              Name 1738  "r02"
+                              Name 1742  "r03"
+                              Name 1746  "r04"
+                              Name 1750  "r05"
+                              Name 1754  "r06"
+                              Name 1758  "r07"
+                              Name 1762  "r08"
+                              Name 1766  "r09"
+                              Name 1770  "r10"
+                              Name 1774  "r11"
+                              Name 1778  "r12"
+                              Name 1782  "r13"
+                              Name 1786  "r14"
+                              Name 1790  "r15"
+                              Name 1794  "r16"
+                              Name 1798  "PS_OUTPUT"
+                              MemberName 1798(PS_OUTPUT) 0  "color"
+                              Name 1800  "ps_output"
+                              Name 1805  "color"
+                              Name 1810  "gs_ua"
+                              Name 1811  "gs_ub"
+                              Name 1812  "gs_uc"
+                              Name 1814  "gs_ua2"
+                              Name 1815  "gs_ub2"
+                              Name 1816  "gs_uc2"
+                              Name 1818  "gs_ua3"
+                              Name 1819  "gs_ub3"
+                              Name 1820  "gs_uc3"
+                              Name 1822  "gs_ua4"
+                              Name 1823  "gs_ub4"
+                              Name 1824  "gs_uc4"
+                              Decorate 1805(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -6099,424 +6151,130 @@
               38:             TypeVector 8(int) 3
               39:             TypePointer Function 38(ivec3)
               40:             TypeFunction 36(fvec3) 37(ptr) 37(ptr) 37(ptr) 39(ptr) 39(ptr)
-              48:             TypeMatrix 24(fvec2) 2
-              49:             TypePointer Function 48
-              50:             TypeFunction 48 49(ptr) 49(ptr) 49(ptr)
-              56:             TypeMatrix 36(fvec3) 3
-              57:             TypePointer Function 56
-              58:             TypeFunction 56 57(ptr) 57(ptr) 57(ptr)
-              64:             TypeVector 6(float) 4
-              65:             TypeMatrix 64(fvec4) 4
-              66:             TypePointer Function 65
-              67:             TypeFunction 65 66(ptr) 66(ptr) 66(ptr)
-              73:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 25(ptr) 49(ptr) 49(ptr)
-              82:             TypeFunction 2 7(ptr) 7(ptr) 37(ptr) 37(ptr) 57(ptr) 57(ptr)
-              91:             TypePointer Function 64(fvec4)
-              92:             TypeFunction 2 7(ptr) 7(ptr) 91(ptr) 91(ptr) 66(ptr) 66(ptr)
-             101:             TypeMatrix 24(fvec2) 3
-             102:             TypePointer Function 101
-             103:             TypeMatrix 36(fvec3) 2
-             104:             TypePointer Function 103
-             105:             TypeMatrix 36(fvec3) 4
-             106:             TypePointer Function 105
-             107:             TypeMatrix 24(fvec2) 4
-             108:             TypePointer Function 107
-             109:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 37(ptr) 102(ptr) 104(ptr) 57(ptr) 106(ptr) 108(ptr)
-             121:             TypeBool
-             122:             TypePointer Function 121(bool)
-             138:             TypeInt 32 1
-             139:             TypePointer Function 138(int)
-             165:    6(float) Constant 0
-             177:      8(int) Constant 7
-             207:    138(int) Constant 7
-    225(ResType):             TypeStruct 6(float) 138(int)
-             253:    6(float) Constant 1050288283
-             274:    6(float) Constant 1065353216
-             278:      8(int) Constant 2
-             342:             TypeVector 138(int) 2
-             343:             TypePointer Function 342(ivec2)
-             369:   24(fvec2) ConstantComposite 165 165
-             370:             TypeVector 121(bool) 2
-             383:      8(int) Constant 3
-             384:   26(ivec2) ConstantComposite 177 383
-             427:      8(int) Constant 8
-             428:   26(ivec2) ConstantComposite 177 427
-    444(ResType):             TypeStruct 24(fvec2) 342(ivec2)
-             451:             TypePointer Function 370(bvec2)
-             509:    6(float) Constant 1073741824
-             512:      8(int) Constant 1
-             513:   26(ivec2) ConstantComposite 512 278
-             560:   24(fvec2) ConstantComposite 274 509
-             578:             TypeVector 138(int) 3
-             579:             TypePointer Function 578(ivec3)
-             605:   36(fvec3) ConstantComposite 165 165 165
-             606:             TypeVector 121(bool) 3
-             619:      8(int) Constant 5
-             620:   38(ivec3) ConstantComposite 177 383 619
-             667:      8(int) Constant 4
-             668:   38(ivec3) ConstantComposite 278 383 667
-    684(ResType):             TypeStruct 36(fvec3) 578(ivec3)
-             691:             TypePointer Function 606(bvec3)
-             710:    6(float) Constant 1050253722
-             757:   38(ivec3) ConstantComposite 512 278 383
-             804:    6(float) Constant 1077936128
-             805:   36(fvec3) ConstantComposite 274 509 804
-             809:             TypePointer Input 64(fvec4)
-       810(inF0):    809(ptr) Variable Input
-             825:             TypeVector 138(int) 4
-             826:             TypePointer Function 825(ivec4)
-             830:             TypeVector 8(int) 4
-             831:             TypePointer Function 830(ivec4)
-             836:             TypePointer Input 830(ivec4)
-       837(inU0):    836(ptr) Variable Input
-       845(inF1):    809(ptr) Variable Input
-       854(inF2):    809(ptr) Variable Input
-             858:   64(fvec4) ConstantComposite 165 165 165 165
-             859:             TypeVector 121(bool) 4
-             872:  830(ivec4) ConstantComposite 177 383 619 278
-             904:             TypePointer Input 6(float)
-             927:      8(int) Constant 9
-             928:      8(int) Constant 10
-             929:  830(ivec4) ConstantComposite 177 427 927 928
-    945(ResType):             TypeStruct 64(fvec4) 825(ivec4)
-             952:             TypePointer Function 859(bvec4)
-            1012:  830(ivec4) ConstantComposite 512 278 383 667
-            1059:    6(float) Constant 1082130432
-            1060:   64(fvec4) ConstantComposite 274 509 804 1059
-            1087:          48 ConstantComposite 369 369
-            1088:             TypeMatrix 370(bvec2) 2
-   1153(ResType):             TypeStruct 48 342(ivec2)
-            1241:   24(fvec2) ConstantComposite 509 509
-            1242:          48 ConstantComposite 1241 1241
-            1270:          56 ConstantComposite 605 605 605
-            1271:             TypeMatrix 606(bvec3) 3
-   1339(ResType):             TypeStruct 56 578(ivec3)
-            1427:   36(fvec3) ConstantComposite 804 804 804
-            1428:          56 ConstantComposite 1427 1427 1427
-            1456:          65 ConstantComposite 858 858 858 858
-            1457:             TypeMatrix 859(bvec4) 4
-   1528(ResType):             TypeStruct 65 825(ivec4)
-            1616:   64(fvec4) ConstantComposite 1059 1059 1059 1059
-            1617:          65 ConstantComposite 1616 1616 1616 1616
-            1796:             TypePointer Private 8(int)
-     1797(gs_ua):   1796(ptr) Variable Private
-     1798(gs_ub):   1796(ptr) Variable Private
-     1799(gs_uc):   1796(ptr) Variable Private
-            1800:             TypePointer Private 26(ivec2)
-    1801(gs_ua2):   1800(ptr) Variable Private
-    1802(gs_ub2):   1800(ptr) Variable Private
-    1803(gs_uc2):   1800(ptr) Variable Private
-            1804:             TypePointer Private 38(ivec3)
-    1805(gs_ua3):   1804(ptr) Variable Private
-    1806(gs_ub3):   1804(ptr) Variable Private
-    1807(gs_uc3):   1804(ptr) Variable Private
-            1808:             TypePointer Private 830(ivec4)
-    1809(gs_ua4):   1808(ptr) Variable Private
-    1810(gs_ub4):   1808(ptr) Variable Private
-    1811(gs_uc4):   1808(ptr) Variable Private
-4(PixelShaderFunction):           2 Function None 3
+              48:             TypeVector 6(float) 4
+              49:             TypePointer Function 48(fvec4)
+              50:             TypeVector 8(int) 4
+              51:             TypePointer Function 50(ivec4)
+              52:             TypeFunction 48(fvec4) 49(ptr) 49(ptr) 49(ptr) 51(ptr) 51(ptr)
+              60:             TypeMatrix 24(fvec2) 2
+              61:             TypePointer Function 60
+              62:             TypeFunction 60 61(ptr) 61(ptr) 61(ptr)
+              68:             TypeMatrix 36(fvec3) 3
+              69:             TypePointer Function 68
+              70:             TypeFunction 68 69(ptr) 69(ptr) 69(ptr)
+              76:             TypeMatrix 48(fvec4) 4
+              77:             TypePointer Function 76
+              78:             TypeFunction 76 77(ptr) 77(ptr) 77(ptr)
+              84:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 25(ptr) 61(ptr) 61(ptr)
+              93:             TypeFunction 2 7(ptr) 7(ptr) 37(ptr) 37(ptr) 69(ptr) 69(ptr)
+             102:             TypeFunction 2 7(ptr) 7(ptr) 49(ptr) 49(ptr) 77(ptr) 77(ptr)
+             111:             TypeMatrix 36(fvec3) 2
+             112:             TypePointer Function 111
+             113:             TypeMatrix 24(fvec2) 3
+             114:             TypePointer Function 113
+             115:             TypeMatrix 48(fvec4) 3
+             116:             TypePointer Function 115
+             117:             TypeMatrix 48(fvec4) 2
+             118:             TypePointer Function 117
+             119:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 37(ptr) 112(ptr) 114(ptr) 69(ptr) 116(ptr) 118(ptr)
+             131:             TypeBool
+             132:             TypePointer Function 131(bool)
+             148:             TypeInt 32 1
+             149:             TypePointer Function 148(int)
+             175:    6(float) Constant 0
+             187:      8(int) Constant 7
+             217:    148(int) Constant 7
+    235(ResType):             TypeStruct 6(float) 148(int)
+             263:    6(float) Constant 1050288283
+             284:    6(float) Constant 1065353216
+             288:      8(int) Constant 2
+             352:             TypeVector 148(int) 2
+             353:             TypePointer Function 352(ivec2)
+             379:   24(fvec2) ConstantComposite 175 175
+             380:             TypeVector 131(bool) 2
+             393:      8(int) Constant 3
+             394:   26(ivec2) ConstantComposite 187 393
+             437:      8(int) Constant 8
+             438:   26(ivec2) ConstantComposite 187 437
+    454(ResType):             TypeStruct 24(fvec2) 352(ivec2)
+             461:             TypePointer Function 380(bvec2)
+             519:    6(float) Constant 1073741824
+             522:      8(int) Constant 1
+             523:   26(ivec2) ConstantComposite 522 288
+             570:   24(fvec2) ConstantComposite 284 519
+             588:             TypeVector 148(int) 3
+             589:             TypePointer Function 588(ivec3)
+             615:   36(fvec3) ConstantComposite 175 175 175
+             616:             TypeVector 131(bool) 3
+             629:      8(int) Constant 5
+             630:   38(ivec3) ConstantComposite 187 393 629
+             677:      8(int) Constant 4
+             678:   38(ivec3) ConstantComposite 288 393 677
+    694(ResType):             TypeStruct 36(fvec3) 588(ivec3)
+             701:             TypePointer Function 616(bvec3)
+             720:    6(float) Constant 1050253722
+             767:   38(ivec3) ConstantComposite 522 288 393
+             814:    6(float) Constant 1077936128
+             815:   36(fvec3) ConstantComposite 284 519 814
+             833:             TypeVector 148(int) 4
+             834:             TypePointer Function 833(ivec4)
+             860:   48(fvec4) ConstantComposite 175 175 175 175
+             861:             TypeVector 131(bool) 4
+             874:   50(ivec4) ConstantComposite 187 393 629 288
+             928:      8(int) Constant 9
+             929:      8(int) Constant 10
+             930:   50(ivec4) ConstantComposite 187 437 928 929
+    946(ResType):             TypeStruct 48(fvec4) 833(ivec4)
+             953:             TypePointer Function 861(bvec4)
+            1013:   50(ivec4) ConstantComposite 522 288 393 677
+            1060:    6(float) Constant 1082130432
+            1061:   48(fvec4) ConstantComposite 284 519 814 1060
+            1089:          60 ConstantComposite 379 379
+            1090:             TypeMatrix 380(bvec2) 2
+   1155(ResType):             TypeStruct 60 352(ivec2)
+            1243:   24(fvec2) ConstantComposite 519 519
+            1244:          60 ConstantComposite 1243 1243
+            1272:          68 ConstantComposite 615 615 615
+            1273:             TypeMatrix 616(bvec3) 3
+   1341(ResType):             TypeStruct 68 588(ivec3)
+            1429:   36(fvec3) ConstantComposite 814 814 814
+            1430:          68 ConstantComposite 1429 1429 1429
+            1458:          76 ConstantComposite 860 860 860 860
+            1459:             TypeMatrix 861(bvec4) 4
+   1530(ResType):             TypeStruct 76 833(ivec4)
+            1618:   48(fvec4) ConstantComposite 1060 1060 1060 1060
+            1619:          76 ConstantComposite 1618 1618 1618 1618
+ 1798(PS_OUTPUT):             TypeStruct 48(fvec4)
+            1799:             TypePointer Function 1798(PS_OUTPUT)
+            1801:    148(int) Constant 0
+            1802:   48(fvec4) ConstantComposite 284 284 284 284
+            1804:             TypePointer Output 48(fvec4)
+     1805(color):   1804(ptr) Variable Output
+            1809:             TypePointer Private 8(int)
+     1810(gs_ua):   1809(ptr) Variable Private
+     1811(gs_ub):   1809(ptr) Variable Private
+     1812(gs_uc):   1809(ptr) Variable Private
+            1813:             TypePointer Private 26(ivec2)
+    1814(gs_ua2):   1813(ptr) Variable Private
+    1815(gs_ub2):   1813(ptr) Variable Private
+    1816(gs_uc2):   1813(ptr) Variable Private
+            1817:             TypePointer Private 38(ivec3)
+    1818(gs_ua3):   1817(ptr) Variable Private
+    1819(gs_ub3):   1817(ptr) Variable Private
+    1820(gs_uc3):   1817(ptr) Variable Private
+            1821:             TypePointer Private 50(ivec4)
+    1822(gs_ua4):   1821(ptr) Variable Private
+    1823(gs_ub4):   1821(ptr) Variable Private
+    1824(gs_uc4):   1821(ptr) Variable Private
+         4(main):           2 Function None 3
                5:             Label
-       808(r000):    122(ptr) Variable Function
-       813(r001):     91(ptr) Variable Function
-       816(r002):     91(ptr) Variable Function
-       819(r003):    122(ptr) Variable Function
-       822(r004):     91(ptr) Variable Function
-       827(r005):    826(ptr) Variable Function
-       832(r006):    831(ptr) Variable Function
-       835(r007):     91(ptr) Variable Function
-       840(r009):     91(ptr) Variable Function
-       843(r010):     91(ptr) Variable Function
-       848(r011):     91(ptr) Variable Function
-       851(r012):     91(ptr) Variable Function
-       865(r013):     91(ptr) Variable Function
-       868(r014):     91(ptr) Variable Function
-       871(r015):    831(ptr) Variable Function
-       874(r016):     91(ptr) Variable Function
-       877(r017):     91(ptr) Variable Function
-       880(r018):     91(ptr) Variable Function
-       883(r019):     91(ptr) Variable Function
-       886(r020):     91(ptr) Variable Function
-       889(r021):     91(ptr) Variable Function
-       892(r022):     91(ptr) Variable Function
-       895(r023):      7(ptr) Variable Function
-       899(r024):      7(ptr) Variable Function
-       903(r025):     91(ptr) Variable Function
-       915(r029):     91(ptr) Variable Function
-       918(r030):     91(ptr) Variable Function
-       921(r031):     91(ptr) Variable Function
-       926(r032):    831(ptr) Variable Function
-       931(r033):    831(ptr) Variable Function
-       933(r034):     91(ptr) Variable Function
-       936(r036):     91(ptr) Variable Function
-       940(r037):     91(ptr) Variable Function
-       943(r038):     91(ptr) Variable Function
-       949(r039):     91(ptr) Variable Function
-       953(r040):    952(ptr) Variable Function
-       956(r041):    952(ptr) Variable Function
-       959(r042):     91(ptr) Variable Function
-      963(r039a):     91(ptr) Variable Function
-       968(r043):      7(ptr) Variable Function
-       971(r044):     91(ptr) Variable Function
-       974(r045):     91(ptr) Variable Function
-       978(r046):     91(ptr) Variable Function
-       981(r047):     91(ptr) Variable Function
-       985(r048):     91(ptr) Variable Function
-       989(r049):     91(ptr) Variable Function
-       992(r050):     91(ptr) Variable Function
-       996(r051):     91(ptr) Variable Function
-       999(r052):     91(ptr) Variable Function
-      1003(r053):     91(ptr) Variable Function
-      1007(r054):     91(ptr) Variable Function
-      1011(r055):    831(ptr) Variable Function
-      1014(r056):     91(ptr) Variable Function
-      1017(r057):     91(ptr) Variable Function
-      1020(r058):     91(ptr) Variable Function
-      1025(r059):     91(ptr) Variable Function
-      1028(r060):     91(ptr) Variable Function
-      1035(r061):     91(ptr) Variable Function
-      1038(r062):     91(ptr) Variable Function
-      1043(r063):     91(ptr) Variable Function
-      1046(r064):     91(ptr) Variable Function
-      1050(r065):     91(ptr) Variable Function
-      1053(r066):     91(ptr) Variable Function
-      1056(r067):     91(ptr) Variable Function
-             811:   64(fvec4) Load 810(inF0)
-             812:   121(bool) All 811
-                              Store 808(r000) 812
-             814:   64(fvec4) Load 810(inF0)
-             815:   64(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 814
-                              Store 813(r001) 815
-             817:   64(fvec4) Load 810(inF0)
-             818:   64(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 817
-                              Store 816(r002) 818
-             820:   64(fvec4) Load 810(inF0)
-             821:   121(bool) Any 820
-                              Store 819(r003) 821
-             823:   64(fvec4) Load 810(inF0)
-             824:   64(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 823
-                              Store 822(r004) 824
-             828:   64(fvec4) Load 810(inF0)
-             829:  825(ivec4) Bitcast 828
-                              Store 827(r005) 829
-             833:   64(fvec4) Load 810(inF0)
-             834:  830(ivec4) Bitcast 833
-                              Store 832(r006) 834
-             838:  830(ivec4) Load 837(inU0)
-             839:   64(fvec4) Bitcast 838
-                              Store 835(r007) 839
-             841:   64(fvec4) Load 810(inF0)
-             842:   64(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 841
-                              Store 840(r009) 842
-             844:   64(fvec4) Load 810(inF0)
-             846:   64(fvec4) Load 845(inF1)
-             847:   64(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 844 846
-                              Store 843(r010) 847
-             849:   64(fvec4) Load 810(inF0)
-             850:   64(fvec4) ExtInst 1(GLSL.std.450) 9(Ceil) 849
-                              Store 848(r011) 850
-             852:   64(fvec4) Load 810(inF0)
-             853:   64(fvec4) Load 845(inF1)
-             855:   64(fvec4) Load 854(inF2)
-             856:   64(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 852 853 855
-                              Store 851(r012) 856
-             857:   64(fvec4) Load 810(inF0)
-             860:  859(bvec4) FOrdLessThan 857 858
-             861:   121(bool) Any 860
-                              SelectionMerge 863 None
-                              BranchConditional 861 862 863
-             862:               Label
-                                Kill
-             863:             Label
-             866:   64(fvec4) Load 810(inF0)
-             867:   64(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 866
-                              Store 865(r013) 867
-             869:   64(fvec4) Load 810(inF0)
-             870:   64(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 869
-                              Store 868(r014) 870
-             873:  830(ivec4) BitCount 872
-                              Store 871(r015) 873
-             875:   64(fvec4) Load 810(inF0)
-             876:   64(fvec4) DPdx 875
-                              Store 874(r016) 876
-             878:   64(fvec4) Load 810(inF0)
-             879:   64(fvec4) DPdxCoarse 878
-                              Store 877(r017) 879
-             881:   64(fvec4) Load 810(inF0)
-             882:   64(fvec4) DPdxFine 881
-                              Store 880(r018) 882
-             884:   64(fvec4) Load 810(inF0)
-             885:   64(fvec4) DPdy 884
-                              Store 883(r019) 885
-             887:   64(fvec4) Load 810(inF0)
-             888:   64(fvec4) DPdyCoarse 887
-                              Store 886(r020) 888
-             890:   64(fvec4) Load 810(inF0)
-             891:   64(fvec4) DPdyFine 890
-                              Store 889(r021) 891
-             893:   64(fvec4) Load 810(inF0)
-             894:   64(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 893
-                              Store 892(r022) 894
-             896:   64(fvec4) Load 810(inF0)
-             897:   64(fvec4) Load 845(inF1)
-             898:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 896 897
-                              Store 895(r023) 898
-             900:   64(fvec4) Load 810(inF0)
-             901:   64(fvec4) Load 845(inF1)
-             902:    6(float) Dot 900 901
-                              Store 899(r024) 902
-             905:    904(ptr) AccessChain 810(inF0) 512
-             906:    6(float) Load 905
-             907:    904(ptr) AccessChain 845(inF1) 512
-             908:    6(float) Load 907
-             909:    6(float) FMul 906 908
-             910:    904(ptr) AccessChain 810(inF0) 278
-             911:    6(float) Load 910
-             912:    904(ptr) AccessChain 845(inF1) 383
-             913:    6(float) Load 912
-             914:   64(fvec4) CompositeConstruct 274 909 911 913
-                              Store 903(r025) 914
-             916:   64(fvec4) Load 810(inF0)
-             917:   64(fvec4) ExtInst 1(GLSL.std.450) 27(Exp) 916
-                              Store 915(r029) 917
-             919:   64(fvec4) Load 810(inF0)
-             920:   64(fvec4) ExtInst 1(GLSL.std.450) 29(Exp2) 919
-                              Store 918(r030) 920
-             922:   64(fvec4) Load 810(inF0)
-             923:   64(fvec4) Load 845(inF1)
-             924:   64(fvec4) Load 854(inF2)
-             925:   64(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 922 923 924
-                              Store 921(r031) 925
-             930:  830(ivec4) ExtInst 1(GLSL.std.450) 75(FindUMsb) 929
-                              Store 926(r032) 930
-             932:  830(ivec4) ExtInst 1(GLSL.std.450) 73(FindILsb) 929
-                              Store 931(r033) 932
-             934:   64(fvec4) Load 810(inF0)
-             935:   64(fvec4) ExtInst 1(GLSL.std.450) 8(Floor) 934
-                              Store 933(r034) 935
-             937:   64(fvec4) Load 810(inF0)
-             938:   64(fvec4) Load 845(inF1)
-             939:   64(fvec4) FMod 937 938
-                              Store 936(r036) 939
-             941:   64(fvec4) Load 810(inF0)
-             942:   64(fvec4) ExtInst 1(GLSL.std.450) 10(Fract) 941
-                              Store 940(r037) 942
-             944:   64(fvec4) Load 810(inF0)
-             946:945(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 944
-             947:  825(ivec4) CompositeExtract 946 1
-                              Store 845(inF1) 947
-             948:   64(fvec4) CompositeExtract 946 0
-                              Store 943(r038) 948
-             950:   64(fvec4) Load 810(inF0)
-             951:   64(fvec4) Fwidth 950
-                              Store 949(r039) 951
-             954:   64(fvec4) Load 810(inF0)
-             955:  859(bvec4) IsInf 954
-                              Store 953(r040) 955
-             957:   64(fvec4) Load 810(inF0)
-             958:  859(bvec4) IsNan 957
-                              Store 956(r041) 958
-             960:   64(fvec4) Load 810(inF0)
-             961:   64(fvec4) Load 845(inF1)
-             962:   64(fvec4) ExtInst 1(GLSL.std.450) 53(Ldexp) 960 961
-                              Store 959(r042) 962
-             964:   64(fvec4) Load 810(inF0)
-             965:   64(fvec4) Load 845(inF1)
-             966:   64(fvec4) Load 854(inF2)
-             967:   64(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 964 965 966
-                              Store 963(r039a) 967
-             969:   64(fvec4) Load 810(inF0)
-             970:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 969
-                              Store 968(r043) 970
-             972:   64(fvec4) Load 810(inF0)
-             973:   64(fvec4) ExtInst 1(GLSL.std.450) 28(Log) 972
-                              Store 971(r044) 973
-             975:   64(fvec4) Load 810(inF0)
-             976:   64(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 975
-             977:   64(fvec4) VectorTimesScalar 976 253
-                              Store 974(r045) 977
-             979:   64(fvec4) Load 810(inF0)
-             980:   64(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 979
-                              Store 978(r046) 980
-             982:   64(fvec4) Load 810(inF0)
-             983:   64(fvec4) Load 845(inF1)
-             984:   64(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 982 983
-                              Store 981(r047) 984
-             986:   64(fvec4) Load 810(inF0)
-             987:   64(fvec4) Load 845(inF1)
-             988:   64(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 986 987
-                              Store 985(r048) 988
-             990:   64(fvec4) Load 810(inF0)
-             991:   64(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 990
-                              Store 989(r049) 991
-             993:   64(fvec4) Load 810(inF0)
-             994:   64(fvec4) Load 845(inF1)
-             995:   64(fvec4) ExtInst 1(GLSL.std.450) 26(Pow) 993 994
-                              Store 992(r050) 995
-             997:   64(fvec4) Load 810(inF0)
-             998:   64(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 997
-                              Store 996(r051) 998
-            1000:   64(fvec4) Load 810(inF0)
-            1001:   64(fvec4) CompositeConstruct 274 274 274 274
-            1002:   64(fvec4) FDiv 1001 1000
-                              Store 999(r052) 1002
-            1004:   64(fvec4) Load 810(inF0)
-            1005:   64(fvec4) Load 845(inF1)
-            1006:   64(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 1004 1005
-                              Store 1003(r053) 1006
-            1008:   64(fvec4) Load 810(inF0)
-            1009:   64(fvec4) Load 845(inF1)
-            1010:   64(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 1008 1009 509
-                              Store 1007(r054) 1010
-            1013:  830(ivec4) BitReverse 1012
-                              Store 1011(r055) 1013
-            1015:   64(fvec4) Load 810(inF0)
-            1016:   64(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 1015
-                              Store 1014(r056) 1016
-            1018:   64(fvec4) Load 810(inF0)
-            1019:   64(fvec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1018
-                              Store 1017(r057) 1019
-            1021:   64(fvec4) Load 810(inF0)
-            1022:   64(fvec4) CompositeConstruct 165 165 165 165
-            1023:   64(fvec4) CompositeConstruct 274 274 274 274
-            1024:   64(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 1021 1022 1023
-                              Store 1020(r058) 1024
-            1026:   64(fvec4) Load 810(inF0)
-            1027:   64(fvec4) ExtInst 1(GLSL.std.450) 6(FSign) 1026
-                              Store 1025(r059) 1027
-            1029:   64(fvec4) Load 810(inF0)
-            1030:   64(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1029
-                              Store 1028(r060) 1030
-            1031:   64(fvec4) Load 810(inF0)
-            1032:   64(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1031
-                              Store 845(inF1) 1032
-            1033:   64(fvec4) Load 810(inF0)
-            1034:   64(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 1033
-                              Store 854(inF2) 1034
-            1036:   64(fvec4) Load 810(inF0)
-            1037:   64(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 1036
-                              Store 1035(r061) 1037
-            1039:   64(fvec4) Load 810(inF0)
-            1040:   64(fvec4) Load 845(inF1)
-            1041:   64(fvec4) Load 854(inF2)
-            1042:   64(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 1039 1040 1041
-                              Store 1038(r062) 1042
-            1044:   64(fvec4) Load 810(inF0)
-            1045:   64(fvec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 1044
-                              Store 1043(r063) 1045
-            1047:   64(fvec4) Load 810(inF0)
-            1048:   64(fvec4) Load 845(inF1)
-            1049:   64(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 1047 1048
-                              Store 1046(r064) 1049
-            1051:   64(fvec4) Load 810(inF0)
-            1052:   64(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 1051
-                              Store 1050(r065) 1052
-            1054:   64(fvec4) Load 810(inF0)
-            1055:   64(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 1054
-                              Store 1053(r066) 1055
-            1057:   64(fvec4) Load 810(inF0)
-            1058:   64(fvec4) ExtInst 1(GLSL.std.450) 3(Trunc) 1057
-                              Store 1056(r067) 1058
-                              ReturnValue 1060
+ 1800(ps_output):   1799(ptr) Variable Function
+            1803:     49(ptr) AccessChain 1800(ps_output) 1801
+                              Store 1803 1802
+            1806:     49(ptr) AccessChain 1800(ps_output) 1801
+            1807:   48(fvec4) Load 1806
+                              Store 1805(color) 1807
+                              Return
                               FunctionEnd
 16(PixelShaderFunctionS(f1;f1;f1;u1;u1;):    6(float) Function None 10
         11(inF0):      7(ptr) FunctionParameter
@@ -6525,266 +6283,266 @@
         14(inU0):      9(ptr) FunctionParameter
         15(inU1):      9(ptr) FunctionParameter
               17:             Label
-       123(r000):    122(ptr) Variable Function
-       126(r001):      7(ptr) Variable Function
-       129(r002):      7(ptr) Variable Function
-       132(r003):    122(ptr) Variable Function
-       135(r004):      7(ptr) Variable Function
-       140(r005):    139(ptr) Variable Function
-       143(r006):      9(ptr) Variable Function
-       146(r007):      7(ptr) Variable Function
-       149(r009):      7(ptr) Variable Function
-       152(r010):      7(ptr) Variable Function
-       156(r011):      7(ptr) Variable Function
-       159(r012):      7(ptr) Variable Function
-       170(r014):      7(ptr) Variable Function
-       173(r015):      7(ptr) Variable Function
-       176(r016):      9(ptr) Variable Function
-       179(r017):      7(ptr) Variable Function
-       182(r018):      7(ptr) Variable Function
-       185(r019):      7(ptr) Variable Function
-       188(r020):      7(ptr) Variable Function
-       191(r021):      7(ptr) Variable Function
-       194(r022):      7(ptr) Variable Function
-       197(r023):      7(ptr) Variable Function
-       200(r027):      7(ptr) Variable Function
-       203(r028):      7(ptr) Variable Function
-       206(r029):      9(ptr) Variable Function
-       210(r030):      9(ptr) Variable Function
-       213(r031):      7(ptr) Variable Function
-       216(r033):      7(ptr) Variable Function
-       220(r034):      7(ptr) Variable Function
-       223(r035):      7(ptr) Variable Function
-       229(r036):      7(ptr) Variable Function
-       232(r037):    122(ptr) Variable Function
-       235(r038):    122(ptr) Variable Function
-       238(r039):      7(ptr) Variable Function
-      242(r039a):      7(ptr) Variable Function
-       247(r040):      7(ptr) Variable Function
-       250(r041):      7(ptr) Variable Function
-       255(r042):      7(ptr) Variable Function
-       258(r043):      7(ptr) Variable Function
-       262(r044):      7(ptr) Variable Function
-       266(r045):      7(ptr) Variable Function
-       270(r046):      7(ptr) Variable Function
-       273(r047):      7(ptr) Variable Function
-       277(r048):      9(ptr) Variable Function
-       280(r049):      7(ptr) Variable Function
-       283(r050):      7(ptr) Variable Function
-       286(r051):      7(ptr) Variable Function
-       289(r052):      7(ptr) Variable Function
-       292(r053):      7(ptr) Variable Function
-       299(r055):      7(ptr) Variable Function
-       302(r056):      7(ptr) Variable Function
-       307(r057):      7(ptr) Variable Function
-       310(r058):      7(ptr) Variable Function
-       314(r059):      7(ptr) Variable Function
-       317(r060):      7(ptr) Variable Function
-       320(r061):      7(ptr) Variable Function
-             124:    6(float) Load 11(inF0)
-             125:   121(bool) All 124
-                              Store 123(r000) 125
-             127:    6(float) Load 11(inF0)
-             128:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 127
-                              Store 126(r001) 128
-             130:    6(float) Load 11(inF0)
-             131:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 130
-                              Store 129(r002) 131
-             133:    6(float) Load 11(inF0)
-             134:   121(bool) Any 133
-                              Store 132(r003) 134
-             136:    6(float) Load 11(inF0)
-             137:    6(float) ExtInst 1(GLSL.std.450) 16(Asin) 136
-                              Store 135(r004) 137
-             141:    6(float) Load 11(inF0)
-             142:    138(int) Bitcast 141
-                              Store 140(r005) 142
-             144:    6(float) Load 11(inF0)
-             145:      8(int) Bitcast 144
-                              Store 143(r006) 145
-             147:      8(int) Load 14(inU0)
-             148:    6(float) Bitcast 147
-                              Store 146(r007) 148
-             150:    6(float) Load 11(inF0)
-             151:    6(float) ExtInst 1(GLSL.std.450) 18(Atan) 150
-                              Store 149(r009) 151
-             153:    6(float) Load 11(inF0)
-             154:    6(float) Load 12(inF1)
-             155:    6(float) ExtInst 1(GLSL.std.450) 25(Atan2) 153 154
-                              Store 152(r010) 155
-             157:    6(float) Load 11(inF0)
-             158:    6(float) ExtInst 1(GLSL.std.450) 9(Ceil) 157
-                              Store 156(r011) 158
+       133(r000):    132(ptr) Variable Function
+       136(r001):      7(ptr) Variable Function
+       139(r002):      7(ptr) Variable Function
+       142(r003):    132(ptr) Variable Function
+       145(r004):      7(ptr) Variable Function
+       150(r005):    149(ptr) Variable Function
+       153(r006):      9(ptr) Variable Function
+       156(r007):      7(ptr) Variable Function
+       159(r009):      7(ptr) Variable Function
+       162(r010):      7(ptr) Variable Function
+       166(r011):      7(ptr) Variable Function
+       169(r012):      7(ptr) Variable Function
+       180(r014):      7(ptr) Variable Function
+       183(r015):      7(ptr) Variable Function
+       186(r016):      9(ptr) Variable Function
+       189(r017):      7(ptr) Variable Function
+       192(r018):      7(ptr) Variable Function
+       195(r019):      7(ptr) Variable Function
+       198(r020):      7(ptr) Variable Function
+       201(r021):      7(ptr) Variable Function
+       204(r022):      7(ptr) Variable Function
+       207(r023):      7(ptr) Variable Function
+       210(r027):      7(ptr) Variable Function
+       213(r028):      7(ptr) Variable Function
+       216(r029):      9(ptr) Variable Function
+       220(r030):      9(ptr) Variable Function
+       223(r031):      7(ptr) Variable Function
+       226(r033):      7(ptr) Variable Function
+       230(r034):      7(ptr) Variable Function
+       233(r035):      7(ptr) Variable Function
+       239(r036):      7(ptr) Variable Function
+       242(r037):    132(ptr) Variable Function
+       245(r038):    132(ptr) Variable Function
+       248(r039):      7(ptr) Variable Function
+      252(r039a):      7(ptr) Variable Function
+       257(r040):      7(ptr) Variable Function
+       260(r041):      7(ptr) Variable Function
+       265(r042):      7(ptr) Variable Function
+       268(r043):      7(ptr) Variable Function
+       272(r044):      7(ptr) Variable Function
+       276(r045):      7(ptr) Variable Function
+       280(r046):      7(ptr) Variable Function
+       283(r047):      7(ptr) Variable Function
+       287(r048):      9(ptr) Variable Function
+       290(r049):      7(ptr) Variable Function
+       293(r050):      7(ptr) Variable Function
+       296(r051):      7(ptr) Variable Function
+       299(r052):      7(ptr) Variable Function
+       302(r053):      7(ptr) Variable Function
+       309(r055):      7(ptr) Variable Function
+       312(r056):      7(ptr) Variable Function
+       317(r057):      7(ptr) Variable Function
+       320(r058):      7(ptr) Variable Function
+       324(r059):      7(ptr) Variable Function
+       327(r060):      7(ptr) Variable Function
+       330(r061):      7(ptr) Variable Function
+             134:    6(float) Load 11(inF0)
+             135:   131(bool) All 134
+                              Store 133(r000) 135
+             137:    6(float) Load 11(inF0)
+             138:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 137
+                              Store 136(r001) 138
+             140:    6(float) Load 11(inF0)
+             141:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 140
+                              Store 139(r002) 141
+             143:    6(float) Load 11(inF0)
+             144:   131(bool) Any 143
+                              Store 142(r003) 144
+             146:    6(float) Load 11(inF0)
+             147:    6(float) ExtInst 1(GLSL.std.450) 16(Asin) 146
+                              Store 145(r004) 147
+             151:    6(float) Load 11(inF0)
+             152:    148(int) Bitcast 151
+                              Store 150(r005) 152
+             154:    6(float) Load 11(inF0)
+             155:      8(int) Bitcast 154
+                              Store 153(r006) 155
+             157:      8(int) Load 14(inU0)
+             158:    6(float) Bitcast 157
+                              Store 156(r007) 158
              160:    6(float) Load 11(inF0)
-             161:    6(float) Load 12(inF1)
-             162:    6(float) Load 13(inF2)
-             163:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 160 161 162
-                              Store 159(r012) 163
-             164:    6(float) Load 11(inF0)
-             166:   121(bool) FOrdLessThan 164 165
-                              SelectionMerge 168 None
-                              BranchConditional 166 167 168
-             167:               Label
-                                Kill
-             168:             Label
-             171:    6(float) Load 11(inF0)
-             172:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 171
-                              Store 170(r014) 172
+             161:    6(float) ExtInst 1(GLSL.std.450) 18(Atan) 160
+                              Store 159(r009) 161
+             163:    6(float) Load 11(inF0)
+             164:    6(float) Load 12(inF1)
+             165:    6(float) ExtInst 1(GLSL.std.450) 25(Atan2) 163 164
+                              Store 162(r010) 165
+             167:    6(float) Load 11(inF0)
+             168:    6(float) ExtInst 1(GLSL.std.450) 9(Ceil) 167
+                              Store 166(r011) 168
+             170:    6(float) Load 11(inF0)
+             171:    6(float) Load 12(inF1)
+             172:    6(float) Load 13(inF2)
+             173:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 170 171 172
+                              Store 169(r012) 173
              174:    6(float) Load 11(inF0)
-             175:    6(float) ExtInst 1(GLSL.std.450) 20(Cosh) 174
-                              Store 173(r015) 175
-             178:      8(int) BitCount 177
-                              Store 176(r016) 178
-             180:    6(float) Load 11(inF0)
-             181:    6(float) DPdx 180
-                              Store 179(r017) 181
-             183:    6(float) Load 11(inF0)
-             184:    6(float) DPdxCoarse 183
-                              Store 182(r018) 184
-             186:    6(float) Load 11(inF0)
-             187:    6(float) DPdxFine 186
-                              Store 185(r019) 187
-             189:    6(float) Load 11(inF0)
-             190:    6(float) DPdy 189
-                              Store 188(r020) 190
-             192:    6(float) Load 11(inF0)
-             193:    6(float) DPdyCoarse 192
-                              Store 191(r021) 193
-             195:    6(float) Load 11(inF0)
-             196:    6(float) DPdyFine 195
-                              Store 194(r022) 196
-             198:    6(float) Load 11(inF0)
-             199:    6(float) ExtInst 1(GLSL.std.450) 12(Degrees) 198
-                              Store 197(r023) 199
-             201:    6(float) Load 11(inF0)
-             202:    6(float) ExtInst 1(GLSL.std.450) 27(Exp) 201
-                              Store 200(r027) 202
-             204:    6(float) Load 11(inF0)
-             205:    6(float) ExtInst 1(GLSL.std.450) 29(Exp2) 204
-                              Store 203(r028) 205
-             208:    138(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 207
-             209:      8(int) Bitcast 208
-                              Store 206(r029) 209
-             211:    138(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 207
-             212:      8(int) Bitcast 211
-                              Store 210(r030) 212
+             176:   131(bool) FOrdLessThan 174 175
+                              SelectionMerge 178 None
+                              BranchConditional 176 177 178
+             177:               Label
+                                Kill
+             178:             Label
+             181:    6(float) Load 11(inF0)
+             182:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 181
+                              Store 180(r014) 182
+             184:    6(float) Load 11(inF0)
+             185:    6(float) ExtInst 1(GLSL.std.450) 20(Cosh) 184
+                              Store 183(r015) 185
+             188:      8(int) BitCount 187
+                              Store 186(r016) 188
+             190:    6(float) Load 11(inF0)
+             191:    6(float) DPdx 190
+                              Store 189(r017) 191
+             193:    6(float) Load 11(inF0)
+             194:    6(float) DPdxCoarse 193
+                              Store 192(r018) 194
+             196:    6(float) Load 11(inF0)
+             197:    6(float) DPdxFine 196
+                              Store 195(r019) 197
+             199:    6(float) Load 11(inF0)
+             200:    6(float) DPdy 199
+                              Store 198(r020) 200
+             202:    6(float) Load 11(inF0)
+             203:    6(float) DPdyCoarse 202
+                              Store 201(r021) 203
+             205:    6(float) Load 11(inF0)
+             206:    6(float) DPdyFine 205
+                              Store 204(r022) 206
+             208:    6(float) Load 11(inF0)
+             209:    6(float) ExtInst 1(GLSL.std.450) 12(Degrees) 208
+                              Store 207(r023) 209
+             211:    6(float) Load 11(inF0)
+             212:    6(float) ExtInst 1(GLSL.std.450) 27(Exp) 211
+                              Store 210(r027) 212
              214:    6(float) Load 11(inF0)
-             215:    6(float) ExtInst 1(GLSL.std.450) 8(Floor) 214
-                              Store 213(r031) 215
-             217:    6(float) Load 11(inF0)
-             218:    6(float) Load 12(inF1)
-             219:    6(float) FMod 217 218
-                              Store 216(r033) 219
-             221:    6(float) Load 11(inF0)
-             222:    6(float) ExtInst 1(GLSL.std.450) 10(Fract) 221
-                              Store 220(r034) 222
+             215:    6(float) ExtInst 1(GLSL.std.450) 29(Exp2) 214
+                              Store 213(r028) 215
+             218:    148(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 217
+             219:      8(int) Bitcast 218
+                              Store 216(r029) 219
+             221:    148(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 217
+             222:      8(int) Bitcast 221
+                              Store 220(r030) 222
              224:    6(float) Load 11(inF0)
-             226:225(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 224
-             227:    138(int) CompositeExtract 226 1
-                              Store 12(inF1) 227
-             228:    6(float) CompositeExtract 226 0
-                              Store 223(r035) 228
-             230:    6(float) Load 11(inF0)
-             231:    6(float) Fwidth 230
-                              Store 229(r036) 231
-             233:    6(float) Load 11(inF0)
-             234:   121(bool) IsInf 233
-                              Store 232(r037) 234
-             236:    6(float) Load 11(inF0)
-             237:   121(bool) IsNan 236
-                              Store 235(r038) 237
-             239:    6(float) Load 11(inF0)
-             240:    6(float) Load 12(inF1)
-             241:    6(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 239 240
-                              Store 238(r039) 241
+             225:    6(float) ExtInst 1(GLSL.std.450) 8(Floor) 224
+                              Store 223(r031) 225
+             227:    6(float) Load 11(inF0)
+             228:    6(float) Load 12(inF1)
+             229:    6(float) FMod 227 228
+                              Store 226(r033) 229
+             231:    6(float) Load 11(inF0)
+             232:    6(float) ExtInst 1(GLSL.std.450) 10(Fract) 231
+                              Store 230(r034) 232
+             234:    6(float) Load 11(inF0)
+             236:235(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 234
+             237:    148(int) CompositeExtract 236 1
+                              Store 12(inF1) 237
+             238:    6(float) CompositeExtract 236 0
+                              Store 233(r035) 238
+             240:    6(float) Load 11(inF0)
+             241:    6(float) Fwidth 240
+                              Store 239(r036) 241
              243:    6(float) Load 11(inF0)
-             244:    6(float) Load 12(inF1)
-             245:    6(float) Load 13(inF2)
-             246:    6(float) ExtInst 1(GLSL.std.450) 46(FMix) 243 244 245
-                              Store 242(r039a) 246
-             248:    6(float) Load 11(inF0)
-             249:    6(float) ExtInst 1(GLSL.std.450) 28(Log) 248
-                              Store 247(r040) 249
-             251:    6(float) Load 11(inF0)
-             252:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 251
-             254:    6(float) FMul 252 253
-                              Store 250(r041) 254
-             256:    6(float) Load 11(inF0)
-             257:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 256
-                              Store 255(r042) 257
-             259:    6(float) Load 11(inF0)
-             260:    6(float) Load 12(inF1)
-             261:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 259 260
-                              Store 258(r043) 261
-             263:    6(float) Load 11(inF0)
-             264:    6(float) Load 12(inF1)
-             265:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 263 264
-                              Store 262(r044) 265
-             267:    6(float) Load 11(inF0)
-             268:    6(float) Load 12(inF1)
-             269:    6(float) ExtInst 1(GLSL.std.450) 26(Pow) 267 268
-                              Store 266(r045) 269
-             271:    6(float) Load 11(inF0)
-             272:    6(float) ExtInst 1(GLSL.std.450) 11(Radians) 271
-                              Store 270(r046) 272
-             275:    6(float) Load 11(inF0)
-             276:    6(float) FDiv 274 275
-                              Store 273(r047) 276
-             279:      8(int) BitReverse 278
-                              Store 277(r048) 279
+             244:   131(bool) IsInf 243
+                              Store 242(r037) 244
+             246:    6(float) Load 11(inF0)
+             247:   131(bool) IsNan 246
+                              Store 245(r038) 247
+             249:    6(float) Load 11(inF0)
+             250:    6(float) Load 12(inF1)
+             251:    6(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 249 250
+                              Store 248(r039) 251
+             253:    6(float) Load 11(inF0)
+             254:    6(float) Load 12(inF1)
+             255:    6(float) Load 13(inF2)
+             256:    6(float) ExtInst 1(GLSL.std.450) 46(FMix) 253 254 255
+                              Store 252(r039a) 256
+             258:    6(float) Load 11(inF0)
+             259:    6(float) ExtInst 1(GLSL.std.450) 28(Log) 258
+                              Store 257(r040) 259
+             261:    6(float) Load 11(inF0)
+             262:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 261
+             264:    6(float) FMul 262 263
+                              Store 260(r041) 264
+             266:    6(float) Load 11(inF0)
+             267:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 266
+                              Store 265(r042) 267
+             269:    6(float) Load 11(inF0)
+             270:    6(float) Load 12(inF1)
+             271:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 269 270
+                              Store 268(r043) 271
+             273:    6(float) Load 11(inF0)
+             274:    6(float) Load 12(inF1)
+             275:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 273 274
+                              Store 272(r044) 275
+             277:    6(float) Load 11(inF0)
+             278:    6(float) Load 12(inF1)
+             279:    6(float) ExtInst 1(GLSL.std.450) 26(Pow) 277 278
+                              Store 276(r045) 279
              281:    6(float) Load 11(inF0)
-             282:    6(float) ExtInst 1(GLSL.std.450) 2(RoundEven) 281
-                              Store 280(r049) 282
-             284:    6(float) Load 11(inF0)
-             285:    6(float) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 284
-                              Store 283(r050) 285
-             287:    6(float) Load 11(inF0)
-             288:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 287 165 274
-                              Store 286(r051) 288
-             290:    6(float) Load 11(inF0)
-             291:    6(float) ExtInst 1(GLSL.std.450) 6(FSign) 290
-                              Store 289(r052) 291
-             293:    6(float) Load 11(inF0)
-             294:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 293
-                              Store 292(r053) 294
-             295:    6(float) Load 11(inF0)
-             296:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 295
-                              Store 12(inF1) 296
+             282:    6(float) ExtInst 1(GLSL.std.450) 11(Radians) 281
+                              Store 280(r046) 282
+             285:    6(float) Load 11(inF0)
+             286:    6(float) FDiv 284 285
+                              Store 283(r047) 286
+             289:      8(int) BitReverse 288
+                              Store 287(r048) 289
+             291:    6(float) Load 11(inF0)
+             292:    6(float) ExtInst 1(GLSL.std.450) 2(RoundEven) 291
+                              Store 290(r049) 292
+             294:    6(float) Load 11(inF0)
+             295:    6(float) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 294
+                              Store 293(r050) 295
              297:    6(float) Load 11(inF0)
-             298:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 297
-                              Store 13(inF2) 298
+             298:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 297 175 284
+                              Store 296(r051) 298
              300:    6(float) Load 11(inF0)
-             301:    6(float) ExtInst 1(GLSL.std.450) 19(Sinh) 300
-                              Store 299(r055) 301
+             301:    6(float) ExtInst 1(GLSL.std.450) 6(FSign) 300
+                              Store 299(r052) 301
              303:    6(float) Load 11(inF0)
-             304:    6(float) Load 12(inF1)
-             305:    6(float) Load 13(inF2)
-             306:    6(float) ExtInst 1(GLSL.std.450) 49(SmoothStep) 303 304 305
-                              Store 302(r056) 306
-             308:    6(float) Load 11(inF0)
-             309:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 308
-                              Store 307(r057) 309
-             311:    6(float) Load 11(inF0)
-             312:    6(float) Load 12(inF1)
-             313:    6(float) ExtInst 1(GLSL.std.450) 48(Step) 311 312
-                              Store 310(r058) 313
-             315:    6(float) Load 11(inF0)
-             316:    6(float) ExtInst 1(GLSL.std.450) 15(Tan) 315
-                              Store 314(r059) 316
+             304:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 303
+                              Store 302(r053) 304
+             305:    6(float) Load 11(inF0)
+             306:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 305
+                              Store 12(inF1) 306
+             307:    6(float) Load 11(inF0)
+             308:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 307
+                              Store 13(inF2) 308
+             310:    6(float) Load 11(inF0)
+             311:    6(float) ExtInst 1(GLSL.std.450) 19(Sinh) 310
+                              Store 309(r055) 311
+             313:    6(float) Load 11(inF0)
+             314:    6(float) Load 12(inF1)
+             315:    6(float) Load 13(inF2)
+             316:    6(float) ExtInst 1(GLSL.std.450) 49(SmoothStep) 313 314 315
+                              Store 312(r056) 316
              318:    6(float) Load 11(inF0)
-             319:    6(float) ExtInst 1(GLSL.std.450) 21(Tanh) 318
-                              Store 317(r060) 319
+             319:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 318
+                              Store 317(r057) 319
              321:    6(float) Load 11(inF0)
-             322:    6(float) ExtInst 1(GLSL.std.450) 3(Trunc) 321
-                              Store 320(r061) 322
-                              ReturnValue 165
+             322:    6(float) Load 12(inF1)
+             323:    6(float) ExtInst 1(GLSL.std.450) 48(Step) 321 322
+                              Store 320(r058) 323
+             325:    6(float) Load 11(inF0)
+             326:    6(float) ExtInst 1(GLSL.std.450) 15(Tan) 325
+                              Store 324(r059) 326
+             328:    6(float) Load 11(inF0)
+             329:    6(float) ExtInst 1(GLSL.std.450) 21(Tanh) 328
+                              Store 327(r060) 329
+             331:    6(float) Load 11(inF0)
+             332:    6(float) ExtInst 1(GLSL.std.450) 3(Trunc) 331
+                              Store 330(r061) 332
+                              ReturnValue 175
                               FunctionEnd
 22(PixelShaderFunction1(vf1;vf1;vf1;):    6(float) Function None 18
         19(inF0):      7(ptr) FunctionParameter
         20(inF1):      7(ptr) FunctionParameter
         21(inF2):      7(ptr) FunctionParameter
               23:             Label
-                              ReturnValue 165
+                              ReturnValue 175
                               FunctionEnd
 34(PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2;):   24(fvec2) Function None 28
         29(inF0):     25(ptr) FunctionParameter
@@ -6793,295 +6551,295 @@
         32(inU0):     27(ptr) FunctionParameter
         33(inU1):     27(ptr) FunctionParameter
               35:             Label
-       327(r000):    122(ptr) Variable Function
-       330(r001):     25(ptr) Variable Function
-       333(r002):     25(ptr) Variable Function
-       336(r003):    122(ptr) Variable Function
-       339(r004):     25(ptr) Variable Function
-       344(r005):    343(ptr) Variable Function
-       347(r006):     27(ptr) Variable Function
-       350(r007):     25(ptr) Variable Function
-       353(r009):     25(ptr) Variable Function
-       356(r010):     25(ptr) Variable Function
-       360(r011):     25(ptr) Variable Function
-       363(r012):     25(ptr) Variable Function
-       376(r013):     25(ptr) Variable Function
-       379(r015):     25(ptr) Variable Function
-       382(r016):     27(ptr) Variable Function
-       386(r017):     25(ptr) Variable Function
-       389(r018):     25(ptr) Variable Function
-       392(r019):     25(ptr) Variable Function
-       395(r020):     25(ptr) Variable Function
-       398(r021):     25(ptr) Variable Function
-       401(r022):     25(ptr) Variable Function
-       404(r023):     25(ptr) Variable Function
-       407(r026):      7(ptr) Variable Function
-       411(r027):      7(ptr) Variable Function
-       415(r028):     25(ptr) Variable Function
-       418(r029):     25(ptr) Variable Function
-       421(r030):     25(ptr) Variable Function
-       426(r031):     27(ptr) Variable Function
-       430(r032):     27(ptr) Variable Function
-       432(r033):     25(ptr) Variable Function
-       435(r035):     25(ptr) Variable Function
-       439(r036):     25(ptr) Variable Function
-       442(r037):     25(ptr) Variable Function
-       448(r038):     25(ptr) Variable Function
-       452(r039):    451(ptr) Variable Function
-       455(r040):    451(ptr) Variable Function
-       458(r041):     25(ptr) Variable Function
-      462(r039a):     25(ptr) Variable Function
-       467(r042):      7(ptr) Variable Function
-       470(r043):     25(ptr) Variable Function
-       473(r044):     25(ptr) Variable Function
-       477(r045):     25(ptr) Variable Function
-       480(r046):     25(ptr) Variable Function
-       484(r047):     25(ptr) Variable Function
-       488(r048):     25(ptr) Variable Function
-       491(r049):     25(ptr) Variable Function
-       495(r050):     25(ptr) Variable Function
-       498(r051):     25(ptr) Variable Function
-       502(r052):     25(ptr) Variable Function
-       506(r053):     25(ptr) Variable Function
-       511(r054):     27(ptr) Variable Function
-       515(r055):     25(ptr) Variable Function
-       518(r056):     25(ptr) Variable Function
-       521(r057):     25(ptr) Variable Function
-       526(r058):     25(ptr) Variable Function
-       529(r059):     25(ptr) Variable Function
-       536(r060):     25(ptr) Variable Function
-       539(r061):     25(ptr) Variable Function
-       544(r062):     25(ptr) Variable Function
-       547(r063):     25(ptr) Variable Function
-       551(r064):     25(ptr) Variable Function
-       554(r065):     25(ptr) Variable Function
-       557(r066):     25(ptr) Variable Function
-             328:   24(fvec2) Load 29(inF0)
-             329:   121(bool) All 328
-                              Store 327(r000) 329
-             331:   24(fvec2) Load 29(inF0)
-             332:   24(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 331
-                              Store 330(r001) 332
-             334:   24(fvec2) Load 29(inF0)
-             335:   24(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 334
-                              Store 333(r002) 335
-             337:   24(fvec2) Load 29(inF0)
-             338:   121(bool) Any 337
-                              Store 336(r003) 338
-             340:   24(fvec2) Load 29(inF0)
-             341:   24(fvec2) ExtInst 1(GLSL.std.450) 16(Asin) 340
-                              Store 339(r004) 341
-             345:   24(fvec2) Load 29(inF0)
-             346:  342(ivec2) Bitcast 345
-                              Store 344(r005) 346
-             348:   24(fvec2) Load 29(inF0)
-             349:   26(ivec2) Bitcast 348
-                              Store 347(r006) 349
-             351:   26(ivec2) Load 32(inU0)
-             352:   24(fvec2) Bitcast 351
-                              Store 350(r007) 352
-             354:   24(fvec2) Load 29(inF0)
-             355:   24(fvec2) ExtInst 1(GLSL.std.450) 18(Atan) 354
-                              Store 353(r009) 355
-             357:   24(fvec2) Load 29(inF0)
-             358:   24(fvec2) Load 30(inF1)
-             359:   24(fvec2) ExtInst 1(GLSL.std.450) 25(Atan2) 357 358
-                              Store 356(r010) 359
-             361:   24(fvec2) Load 29(inF0)
-             362:   24(fvec2) ExtInst 1(GLSL.std.450) 9(Ceil) 361
-                              Store 360(r011) 362
+       337(r000):    132(ptr) Variable Function
+       340(r001):     25(ptr) Variable Function
+       343(r002):     25(ptr) Variable Function
+       346(r003):    132(ptr) Variable Function
+       349(r004):     25(ptr) Variable Function
+       354(r005):    353(ptr) Variable Function
+       357(r006):     27(ptr) Variable Function
+       360(r007):     25(ptr) Variable Function
+       363(r009):     25(ptr) Variable Function
+       366(r010):     25(ptr) Variable Function
+       370(r011):     25(ptr) Variable Function
+       373(r012):     25(ptr) Variable Function
+       386(r013):     25(ptr) Variable Function
+       389(r015):     25(ptr) Variable Function
+       392(r016):     27(ptr) Variable Function
+       396(r017):     25(ptr) Variable Function
+       399(r018):     25(ptr) Variable Function
+       402(r019):     25(ptr) Variable Function
+       405(r020):     25(ptr) Variable Function
+       408(r021):     25(ptr) Variable Function
+       411(r022):     25(ptr) Variable Function
+       414(r023):     25(ptr) Variable Function
+       417(r026):      7(ptr) Variable Function
+       421(r027):      7(ptr) Variable Function
+       425(r028):     25(ptr) Variable Function
+       428(r029):     25(ptr) Variable Function
+       431(r030):     25(ptr) Variable Function
+       436(r031):     27(ptr) Variable Function
+       440(r032):     27(ptr) Variable Function
+       442(r033):     25(ptr) Variable Function
+       445(r035):     25(ptr) Variable Function
+       449(r036):     25(ptr) Variable Function
+       452(r037):     25(ptr) Variable Function
+       458(r038):     25(ptr) Variable Function
+       462(r039):    461(ptr) Variable Function
+       465(r040):    461(ptr) Variable Function
+       468(r041):     25(ptr) Variable Function
+      472(r039a):     25(ptr) Variable Function
+       477(r042):      7(ptr) Variable Function
+       480(r043):     25(ptr) Variable Function
+       483(r044):     25(ptr) Variable Function
+       487(r045):     25(ptr) Variable Function
+       490(r046):     25(ptr) Variable Function
+       494(r047):     25(ptr) Variable Function
+       498(r048):     25(ptr) Variable Function
+       501(r049):     25(ptr) Variable Function
+       505(r050):     25(ptr) Variable Function
+       508(r051):     25(ptr) Variable Function
+       512(r052):     25(ptr) Variable Function
+       516(r053):     25(ptr) Variable Function
+       521(r054):     27(ptr) Variable Function
+       525(r055):     25(ptr) Variable Function
+       528(r056):     25(ptr) Variable Function
+       531(r057):     25(ptr) Variable Function
+       536(r058):     25(ptr) Variable Function
+       539(r059):     25(ptr) Variable Function
+       546(r060):     25(ptr) Variable Function
+       549(r061):     25(ptr) Variable Function
+       554(r062):     25(ptr) Variable Function
+       557(r063):     25(ptr) Variable Function
+       561(r064):     25(ptr) Variable Function
+       564(r065):     25(ptr) Variable Function
+       567(r066):     25(ptr) Variable Function
+             338:   24(fvec2) Load 29(inF0)
+             339:   131(bool) All 338
+                              Store 337(r000) 339
+             341:   24(fvec2) Load 29(inF0)
+             342:   24(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 341
+                              Store 340(r001) 342
+             344:   24(fvec2) Load 29(inF0)
+             345:   24(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 344
+                              Store 343(r002) 345
+             347:   24(fvec2) Load 29(inF0)
+             348:   131(bool) Any 347
+                              Store 346(r003) 348
+             350:   24(fvec2) Load 29(inF0)
+             351:   24(fvec2) ExtInst 1(GLSL.std.450) 16(Asin) 350
+                              Store 349(r004) 351
+             355:   24(fvec2) Load 29(inF0)
+             356:  352(ivec2) Bitcast 355
+                              Store 354(r005) 356
+             358:   24(fvec2) Load 29(inF0)
+             359:   26(ivec2) Bitcast 358
+                              Store 357(r006) 359
+             361:   26(ivec2) Load 32(inU0)
+             362:   24(fvec2) Bitcast 361
+                              Store 360(r007) 362
              364:   24(fvec2) Load 29(inF0)
-             365:   24(fvec2) Load 30(inF1)
-             366:   24(fvec2) Load 31(inF2)
-             367:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 364 365 366
-                              Store 363(r012) 367
-             368:   24(fvec2) Load 29(inF0)
-             371:  370(bvec2) FOrdLessThan 368 369
-             372:   121(bool) Any 371
-                              SelectionMerge 374 None
-                              BranchConditional 372 373 374
-             373:               Label
+             365:   24(fvec2) ExtInst 1(GLSL.std.450) 18(Atan) 364
+                              Store 363(r009) 365
+             367:   24(fvec2) Load 29(inF0)
+             368:   24(fvec2) Load 30(inF1)
+             369:   24(fvec2) ExtInst 1(GLSL.std.450) 25(Atan2) 367 368
+                              Store 366(r010) 369
+             371:   24(fvec2) Load 29(inF0)
+             372:   24(fvec2) ExtInst 1(GLSL.std.450) 9(Ceil) 371
+                              Store 370(r011) 372
+             374:   24(fvec2) Load 29(inF0)
+             375:   24(fvec2) Load 30(inF1)
+             376:   24(fvec2) Load 31(inF2)
+             377:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 374 375 376
+                              Store 373(r012) 377
+             378:   24(fvec2) Load 29(inF0)
+             381:  380(bvec2) FOrdLessThan 378 379
+             382:   131(bool) Any 381
+                              SelectionMerge 384 None
+                              BranchConditional 382 383 384
+             383:               Label
                                 Kill
-             374:             Label
-             377:   24(fvec2) Load 29(inF0)
-             378:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 377
-                              Store 376(r013) 378
-             380:   24(fvec2) Load 29(inF0)
-             381:   24(fvec2) ExtInst 1(GLSL.std.450) 20(Cosh) 380
-                              Store 379(r015) 381
-             385:   26(ivec2) BitCount 384
-                              Store 382(r016) 385
+             384:             Label
              387:   24(fvec2) Load 29(inF0)
-             388:   24(fvec2) DPdx 387
-                              Store 386(r017) 388
+             388:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 387
+                              Store 386(r013) 388
              390:   24(fvec2) Load 29(inF0)
-             391:   24(fvec2) DPdxCoarse 390
-                              Store 389(r018) 391
-             393:   24(fvec2) Load 29(inF0)
-             394:   24(fvec2) DPdxFine 393
-                              Store 392(r019) 394
-             396:   24(fvec2) Load 29(inF0)
-             397:   24(fvec2) DPdy 396
-                              Store 395(r020) 397
-             399:   24(fvec2) Load 29(inF0)
-             400:   24(fvec2) DPdyCoarse 399
-                              Store 398(r021) 400
-             402:   24(fvec2) Load 29(inF0)
-             403:   24(fvec2) DPdyFine 402
-                              Store 401(r022) 403
-             405:   24(fvec2) Load 29(inF0)
-             406:   24(fvec2) ExtInst 1(GLSL.std.450) 12(Degrees) 405
-                              Store 404(r023) 406
-             408:   24(fvec2) Load 29(inF0)
-             409:   24(fvec2) Load 30(inF1)
-             410:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 408 409
-                              Store 407(r026) 410
+             391:   24(fvec2) ExtInst 1(GLSL.std.450) 20(Cosh) 390
+                              Store 389(r015) 391
+             395:   26(ivec2) BitCount 394
+                              Store 392(r016) 395
+             397:   24(fvec2) Load 29(inF0)
+             398:   24(fvec2) DPdx 397
+                              Store 396(r017) 398
+             400:   24(fvec2) Load 29(inF0)
+             401:   24(fvec2) DPdxCoarse 400
+                              Store 399(r018) 401
+             403:   24(fvec2) Load 29(inF0)
+             404:   24(fvec2) DPdxFine 403
+                              Store 402(r019) 404
+             406:   24(fvec2) Load 29(inF0)
+             407:   24(fvec2) DPdy 406
+                              Store 405(r020) 407
+             409:   24(fvec2) Load 29(inF0)
+             410:   24(fvec2) DPdyCoarse 409
+                              Store 408(r021) 410
              412:   24(fvec2) Load 29(inF0)
-             413:   24(fvec2) Load 30(inF1)
-             414:    6(float) Dot 412 413
-                              Store 411(r027) 414
-             416:   24(fvec2) Load 29(inF0)
-             417:   24(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 416
-                              Store 415(r028) 417
-             419:   24(fvec2) Load 29(inF0)
-             420:   24(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 419
-                              Store 418(r029) 420
+             413:   24(fvec2) DPdyFine 412
+                              Store 411(r022) 413
+             415:   24(fvec2) Load 29(inF0)
+             416:   24(fvec2) ExtInst 1(GLSL.std.450) 12(Degrees) 415
+                              Store 414(r023) 416
+             418:   24(fvec2) Load 29(inF0)
+             419:   24(fvec2) Load 30(inF1)
+             420:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 418 419
+                              Store 417(r026) 420
              422:   24(fvec2) Load 29(inF0)
              423:   24(fvec2) Load 30(inF1)
-             424:   24(fvec2) Load 31(inF2)
-             425:   24(fvec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 422 423 424
-                              Store 421(r030) 425
-             429:   26(ivec2) ExtInst 1(GLSL.std.450) 75(FindUMsb) 428
-                              Store 426(r031) 429
-             431:   26(ivec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 428
-                              Store 430(r032) 431
-             433:   24(fvec2) Load 29(inF0)
-             434:   24(fvec2) ExtInst 1(GLSL.std.450) 8(Floor) 433
-                              Store 432(r033) 434
-             436:   24(fvec2) Load 29(inF0)
-             437:   24(fvec2) Load 30(inF1)
-             438:   24(fvec2) FMod 436 437
-                              Store 435(r035) 438
-             440:   24(fvec2) Load 29(inF0)
-             441:   24(fvec2) ExtInst 1(GLSL.std.450) 10(Fract) 440
-                              Store 439(r036) 441
+             424:    6(float) Dot 422 423
+                              Store 421(r027) 424
+             426:   24(fvec2) Load 29(inF0)
+             427:   24(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 426
+                              Store 425(r028) 427
+             429:   24(fvec2) Load 29(inF0)
+             430:   24(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 429
+                              Store 428(r029) 430
+             432:   24(fvec2) Load 29(inF0)
+             433:   24(fvec2) Load 30(inF1)
+             434:   24(fvec2) Load 31(inF2)
+             435:   24(fvec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 432 433 434
+                              Store 431(r030) 435
+             439:   26(ivec2) ExtInst 1(GLSL.std.450) 75(FindUMsb) 438
+                              Store 436(r031) 439
+             441:   26(ivec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 438
+                              Store 440(r032) 441
              443:   24(fvec2) Load 29(inF0)
-             445:444(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 443
-             446:  342(ivec2) CompositeExtract 445 1
-                              Store 30(inF1) 446
-             447:   24(fvec2) CompositeExtract 445 0
-                              Store 442(r037) 447
-             449:   24(fvec2) Load 29(inF0)
-             450:   24(fvec2) Fwidth 449
-                              Store 448(r038) 450
+             444:   24(fvec2) ExtInst 1(GLSL.std.450) 8(Floor) 443
+                              Store 442(r033) 444
+             446:   24(fvec2) Load 29(inF0)
+             447:   24(fvec2) Load 30(inF1)
+             448:   24(fvec2) FMod 446 447
+                              Store 445(r035) 448
+             450:   24(fvec2) Load 29(inF0)
+             451:   24(fvec2) ExtInst 1(GLSL.std.450) 10(Fract) 450
+                              Store 449(r036) 451
              453:   24(fvec2) Load 29(inF0)
-             454:  370(bvec2) IsInf 453
-                              Store 452(r039) 454
-             456:   24(fvec2) Load 29(inF0)
-             457:  370(bvec2) IsNan 456
-                              Store 455(r040) 457
+             455:454(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 453
+             456:  352(ivec2) CompositeExtract 455 1
+                              Store 30(inF1) 456
+             457:   24(fvec2) CompositeExtract 455 0
+                              Store 452(r037) 457
              459:   24(fvec2) Load 29(inF0)
-             460:   24(fvec2) Load 30(inF1)
-             461:   24(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 459 460
-                              Store 458(r041) 461
+             460:   24(fvec2) Fwidth 459
+                              Store 458(r038) 460
              463:   24(fvec2) Load 29(inF0)
-             464:   24(fvec2) Load 30(inF1)
-             465:   24(fvec2) Load 31(inF2)
-             466:   24(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 463 464 465
-                              Store 462(r039a) 466
-             468:   24(fvec2) Load 29(inF0)
-             469:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 468
-                              Store 467(r042) 469
-             471:   24(fvec2) Load 29(inF0)
-             472:   24(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 471
-                              Store 470(r043) 472
-             474:   24(fvec2) Load 29(inF0)
-             475:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 474
-             476:   24(fvec2) VectorTimesScalar 475 253
-                              Store 473(r044) 476
+             464:  380(bvec2) IsInf 463
+                              Store 462(r039) 464
+             466:   24(fvec2) Load 29(inF0)
+             467:  380(bvec2) IsNan 466
+                              Store 465(r040) 467
+             469:   24(fvec2) Load 29(inF0)
+             470:   24(fvec2) Load 30(inF1)
+             471:   24(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 469 470
+                              Store 468(r041) 471
+             473:   24(fvec2) Load 29(inF0)
+             474:   24(fvec2) Load 30(inF1)
+             475:   24(fvec2) Load 31(inF2)
+             476:   24(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 473 474 475
+                              Store 472(r039a) 476
              478:   24(fvec2) Load 29(inF0)
-             479:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 478
-                              Store 477(r045) 479
+             479:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 478
+                              Store 477(r042) 479
              481:   24(fvec2) Load 29(inF0)
-             482:   24(fvec2) Load 30(inF1)
-             483:   24(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 481 482
-                              Store 480(r046) 483
-             485:   24(fvec2) Load 29(inF0)
-             486:   24(fvec2) Load 30(inF1)
-             487:   24(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 485 486
-                              Store 484(r047) 487
-             489:   24(fvec2) Load 29(inF0)
-             490:   24(fvec2) ExtInst 1(GLSL.std.450) 69(Normalize) 489
-                              Store 488(r048) 490
-             492:   24(fvec2) Load 29(inF0)
-             493:   24(fvec2) Load 30(inF1)
-             494:   24(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 492 493
-                              Store 491(r049) 494
-             496:   24(fvec2) Load 29(inF0)
-             497:   24(fvec2) ExtInst 1(GLSL.std.450) 11(Radians) 496
-                              Store 495(r050) 497
+             482:   24(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 481
+                              Store 480(r043) 482
+             484:   24(fvec2) Load 29(inF0)
+             485:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 484
+             486:   24(fvec2) VectorTimesScalar 485 263
+                              Store 483(r044) 486
+             488:   24(fvec2) Load 29(inF0)
+             489:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 488
+                              Store 487(r045) 489
+             491:   24(fvec2) Load 29(inF0)
+             492:   24(fvec2) Load 30(inF1)
+             493:   24(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 491 492
+                              Store 490(r046) 493
+             495:   24(fvec2) Load 29(inF0)
+             496:   24(fvec2) Load 30(inF1)
+             497:   24(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 495 496
+                              Store 494(r047) 497
              499:   24(fvec2) Load 29(inF0)
-             500:   24(fvec2) CompositeConstruct 274 274
-             501:   24(fvec2) FDiv 500 499
-                              Store 498(r051) 501
-             503:   24(fvec2) Load 29(inF0)
-             504:   24(fvec2) Load 30(inF1)
-             505:   24(fvec2) ExtInst 1(GLSL.std.450) 71(Reflect) 503 504
-                              Store 502(r052) 505
-             507:   24(fvec2) Load 29(inF0)
-             508:   24(fvec2) Load 30(inF1)
-             510:   24(fvec2) ExtInst 1(GLSL.std.450) 72(Refract) 507 508 509
-                              Store 506(r053) 510
-             514:   26(ivec2) BitReverse 513
-                              Store 511(r054) 514
-             516:   24(fvec2) Load 29(inF0)
-             517:   24(fvec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 516
-                              Store 515(r055) 517
-             519:   24(fvec2) Load 29(inF0)
-             520:   24(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 519
-                              Store 518(r056) 520
-             522:   24(fvec2) Load 29(inF0)
-             523:   24(fvec2) CompositeConstruct 165 165
-             524:   24(fvec2) CompositeConstruct 274 274
-             525:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 522 523 524
-                              Store 521(r057) 525
-             527:   24(fvec2) Load 29(inF0)
-             528:   24(fvec2) ExtInst 1(GLSL.std.450) 6(FSign) 527
-                              Store 526(r058) 528
-             530:   24(fvec2) Load 29(inF0)
-             531:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 530
-                              Store 529(r059) 531
+             500:   24(fvec2) ExtInst 1(GLSL.std.450) 69(Normalize) 499
+                              Store 498(r048) 500
+             502:   24(fvec2) Load 29(inF0)
+             503:   24(fvec2) Load 30(inF1)
+             504:   24(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 502 503
+                              Store 501(r049) 504
+             506:   24(fvec2) Load 29(inF0)
+             507:   24(fvec2) ExtInst 1(GLSL.std.450) 11(Radians) 506
+                              Store 505(r050) 507
+             509:   24(fvec2) Load 29(inF0)
+             510:   24(fvec2) CompositeConstruct 284 284
+             511:   24(fvec2) FDiv 510 509
+                              Store 508(r051) 511
+             513:   24(fvec2) Load 29(inF0)
+             514:   24(fvec2) Load 30(inF1)
+             515:   24(fvec2) ExtInst 1(GLSL.std.450) 71(Reflect) 513 514
+                              Store 512(r052) 515
+             517:   24(fvec2) Load 29(inF0)
+             518:   24(fvec2) Load 30(inF1)
+             520:   24(fvec2) ExtInst 1(GLSL.std.450) 72(Refract) 517 518 519
+                              Store 516(r053) 520
+             524:   26(ivec2) BitReverse 523
+                              Store 521(r054) 524
+             526:   24(fvec2) Load 29(inF0)
+             527:   24(fvec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 526
+                              Store 525(r055) 527
+             529:   24(fvec2) Load 29(inF0)
+             530:   24(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 529
+                              Store 528(r056) 530
              532:   24(fvec2) Load 29(inF0)
-             533:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 532
-                              Store 30(inF1) 533
-             534:   24(fvec2) Load 29(inF0)
-             535:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 534
-                              Store 31(inF2) 535
+             533:   24(fvec2) CompositeConstruct 175 175
+             534:   24(fvec2) CompositeConstruct 284 284
+             535:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 532 533 534
+                              Store 531(r057) 535
              537:   24(fvec2) Load 29(inF0)
-             538:   24(fvec2) ExtInst 1(GLSL.std.450) 19(Sinh) 537
-                              Store 536(r060) 538
+             538:   24(fvec2) ExtInst 1(GLSL.std.450) 6(FSign) 537
+                              Store 536(r058) 538
              540:   24(fvec2) Load 29(inF0)
-             541:   24(fvec2) Load 30(inF1)
-             542:   24(fvec2) Load 31(inF2)
-             543:   24(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 540 541 542
-                              Store 539(r061) 543
-             545:   24(fvec2) Load 29(inF0)
-             546:   24(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 545
-                              Store 544(r062) 546
-             548:   24(fvec2) Load 29(inF0)
-             549:   24(fvec2) Load 30(inF1)
-             550:   24(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 548 549
-                              Store 547(r063) 550
-             552:   24(fvec2) Load 29(inF0)
-             553:   24(fvec2) ExtInst 1(GLSL.std.450) 15(Tan) 552
-                              Store 551(r064) 553
+             541:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 540
+                              Store 539(r059) 541
+             542:   24(fvec2) Load 29(inF0)
+             543:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 542
+                              Store 30(inF1) 543
+             544:   24(fvec2) Load 29(inF0)
+             545:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 544
+                              Store 31(inF2) 545
+             547:   24(fvec2) Load 29(inF0)
+             548:   24(fvec2) ExtInst 1(GLSL.std.450) 19(Sinh) 547
+                              Store 546(r060) 548
+             550:   24(fvec2) Load 29(inF0)
+             551:   24(fvec2) Load 30(inF1)
+             552:   24(fvec2) Load 31(inF2)
+             553:   24(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 550 551 552
+                              Store 549(r061) 553
              555:   24(fvec2) Load 29(inF0)
-             556:   24(fvec2) ExtInst 1(GLSL.std.450) 21(Tanh) 555
-                              Store 554(r065) 556
+             556:   24(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 555
+                              Store 554(r062) 556
              558:   24(fvec2) Load 29(inF0)
-             559:   24(fvec2) ExtInst 1(GLSL.std.450) 3(Trunc) 558
-                              Store 557(r066) 559
-                              ReturnValue 560
+             559:   24(fvec2) Load 30(inF1)
+             560:   24(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 558 559
+                              Store 557(r063) 560
+             562:   24(fvec2) Load 29(inF0)
+             563:   24(fvec2) ExtInst 1(GLSL.std.450) 15(Tan) 562
+                              Store 561(r064) 563
+             565:   24(fvec2) Load 29(inF0)
+             566:   24(fvec2) ExtInst 1(GLSL.std.450) 21(Tanh) 565
+                              Store 564(r065) 566
+             568:   24(fvec2) Load 29(inF0)
+             569:   24(fvec2) ExtInst 1(GLSL.std.450) 3(Trunc) 568
+                              Store 567(r066) 569
+                              ReturnValue 570
                               FunctionEnd
 46(PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3;):   36(fvec3) Function None 40
         41(inF0):     37(ptr) FunctionParameter
@@ -7090,1278 +6848,1587 @@
         44(inU0):     39(ptr) FunctionParameter
         45(inU1):     39(ptr) FunctionParameter
               47:             Label
-       563(r000):    122(ptr) Variable Function
-       566(r001):     37(ptr) Variable Function
-       569(r002):     37(ptr) Variable Function
-       572(r003):    122(ptr) Variable Function
-       575(r004):     37(ptr) Variable Function
-       580(r005):    579(ptr) Variable Function
-       583(r006):     39(ptr) Variable Function
-       586(r007):     37(ptr) Variable Function
-       589(r009):     37(ptr) Variable Function
-       592(r010):     37(ptr) Variable Function
-       596(r011):     37(ptr) Variable Function
-       599(r012):     37(ptr) Variable Function
-       612(r013):     37(ptr) Variable Function
-       615(r014):     37(ptr) Variable Function
-       618(r015):     39(ptr) Variable Function
-       622(r016):     37(ptr) Variable Function
-       626(r017):     37(ptr) Variable Function
-       629(r018):     37(ptr) Variable Function
-       632(r019):     37(ptr) Variable Function
-       635(r020):     37(ptr) Variable Function
-       638(r021):     37(ptr) Variable Function
-       641(r022):     37(ptr) Variable Function
-       644(r023):     37(ptr) Variable Function
-       647(r024):      7(ptr) Variable Function
-       651(r025):      7(ptr) Variable Function
-       655(r029):     37(ptr) Variable Function
-       658(r030):     37(ptr) Variable Function
-       661(r031):     37(ptr) Variable Function
-       666(r032):     39(ptr) Variable Function
-       670(r033):     39(ptr) Variable Function
-       672(r034):     37(ptr) Variable Function
-       675(r036):     37(ptr) Variable Function
-       679(r037):     37(ptr) Variable Function
-       682(r038):     37(ptr) Variable Function
-       688(r039):     37(ptr) Variable Function
-       692(r040):    691(ptr) Variable Function
-       695(r041):    691(ptr) Variable Function
-       698(r042):     37(ptr) Variable Function
-      702(r039a):     37(ptr) Variable Function
-      707(r039b):     37(ptr) Variable Function
-       713(r043):      7(ptr) Variable Function
-       716(r044):     37(ptr) Variable Function
-       719(r045):     37(ptr) Variable Function
-       723(r046):     37(ptr) Variable Function
-       726(r047):     37(ptr) Variable Function
-       730(r048):     37(ptr) Variable Function
-       734(r049):     37(ptr) Variable Function
-       737(r050):     37(ptr) Variable Function
-       741(r051):     37(ptr) Variable Function
-       744(r052):     37(ptr) Variable Function
-       748(r053):     37(ptr) Variable Function
-       752(r054):     37(ptr) Variable Function
-       756(r055):     39(ptr) Variable Function
-       759(r056):     37(ptr) Variable Function
-       762(r057):     37(ptr) Variable Function
-       765(r058):     37(ptr) Variable Function
-       770(r059):     37(ptr) Variable Function
-       773(r060):     37(ptr) Variable Function
-       780(r061):     37(ptr) Variable Function
-       783(r062):     37(ptr) Variable Function
-       788(r063):     37(ptr) Variable Function
-       791(r064):     37(ptr) Variable Function
-       795(r065):     37(ptr) Variable Function
-       798(r066):     37(ptr) Variable Function
-       801(r067):     37(ptr) Variable Function
-             564:   36(fvec3) Load 41(inF0)
-             565:   121(bool) All 564
-                              Store 563(r000) 565
-             567:   36(fvec3) Load 41(inF0)
-             568:   36(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 567
-                              Store 566(r001) 568
-             570:   36(fvec3) Load 41(inF0)
-             571:   36(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 570
-                              Store 569(r002) 571
-             573:   36(fvec3) Load 41(inF0)
-             574:   121(bool) Any 573
-                              Store 572(r003) 574
-             576:   36(fvec3) Load 41(inF0)
-             577:   36(fvec3) ExtInst 1(GLSL.std.450) 16(Asin) 576
-                              Store 575(r004) 577
-             581:   36(fvec3) Load 41(inF0)
-             582:  578(ivec3) Bitcast 581
-                              Store 580(r005) 582
-             584:   36(fvec3) Load 41(inF0)
-             585:   38(ivec3) Bitcast 584
-                              Store 583(r006) 585
-             587:   38(ivec3) Load 44(inU0)
-             588:   36(fvec3) Bitcast 587
-                              Store 586(r007) 588
-             590:   36(fvec3) Load 41(inF0)
-             591:   36(fvec3) ExtInst 1(GLSL.std.450) 18(Atan) 590
-                              Store 589(r009) 591
-             593:   36(fvec3) Load 41(inF0)
-             594:   36(fvec3) Load 42(inF1)
-             595:   36(fvec3) ExtInst 1(GLSL.std.450) 25(Atan2) 593 594
-                              Store 592(r010) 595
-             597:   36(fvec3) Load 41(inF0)
-             598:   36(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 597
-                              Store 596(r011) 598
+       573(r000):    132(ptr) Variable Function
+       576(r001):     37(ptr) Variable Function
+       579(r002):     37(ptr) Variable Function
+       582(r003):    132(ptr) Variable Function
+       585(r004):     37(ptr) Variable Function
+       590(r005):    589(ptr) Variable Function
+       593(r006):     39(ptr) Variable Function
+       596(r007):     37(ptr) Variable Function
+       599(r009):     37(ptr) Variable Function
+       602(r010):     37(ptr) Variable Function
+       606(r011):     37(ptr) Variable Function
+       609(r012):     37(ptr) Variable Function
+       622(r013):     37(ptr) Variable Function
+       625(r014):     37(ptr) Variable Function
+       628(r015):     39(ptr) Variable Function
+       632(r016):     37(ptr) Variable Function
+       636(r017):     37(ptr) Variable Function
+       639(r018):     37(ptr) Variable Function
+       642(r019):     37(ptr) Variable Function
+       645(r020):     37(ptr) Variable Function
+       648(r021):     37(ptr) Variable Function
+       651(r022):     37(ptr) Variable Function
+       654(r023):     37(ptr) Variable Function
+       657(r024):      7(ptr) Variable Function
+       661(r025):      7(ptr) Variable Function
+       665(r029):     37(ptr) Variable Function
+       668(r030):     37(ptr) Variable Function
+       671(r031):     37(ptr) Variable Function
+       676(r032):     39(ptr) Variable Function
+       680(r033):     39(ptr) Variable Function
+       682(r034):     37(ptr) Variable Function
+       685(r036):     37(ptr) Variable Function
+       689(r037):     37(ptr) Variable Function
+       692(r038):     37(ptr) Variable Function
+       698(r039):     37(ptr) Variable Function
+       702(r040):    701(ptr) Variable Function
+       705(r041):    701(ptr) Variable Function
+       708(r042):     37(ptr) Variable Function
+      712(r039a):     37(ptr) Variable Function
+      717(r039b):     37(ptr) Variable Function
+       723(r043):      7(ptr) Variable Function
+       726(r044):     37(ptr) Variable Function
+       729(r045):     37(ptr) Variable Function
+       733(r046):     37(ptr) Variable Function
+       736(r047):     37(ptr) Variable Function
+       740(r048):     37(ptr) Variable Function
+       744(r049):     37(ptr) Variable Function
+       747(r050):     37(ptr) Variable Function
+       751(r051):     37(ptr) Variable Function
+       754(r052):     37(ptr) Variable Function
+       758(r053):     37(ptr) Variable Function
+       762(r054):     37(ptr) Variable Function
+       766(r055):     39(ptr) Variable Function
+       769(r056):     37(ptr) Variable Function
+       772(r057):     37(ptr) Variable Function
+       775(r058):     37(ptr) Variable Function
+       780(r059):     37(ptr) Variable Function
+       783(r060):     37(ptr) Variable Function
+       790(r061):     37(ptr) Variable Function
+       793(r062):     37(ptr) Variable Function
+       798(r063):     37(ptr) Variable Function
+       801(r064):     37(ptr) Variable Function
+       805(r065):     37(ptr) Variable Function
+       808(r066):     37(ptr) Variable Function
+       811(r067):     37(ptr) Variable Function
+             574:   36(fvec3) Load 41(inF0)
+             575:   131(bool) All 574
+                              Store 573(r000) 575
+             577:   36(fvec3) Load 41(inF0)
+             578:   36(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 577
+                              Store 576(r001) 578
+             580:   36(fvec3) Load 41(inF0)
+             581:   36(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 580
+                              Store 579(r002) 581
+             583:   36(fvec3) Load 41(inF0)
+             584:   131(bool) Any 583
+                              Store 582(r003) 584
+             586:   36(fvec3) Load 41(inF0)
+             587:   36(fvec3) ExtInst 1(GLSL.std.450) 16(Asin) 586
+                              Store 585(r004) 587
+             591:   36(fvec3) Load 41(inF0)
+             592:  588(ivec3) Bitcast 591
+                              Store 590(r005) 592
+             594:   36(fvec3) Load 41(inF0)
+             595:   38(ivec3) Bitcast 594
+                              Store 593(r006) 595
+             597:   38(ivec3) Load 44(inU0)
+             598:   36(fvec3) Bitcast 597
+                              Store 596(r007) 598
              600:   36(fvec3) Load 41(inF0)
-             601:   36(fvec3) Load 42(inF1)
-             602:   36(fvec3) Load 43(inF2)
-             603:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 600 601 602
-                              Store 599(r012) 603
-             604:   36(fvec3) Load 41(inF0)
-             607:  606(bvec3) FOrdLessThan 604 605
-             608:   121(bool) Any 607
-                              SelectionMerge 610 None
-                              BranchConditional 608 609 610
-             609:               Label
+             601:   36(fvec3) ExtInst 1(GLSL.std.450) 18(Atan) 600
+                              Store 599(r009) 601
+             603:   36(fvec3) Load 41(inF0)
+             604:   36(fvec3) Load 42(inF1)
+             605:   36(fvec3) ExtInst 1(GLSL.std.450) 25(Atan2) 603 604
+                              Store 602(r010) 605
+             607:   36(fvec3) Load 41(inF0)
+             608:   36(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 607
+                              Store 606(r011) 608
+             610:   36(fvec3) Load 41(inF0)
+             611:   36(fvec3) Load 42(inF1)
+             612:   36(fvec3) Load 43(inF2)
+             613:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 610 611 612
+                              Store 609(r012) 613
+             614:   36(fvec3) Load 41(inF0)
+             617:  616(bvec3) FOrdLessThan 614 615
+             618:   131(bool) Any 617
+                              SelectionMerge 620 None
+                              BranchConditional 618 619 620
+             619:               Label
                                 Kill
-             610:             Label
-             613:   36(fvec3) Load 41(inF0)
-             614:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 613
-                              Store 612(r013) 614
-             616:   36(fvec3) Load 41(inF0)
-             617:   36(fvec3) ExtInst 1(GLSL.std.450) 20(Cosh) 616
-                              Store 615(r014) 617
-             621:   38(ivec3) BitCount 620
-                              Store 618(r015) 621
+             620:             Label
              623:   36(fvec3) Load 41(inF0)
-             624:   36(fvec3) Load 42(inF1)
-             625:   36(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 623 624
-                              Store 622(r016) 625
-             627:   36(fvec3) Load 41(inF0)
-             628:   36(fvec3) DPdx 627
-                              Store 626(r017) 628
-             630:   36(fvec3) Load 41(inF0)
-             631:   36(fvec3) DPdxCoarse 630
-                              Store 629(r018) 631
+             624:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 623
+                              Store 622(r013) 624
+             626:   36(fvec3) Load 41(inF0)
+             627:   36(fvec3) ExtInst 1(GLSL.std.450) 20(Cosh) 626
+                              Store 625(r014) 627
+             631:   38(ivec3) BitCount 630
+                              Store 628(r015) 631
              633:   36(fvec3) Load 41(inF0)
-             634:   36(fvec3) DPdxFine 633
-                              Store 632(r019) 634
-             636:   36(fvec3) Load 41(inF0)
-             637:   36(fvec3) DPdy 636
-                              Store 635(r020) 637
-             639:   36(fvec3) Load 41(inF0)
-             640:   36(fvec3) DPdyCoarse 639
-                              Store 638(r021) 640
-             642:   36(fvec3) Load 41(inF0)
-             643:   36(fvec3) DPdyFine 642
-                              Store 641(r022) 643
-             645:   36(fvec3) Load 41(inF0)
-             646:   36(fvec3) ExtInst 1(GLSL.std.450) 12(Degrees) 645
-                              Store 644(r023) 646
-             648:   36(fvec3) Load 41(inF0)
-             649:   36(fvec3) Load 42(inF1)
-             650:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 648 649
-                              Store 647(r024) 650
+             634:   36(fvec3) Load 42(inF1)
+             635:   36(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 633 634
+                              Store 632(r016) 635
+             637:   36(fvec3) Load 41(inF0)
+             638:   36(fvec3) DPdx 637
+                              Store 636(r017) 638
+             640:   36(fvec3) Load 41(inF0)
+             641:   36(fvec3) DPdxCoarse 640
+                              Store 639(r018) 641
+             643:   36(fvec3) Load 41(inF0)
+             644:   36(fvec3) DPdxFine 643
+                              Store 642(r019) 644
+             646:   36(fvec3) Load 41(inF0)
+             647:   36(fvec3) DPdy 646
+                              Store 645(r020) 647
+             649:   36(fvec3) Load 41(inF0)
+             650:   36(fvec3) DPdyCoarse 649
+                              Store 648(r021) 650
              652:   36(fvec3) Load 41(inF0)
-             653:   36(fvec3) Load 42(inF1)
-             654:    6(float) Dot 652 653
-                              Store 651(r025) 654
-             656:   36(fvec3) Load 41(inF0)
-             657:   36(fvec3) ExtInst 1(GLSL.std.450) 27(Exp) 656
-                              Store 655(r029) 657
-             659:   36(fvec3) Load 41(inF0)
-             660:   36(fvec3) ExtInst 1(GLSL.std.450) 29(Exp2) 659
-                              Store 658(r030) 660
+             653:   36(fvec3) DPdyFine 652
+                              Store 651(r022) 653
+             655:   36(fvec3) Load 41(inF0)
+             656:   36(fvec3) ExtInst 1(GLSL.std.450) 12(Degrees) 655
+                              Store 654(r023) 656
+             658:   36(fvec3) Load 41(inF0)
+             659:   36(fvec3) Load 42(inF1)
+             660:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 658 659
+                              Store 657(r024) 660
              662:   36(fvec3) Load 41(inF0)
              663:   36(fvec3) Load 42(inF1)
-             664:   36(fvec3) Load 43(inF2)
-             665:   36(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 662 663 664
-                              Store 661(r031) 665
-             669:   38(ivec3) ExtInst 1(GLSL.std.450) 75(FindUMsb) 668
-                              Store 666(r032) 669
-             671:   38(ivec3) ExtInst 1(GLSL.std.450) 73(FindILsb) 668
-                              Store 670(r033) 671
-             673:   36(fvec3) Load 41(inF0)
-             674:   36(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 673
-                              Store 672(r034) 674
-             676:   36(fvec3) Load 41(inF0)
-             677:   36(fvec3) Load 42(inF1)
-             678:   36(fvec3) FMod 676 677
-                              Store 675(r036) 678
-             680:   36(fvec3) Load 41(inF0)
-             681:   36(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 680
-                              Store 679(r037) 681
+             664:    6(float) Dot 662 663
+                              Store 661(r025) 664
+             666:   36(fvec3) Load 41(inF0)
+             667:   36(fvec3) ExtInst 1(GLSL.std.450) 27(Exp) 666
+                              Store 665(r029) 667
+             669:   36(fvec3) Load 41(inF0)
+             670:   36(fvec3) ExtInst 1(GLSL.std.450) 29(Exp2) 669
+                              Store 668(r030) 670
+             672:   36(fvec3) Load 41(inF0)
+             673:   36(fvec3) Load 42(inF1)
+             674:   36(fvec3) Load 43(inF2)
+             675:   36(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 672 673 674
+                              Store 671(r031) 675
+             679:   38(ivec3) ExtInst 1(GLSL.std.450) 75(FindUMsb) 678
+                              Store 676(r032) 679
+             681:   38(ivec3) ExtInst 1(GLSL.std.450) 73(FindILsb) 678
+                              Store 680(r033) 681
              683:   36(fvec3) Load 41(inF0)
-             685:684(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 683
-             686:  578(ivec3) CompositeExtract 685 1
-                              Store 42(inF1) 686
-             687:   36(fvec3) CompositeExtract 685 0
-                              Store 682(r038) 687
-             689:   36(fvec3) Load 41(inF0)
-             690:   36(fvec3) Fwidth 689
-                              Store 688(r039) 690
+             684:   36(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 683
+                              Store 682(r034) 684
+             686:   36(fvec3) Load 41(inF0)
+             687:   36(fvec3) Load 42(inF1)
+             688:   36(fvec3) FMod 686 687
+                              Store 685(r036) 688
+             690:   36(fvec3) Load 41(inF0)
+             691:   36(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 690
+                              Store 689(r037) 691
              693:   36(fvec3) Load 41(inF0)
-             694:  606(bvec3) IsInf 693
-                              Store 692(r040) 694
-             696:   36(fvec3) Load 41(inF0)
-             697:  606(bvec3) IsNan 696
-                              Store 695(r041) 697
+             695:694(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 693
+             696:  588(ivec3) CompositeExtract 695 1
+                              Store 42(inF1) 696
+             697:   36(fvec3) CompositeExtract 695 0
+                              Store 692(r038) 697
              699:   36(fvec3) Load 41(inF0)
-             700:   36(fvec3) Load 42(inF1)
-             701:   36(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 699 700
-                              Store 698(r042) 701
+             700:   36(fvec3) Fwidth 699
+                              Store 698(r039) 700
              703:   36(fvec3) Load 41(inF0)
-             704:   36(fvec3) Load 42(inF1)
-             705:   36(fvec3) Load 43(inF2)
-             706:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 703 704 705
-                              Store 702(r039a) 706
-             708:   36(fvec3) Load 41(inF0)
-             709:   36(fvec3) Load 42(inF1)
-             711:   36(fvec3) CompositeConstruct 710 710 710
-             712:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 708 709 711
-                              Store 707(r039b) 712
-             714:   36(fvec3) Load 41(inF0)
-             715:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 714
-                              Store 713(r043) 715
-             717:   36(fvec3) Load 41(inF0)
-             718:   36(fvec3) ExtInst 1(GLSL.std.450) 28(Log) 717
-                              Store 716(r044) 718
-             720:   36(fvec3) Load 41(inF0)
-             721:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 720
-             722:   36(fvec3) VectorTimesScalar 721 253
-                              Store 719(r045) 722
+             704:  616(bvec3) IsInf 703
+                              Store 702(r040) 704
+             706:   36(fvec3) Load 41(inF0)
+             707:  616(bvec3) IsNan 706
+                              Store 705(r041) 707
+             709:   36(fvec3) Load 41(inF0)
+             710:   36(fvec3) Load 42(inF1)
+             711:   36(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 709 710
+                              Store 708(r042) 711
+             713:   36(fvec3) Load 41(inF0)
+             714:   36(fvec3) Load 42(inF1)
+             715:   36(fvec3) Load 43(inF2)
+             716:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 713 714 715
+                              Store 712(r039a) 716
+             718:   36(fvec3) Load 41(inF0)
+             719:   36(fvec3) Load 42(inF1)
+             721:   36(fvec3) CompositeConstruct 720 720 720
+             722:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 718 719 721
+                              Store 717(r039b) 722
              724:   36(fvec3) Load 41(inF0)
-             725:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 724
-                              Store 723(r046) 725
+             725:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 724
+                              Store 723(r043) 725
              727:   36(fvec3) Load 41(inF0)
-             728:   36(fvec3) Load 42(inF1)
-             729:   36(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 727 728
-                              Store 726(r047) 729
-             731:   36(fvec3) Load 41(inF0)
-             732:   36(fvec3) Load 42(inF1)
-             733:   36(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 731 732
-                              Store 730(r048) 733
-             735:   36(fvec3) Load 41(inF0)
-             736:   36(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 735
-                              Store 734(r049) 736
-             738:   36(fvec3) Load 41(inF0)
-             739:   36(fvec3) Load 42(inF1)
-             740:   36(fvec3) ExtInst 1(GLSL.std.450) 26(Pow) 738 739
-                              Store 737(r050) 740
-             742:   36(fvec3) Load 41(inF0)
-             743:   36(fvec3) ExtInst 1(GLSL.std.450) 11(Radians) 742
-                              Store 741(r051) 743
+             728:   36(fvec3) ExtInst 1(GLSL.std.450) 28(Log) 727
+                              Store 726(r044) 728
+             730:   36(fvec3) Load 41(inF0)
+             731:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 730
+             732:   36(fvec3) VectorTimesScalar 731 263
+                              Store 729(r045) 732
+             734:   36(fvec3) Load 41(inF0)
+             735:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 734
+                              Store 733(r046) 735
+             737:   36(fvec3) Load 41(inF0)
+             738:   36(fvec3) Load 42(inF1)
+             739:   36(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 737 738
+                              Store 736(r047) 739
+             741:   36(fvec3) Load 41(inF0)
+             742:   36(fvec3) Load 42(inF1)
+             743:   36(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 741 742
+                              Store 740(r048) 743
              745:   36(fvec3) Load 41(inF0)
-             746:   36(fvec3) CompositeConstruct 274 274 274
-             747:   36(fvec3) FDiv 746 745
-                              Store 744(r052) 747
-             749:   36(fvec3) Load 41(inF0)
-             750:   36(fvec3) Load 42(inF1)
-             751:   36(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 749 750
-                              Store 748(r053) 751
-             753:   36(fvec3) Load 41(inF0)
-             754:   36(fvec3) Load 42(inF1)
-             755:   36(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 753 754 509
-                              Store 752(r054) 755
-             758:   38(ivec3) BitReverse 757
-                              Store 756(r055) 758
-             760:   36(fvec3) Load 41(inF0)
-             761:   36(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 760
-                              Store 759(r056) 761
+             746:   36(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 745
+                              Store 744(r049) 746
+             748:   36(fvec3) Load 41(inF0)
+             749:   36(fvec3) Load 42(inF1)
+             750:   36(fvec3) ExtInst 1(GLSL.std.450) 26(Pow) 748 749
+                              Store 747(r050) 750
+             752:   36(fvec3) Load 41(inF0)
+             753:   36(fvec3) ExtInst 1(GLSL.std.450) 11(Radians) 752
+                              Store 751(r051) 753
+             755:   36(fvec3) Load 41(inF0)
+             756:   36(fvec3) CompositeConstruct 284 284 284
+             757:   36(fvec3) FDiv 756 755
+                              Store 754(r052) 757
+             759:   36(fvec3) Load 41(inF0)
+             760:   36(fvec3) Load 42(inF1)
+             761:   36(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 759 760
+                              Store 758(r053) 761
              763:   36(fvec3) Load 41(inF0)
-             764:   36(fvec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 763
-                              Store 762(r057) 764
-             766:   36(fvec3) Load 41(inF0)
-             767:   36(fvec3) CompositeConstruct 165 165 165
-             768:   36(fvec3) CompositeConstruct 274 274 274
-             769:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 766 767 768
-                              Store 765(r058) 769
-             771:   36(fvec3) Load 41(inF0)
-             772:   36(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 771
-                              Store 770(r059) 772
-             774:   36(fvec3) Load 41(inF0)
-             775:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 774
-                              Store 773(r060) 775
+             764:   36(fvec3) Load 42(inF1)
+             765:   36(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 763 764 519
+                              Store 762(r054) 765
+             768:   38(ivec3) BitReverse 767
+                              Store 766(r055) 768
+             770:   36(fvec3) Load 41(inF0)
+             771:   36(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 770
+                              Store 769(r056) 771
+             773:   36(fvec3) Load 41(inF0)
+             774:   36(fvec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 773
+                              Store 772(r057) 774
              776:   36(fvec3) Load 41(inF0)
-             777:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 776
-                              Store 42(inF1) 777
-             778:   36(fvec3) Load 41(inF0)
-             779:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 778
-                              Store 43(inF2) 779
+             777:   36(fvec3) CompositeConstruct 175 175 175
+             778:   36(fvec3) CompositeConstruct 284 284 284
+             779:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 776 777 778
+                              Store 775(r058) 779
              781:   36(fvec3) Load 41(inF0)
-             782:   36(fvec3) ExtInst 1(GLSL.std.450) 19(Sinh) 781
-                              Store 780(r061) 782
+             782:   36(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 781
+                              Store 780(r059) 782
              784:   36(fvec3) Load 41(inF0)
-             785:   36(fvec3) Load 42(inF1)
-             786:   36(fvec3) Load 43(inF2)
-             787:   36(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 784 785 786
-                              Store 783(r062) 787
-             789:   36(fvec3) Load 41(inF0)
-             790:   36(fvec3) ExtInst 1(GLSL.std.450) 31(Sqrt) 789
-                              Store 788(r063) 790
-             792:   36(fvec3) Load 41(inF0)
-             793:   36(fvec3) Load 42(inF1)
-             794:   36(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 792 793
-                              Store 791(r064) 794
-             796:   36(fvec3) Load 41(inF0)
-             797:   36(fvec3) ExtInst 1(GLSL.std.450) 15(Tan) 796
-                              Store 795(r065) 797
+             785:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 784
+                              Store 783(r060) 785
+             786:   36(fvec3) Load 41(inF0)
+             787:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 786
+                              Store 42(inF1) 787
+             788:   36(fvec3) Load 41(inF0)
+             789:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 788
+                              Store 43(inF2) 789
+             791:   36(fvec3) Load 41(inF0)
+             792:   36(fvec3) ExtInst 1(GLSL.std.450) 19(Sinh) 791
+                              Store 790(r061) 792
+             794:   36(fvec3) Load 41(inF0)
+             795:   36(fvec3) Load 42(inF1)
+             796:   36(fvec3) Load 43(inF2)
+             797:   36(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 794 795 796
+                              Store 793(r062) 797
              799:   36(fvec3) Load 41(inF0)
-             800:   36(fvec3) ExtInst 1(GLSL.std.450) 21(Tanh) 799
-                              Store 798(r066) 800
+             800:   36(fvec3) ExtInst 1(GLSL.std.450) 31(Sqrt) 799
+                              Store 798(r063) 800
              802:   36(fvec3) Load 41(inF0)
-             803:   36(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 802
-                              Store 801(r067) 803
-                              ReturnValue 805
+             803:   36(fvec3) Load 42(inF1)
+             804:   36(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 802 803
+                              Store 801(r064) 804
+             806:   36(fvec3) Load 41(inF0)
+             807:   36(fvec3) ExtInst 1(GLSL.std.450) 15(Tan) 806
+                              Store 805(r065) 807
+             809:   36(fvec3) Load 41(inF0)
+             810:   36(fvec3) ExtInst 1(GLSL.std.450) 21(Tanh) 809
+                              Store 808(r066) 810
+             812:   36(fvec3) Load 41(inF0)
+             813:   36(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 812
+                              Store 811(r067) 813
+                              ReturnValue 815
                               FunctionEnd
-54(PixelShaderFunction2x2(mf22;mf22;mf22;):          48 Function None 50
-        51(inF0):     49(ptr) FunctionParameter
-        52(inF1):     49(ptr) FunctionParameter
-        53(inF2):     49(ptr) FunctionParameter
-              55:             Label
-      1062(r000):    122(ptr) Variable Function
-      1065(r001):     49(ptr) Variable Function
-      1070(r003):    122(ptr) Variable Function
-      1073(r004):     49(ptr) Variable Function
-      1076(r005):     49(ptr) Variable Function
-      1079(r006):     49(ptr) Variable Function
-      1083(r007):     49(ptr) Variable Function
-      1094(r008):     49(ptr) Variable Function
-      1099(r009):     49(ptr) Variable Function
-      1102(r010):     49(ptr) Variable Function
-      1105(r011):     49(ptr) Variable Function
-      1108(r012):     49(ptr) Variable Function
-      1111(r013):     49(ptr) Variable Function
-      1114(r014):     49(ptr) Variable Function
-      1117(r015):     49(ptr) Variable Function
-      1120(r016):     49(ptr) Variable Function
-      1123(r017):     49(ptr) Variable Function
-      1126(r018):      7(ptr) Variable Function
-      1129(r019):     49(ptr) Variable Function
-      1132(R020):     49(ptr) Variable Function
-      1135(r021):     49(ptr) Variable Function
-      1138(r022):     49(ptr) Variable Function
-      1148(r023):     49(ptr) Variable Function
-      1151(r024):     49(ptr) Variable Function
-      1157(r025):     49(ptr) Variable Function
-      1160(r026):     49(ptr) Variable Function
-     1164(r026a):     49(ptr) Variable Function
-      1169(r027):     49(ptr) Variable Function
-      1172(r028):     49(ptr) Variable Function
-      1176(r029):     49(ptr) Variable Function
-      1179(r030):     49(ptr) Variable Function
-      1183(r031):     49(ptr) Variable Function
-      1187(r032):     49(ptr) Variable Function
-      1191(r033):     49(ptr) Variable Function
-      1194(r034):     49(ptr) Variable Function
-      1197(r035):     49(ptr) Variable Function
-      1200(r036):     49(ptr) Variable Function
-      1205(r037):     49(ptr) Variable Function
-      1208(r038):     49(ptr) Variable Function
-      1215(r039):     49(ptr) Variable Function
-      1218(r049):     49(ptr) Variable Function
-      1223(r041):     49(ptr) Variable Function
-      1226(r042):     49(ptr) Variable Function
-      1230(r043):     49(ptr) Variable Function
-      1233(r044):     49(ptr) Variable Function
-      1238(r046):     49(ptr) Variable Function
-            1063:          48 Load 51(inF0)
-            1064:   121(bool) All 1063
-                              Store 1062(r000) 1064
-            1066:          48 Load 51(inF0)
-            1067:          48 ExtInst 1(GLSL.std.450) 4(FAbs) 1066
-                              Store 1065(r001) 1067
-            1068:          48 Load 51(inF0)
-            1069:          48 ExtInst 1(GLSL.std.450) 17(Acos) 1068
-            1071:          48 Load 51(inF0)
-            1072:   121(bool) Any 1071
-                              Store 1070(r003) 1072
-            1074:          48 Load 51(inF0)
-            1075:          48 ExtInst 1(GLSL.std.450) 16(Asin) 1074
-                              Store 1073(r004) 1075
-            1077:          48 Load 51(inF0)
-            1078:          48 ExtInst 1(GLSL.std.450) 18(Atan) 1077
-                              Store 1076(r005) 1078
-            1080:          48 Load 51(inF0)
-            1081:          48 Load 52(inF1)
-            1082:          48 ExtInst 1(GLSL.std.450) 25(Atan2) 1080 1081
-                              Store 1079(r006) 1082
-            1084:          48 Load 51(inF0)
-            1085:          48 ExtInst 1(GLSL.std.450) 9(Ceil) 1084
-                              Store 1083(r007) 1085
-            1086:          48 Load 51(inF0)
-            1089:        1088 FOrdLessThan 1086 1087
-            1090:   121(bool) Any 1089
-                              SelectionMerge 1092 None
-                              BranchConditional 1090 1091 1092
-            1091:               Label
+58(PixelShaderFunction(vf4;vf4;vf4;vu4;vu4;):   48(fvec4) Function None 52
+        53(inF0):     49(ptr) FunctionParameter
+        54(inF1):     49(ptr) FunctionParameter
+        55(inF2):     49(ptr) FunctionParameter
+        56(inU0):     51(ptr) FunctionParameter
+        57(inU1):     51(ptr) FunctionParameter
+              59:             Label
+       818(r000):    132(ptr) Variable Function
+       821(r001):     49(ptr) Variable Function
+       824(r002):     49(ptr) Variable Function
+       827(r003):    132(ptr) Variable Function
+       830(r004):     49(ptr) Variable Function
+       835(r005):    834(ptr) Variable Function
+       838(r006):     51(ptr) Variable Function
+       841(r007):     49(ptr) Variable Function
+       844(r009):     49(ptr) Variable Function
+       847(r010):     49(ptr) Variable Function
+       851(r011):     49(ptr) Variable Function
+       854(r012):     49(ptr) Variable Function
+       867(r013):     49(ptr) Variable Function
+       870(r014):     49(ptr) Variable Function
+       873(r015):     51(ptr) Variable Function
+       876(r016):     49(ptr) Variable Function
+       879(r017):     49(ptr) Variable Function
+       882(r018):     49(ptr) Variable Function
+       885(r019):     49(ptr) Variable Function
+       888(r020):     49(ptr) Variable Function
+       891(r021):     49(ptr) Variable Function
+       894(r022):     49(ptr) Variable Function
+       897(r023):      7(ptr) Variable Function
+       901(r024):      7(ptr) Variable Function
+       905(r025):     49(ptr) Variable Function
+       916(r029):     49(ptr) Variable Function
+       919(r030):     49(ptr) Variable Function
+       922(r031):     49(ptr) Variable Function
+       927(r032):     51(ptr) Variable Function
+       932(r033):     51(ptr) Variable Function
+       934(r034):     49(ptr) Variable Function
+       937(r036):     49(ptr) Variable Function
+       941(r037):     49(ptr) Variable Function
+       944(r038):     49(ptr) Variable Function
+       950(r039):     49(ptr) Variable Function
+       954(r040):    953(ptr) Variable Function
+       957(r041):    953(ptr) Variable Function
+       960(r042):     49(ptr) Variable Function
+      964(r039a):     49(ptr) Variable Function
+       969(r043):      7(ptr) Variable Function
+       972(r044):     49(ptr) Variable Function
+       975(r045):     49(ptr) Variable Function
+       979(r046):     49(ptr) Variable Function
+       982(r047):     49(ptr) Variable Function
+       986(r048):     49(ptr) Variable Function
+       990(r049):     49(ptr) Variable Function
+       993(r050):     49(ptr) Variable Function
+       997(r051):     49(ptr) Variable Function
+      1000(r052):     49(ptr) Variable Function
+      1004(r053):     49(ptr) Variable Function
+      1008(r054):     49(ptr) Variable Function
+      1012(r055):     51(ptr) Variable Function
+      1015(r056):     49(ptr) Variable Function
+      1018(r057):     49(ptr) Variable Function
+      1021(r058):     49(ptr) Variable Function
+      1026(r059):     49(ptr) Variable Function
+      1029(r060):     49(ptr) Variable Function
+      1036(r061):     49(ptr) Variable Function
+      1039(r062):     49(ptr) Variable Function
+      1044(r063):     49(ptr) Variable Function
+      1047(r064):     49(ptr) Variable Function
+      1051(r065):     49(ptr) Variable Function
+      1054(r066):     49(ptr) Variable Function
+      1057(r067):     49(ptr) Variable Function
+             819:   48(fvec4) Load 53(inF0)
+             820:   131(bool) All 819
+                              Store 818(r000) 820
+             822:   48(fvec4) Load 53(inF0)
+             823:   48(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 822
+                              Store 821(r001) 823
+             825:   48(fvec4) Load 53(inF0)
+             826:   48(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 825
+                              Store 824(r002) 826
+             828:   48(fvec4) Load 53(inF0)
+             829:   131(bool) Any 828
+                              Store 827(r003) 829
+             831:   48(fvec4) Load 53(inF0)
+             832:   48(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 831
+                              Store 830(r004) 832
+             836:   48(fvec4) Load 53(inF0)
+             837:  833(ivec4) Bitcast 836
+                              Store 835(r005) 837
+             839:   48(fvec4) Load 53(inF0)
+             840:   50(ivec4) Bitcast 839
+                              Store 838(r006) 840
+             842:   50(ivec4) Load 56(inU0)
+             843:   48(fvec4) Bitcast 842
+                              Store 841(r007) 843
+             845:   48(fvec4) Load 53(inF0)
+             846:   48(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 845
+                              Store 844(r009) 846
+             848:   48(fvec4) Load 53(inF0)
+             849:   48(fvec4) Load 54(inF1)
+             850:   48(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 848 849
+                              Store 847(r010) 850
+             852:   48(fvec4) Load 53(inF0)
+             853:   48(fvec4) ExtInst 1(GLSL.std.450) 9(Ceil) 852
+                              Store 851(r011) 853
+             855:   48(fvec4) Load 53(inF0)
+             856:   48(fvec4) Load 54(inF1)
+             857:   48(fvec4) Load 55(inF2)
+             858:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 855 856 857
+                              Store 854(r012) 858
+             859:   48(fvec4) Load 53(inF0)
+             862:  861(bvec4) FOrdLessThan 859 860
+             863:   131(bool) Any 862
+                              SelectionMerge 865 None
+                              BranchConditional 863 864 865
+             864:               Label
                                 Kill
-            1092:             Label
-            1095:          48 Load 51(inF0)
-            1096:          48 Load 52(inF1)
-            1097:          48 Load 53(inF2)
-            1098:          48 ExtInst 1(GLSL.std.450) 43(FClamp) 1095 1096 1097
-                              Store 1094(r008) 1098
-            1100:          48 Load 51(inF0)
-            1101:          48 ExtInst 1(GLSL.std.450) 14(Cos) 1100
-                              Store 1099(r009) 1101
-            1103:          48 Load 51(inF0)
-            1104:          48 ExtInst 1(GLSL.std.450) 20(Cosh) 1103
-                              Store 1102(r010) 1104
-            1106:          48 Load 51(inF0)
-            1107:          48 DPdx 1106
-                              Store 1105(r011) 1107
-            1109:          48 Load 51(inF0)
-            1110:          48 DPdxCoarse 1109
-                              Store 1108(r012) 1110
-            1112:          48 Load 51(inF0)
-            1113:          48 DPdxFine 1112
-                              Store 1111(r013) 1113
-            1115:          48 Load 51(inF0)
-            1116:          48 DPdy 1115
-                              Store 1114(r014) 1116
-            1118:          48 Load 51(inF0)
-            1119:          48 DPdyCoarse 1118
-                              Store 1117(r015) 1119
-            1121:          48 Load 51(inF0)
-            1122:          48 DPdyFine 1121
-                              Store 1120(r016) 1122
-            1124:          48 Load 51(inF0)
-            1125:          48 ExtInst 1(GLSL.std.450) 12(Degrees) 1124
-                              Store 1123(r017) 1125
-            1127:          48 Load 51(inF0)
-            1128:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1127
-                              Store 1126(r018) 1128
-            1130:          48 Load 51(inF0)
-            1131:          48 ExtInst 1(GLSL.std.450) 27(Exp) 1130
-                              Store 1129(r019) 1131
-            1133:          48 Load 51(inF0)
-            1134:          48 ExtInst 1(GLSL.std.450) 29(Exp2) 1133
-                              Store 1132(R020) 1134
-            1136:          48 Load 51(inF0)
-            1137:          48 ExtInst 1(GLSL.std.450) 8(Floor) 1136
-                              Store 1135(r021) 1137
-            1139:          48 Load 51(inF0)
-            1140:          48 Load 52(inF1)
-            1141:   24(fvec2) CompositeExtract 1139 0
-            1142:   24(fvec2) CompositeExtract 1140 0
-            1143:   24(fvec2) FMod 1141 1142
-            1144:   24(fvec2) CompositeExtract 1139 1
-            1145:   24(fvec2) CompositeExtract 1140 1
-            1146:   24(fvec2) FMod 1144 1145
-            1147:          48 CompositeConstruct 1143 1146
-                              Store 1138(r022) 1147
-            1149:          48 Load 51(inF0)
-            1150:          48 ExtInst 1(GLSL.std.450) 10(Fract) 1149
-                              Store 1148(r023) 1150
-            1152:          48 Load 51(inF0)
-            1154:1153(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 1152
-            1155:  342(ivec2) CompositeExtract 1154 1
-                              Store 52(inF1) 1155
-            1156:          48 CompositeExtract 1154 0
-                              Store 1151(r024) 1156
-            1158:          48 Load 51(inF0)
-            1159:          48 Fwidth 1158
-                              Store 1157(r025) 1159
-            1161:          48 Load 51(inF0)
-            1162:          48 Load 52(inF1)
-            1163:          48 ExtInst 1(GLSL.std.450) 53(Ldexp) 1161 1162
-                              Store 1160(r026) 1163
-            1165:          48 Load 51(inF0)
-            1166:          48 Load 52(inF1)
-            1167:          48 Load 53(inF2)
-            1168:          48 ExtInst 1(GLSL.std.450) 46(FMix) 1165 1166 1167
-                              Store 1164(r026a) 1168
-            1170:          48 Load 51(inF0)
-            1171:          48 ExtInst 1(GLSL.std.450) 28(Log) 1170
-                              Store 1169(r027) 1171
-            1173:          48 Load 51(inF0)
-            1174:          48 ExtInst 1(GLSL.std.450) 30(Log2) 1173
-            1175:          48 MatrixTimesScalar 1174 253
-                              Store 1172(r028) 1175
-            1177:          48 Load 51(inF0)
-            1178:          48 ExtInst 1(GLSL.std.450) 30(Log2) 1177
-                              Store 1176(r029) 1178
-            1180:          48 Load 51(inF0)
-            1181:          48 Load 52(inF1)
-            1182:          48 ExtInst 1(GLSL.std.450) 40(FMax) 1180 1181
-                              Store 1179(r030) 1182
-            1184:          48 Load 51(inF0)
-            1185:          48 Load 52(inF1)
-            1186:          48 ExtInst 1(GLSL.std.450) 37(FMin) 1184 1185
-                              Store 1183(r031) 1186
-            1188:          48 Load 51(inF0)
-            1189:          48 Load 52(inF1)
-            1190:          48 ExtInst 1(GLSL.std.450) 26(Pow) 1188 1189
-                              Store 1187(r032) 1190
-            1192:          48 Load 51(inF0)
-            1193:          48 ExtInst 1(GLSL.std.450) 11(Radians) 1192
-                              Store 1191(r033) 1193
-            1195:          48 Load 51(inF0)
-            1196:          48 ExtInst 1(GLSL.std.450) 2(RoundEven) 1195
-                              Store 1194(r034) 1196
-            1198:          48 Load 51(inF0)
-            1199:          48 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1198
-                              Store 1197(r035) 1199
-            1201:          48 Load 51(inF0)
-            1202:   24(fvec2) CompositeConstruct 165 165
-            1203:   24(fvec2) CompositeConstruct 274 274
-            1204:          48 ExtInst 1(GLSL.std.450) 43(FClamp) 1201 1202 1203
-                              Store 1200(r036) 1204
-            1206:          48 Load 51(inF0)
-            1207:          48 ExtInst 1(GLSL.std.450) 6(FSign) 1206
-                              Store 1205(r037) 1207
-            1209:          48 Load 51(inF0)
-            1210:          48 ExtInst 1(GLSL.std.450) 13(Sin) 1209
-                              Store 1208(r038) 1210
-            1211:          48 Load 51(inF0)
-            1212:          48 ExtInst 1(GLSL.std.450) 13(Sin) 1211
-                              Store 52(inF1) 1212
-            1213:          48 Load 51(inF0)
-            1214:          48 ExtInst 1(GLSL.std.450) 14(Cos) 1213
-                              Store 53(inF2) 1214
-            1216:          48 Load 51(inF0)
-            1217:          48 ExtInst 1(GLSL.std.450) 19(Sinh) 1216
-                              Store 1215(r039) 1217
-            1219:          48 Load 51(inF0)
-            1220:          48 Load 52(inF1)
-            1221:          48 Load 53(inF2)
-            1222:          48 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1219 1220 1221
-                              Store 1218(r049) 1222
-            1224:          48 Load 51(inF0)
-            1225:          48 ExtInst 1(GLSL.std.450) 31(Sqrt) 1224
-                              Store 1223(r041) 1225
-            1227:          48 Load 51(inF0)
-            1228:          48 Load 52(inF1)
-            1229:          48 ExtInst 1(GLSL.std.450) 48(Step) 1227 1228
-                              Store 1226(r042) 1229
-            1231:          48 Load 51(inF0)
-            1232:          48 ExtInst 1(GLSL.std.450) 15(Tan) 1231
-                              Store 1230(r043) 1232
-            1234:          48 Load 51(inF0)
-            1235:          48 ExtInst 1(GLSL.std.450) 21(Tanh) 1234
-                              Store 1233(r044) 1235
-            1236:          48 Load 51(inF0)
-            1237:          48 Transpose 1236
-            1239:          48 Load 51(inF0)
-            1240:          48 ExtInst 1(GLSL.std.450) 3(Trunc) 1239
-                              Store 1238(r046) 1240
-                              ReturnValue 1242
+             865:             Label
+             868:   48(fvec4) Load 53(inF0)
+             869:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 868
+                              Store 867(r013) 869
+             871:   48(fvec4) Load 53(inF0)
+             872:   48(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 871
+                              Store 870(r014) 872
+             875:   50(ivec4) BitCount 874
+                              Store 873(r015) 875
+             877:   48(fvec4) Load 53(inF0)
+             878:   48(fvec4) DPdx 877
+                              Store 876(r016) 878
+             880:   48(fvec4) Load 53(inF0)
+             881:   48(fvec4) DPdxCoarse 880
+                              Store 879(r017) 881
+             883:   48(fvec4) Load 53(inF0)
+             884:   48(fvec4) DPdxFine 883
+                              Store 882(r018) 884
+             886:   48(fvec4) Load 53(inF0)
+             887:   48(fvec4) DPdy 886
+                              Store 885(r019) 887
+             889:   48(fvec4) Load 53(inF0)
+             890:   48(fvec4) DPdyCoarse 889
+                              Store 888(r020) 890
+             892:   48(fvec4) Load 53(inF0)
+             893:   48(fvec4) DPdyFine 892
+                              Store 891(r021) 893
+             895:   48(fvec4) Load 53(inF0)
+             896:   48(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 895
+                              Store 894(r022) 896
+             898:   48(fvec4) Load 53(inF0)
+             899:   48(fvec4) Load 54(inF1)
+             900:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 898 899
+                              Store 897(r023) 900
+             902:   48(fvec4) Load 53(inF0)
+             903:   48(fvec4) Load 54(inF1)
+             904:    6(float) Dot 902 903
+                              Store 901(r024) 904
+             906:      7(ptr) AccessChain 53(inF0) 522
+             907:    6(float) Load 906
+             908:      7(ptr) AccessChain 54(inF1) 522
+             909:    6(float) Load 908
+             910:    6(float) FMul 907 909
+             911:      7(ptr) AccessChain 53(inF0) 288
+             912:    6(float) Load 911
+             913:      7(ptr) AccessChain 54(inF1) 393
+             914:    6(float) Load 913
+             915:   48(fvec4) CompositeConstruct 284 910 912 914
+                              Store 905(r025) 915
+             917:   48(fvec4) Load 53(inF0)
+             918:   48(fvec4) ExtInst 1(GLSL.std.450) 27(Exp) 917
+                              Store 916(r029) 918
+             920:   48(fvec4) Load 53(inF0)
+             921:   48(fvec4) ExtInst 1(GLSL.std.450) 29(Exp2) 920
+                              Store 919(r030) 921
+             923:   48(fvec4) Load 53(inF0)
+             924:   48(fvec4) Load 54(inF1)
+             925:   48(fvec4) Load 55(inF2)
+             926:   48(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 923 924 925
+                              Store 922(r031) 926
+             931:   50(ivec4) ExtInst 1(GLSL.std.450) 75(FindUMsb) 930
+                              Store 927(r032) 931
+             933:   50(ivec4) ExtInst 1(GLSL.std.450) 73(FindILsb) 930
+                              Store 932(r033) 933
+             935:   48(fvec4) Load 53(inF0)
+             936:   48(fvec4) ExtInst 1(GLSL.std.450) 8(Floor) 935
+                              Store 934(r034) 936
+             938:   48(fvec4) Load 53(inF0)
+             939:   48(fvec4) Load 54(inF1)
+             940:   48(fvec4) FMod 938 939
+                              Store 937(r036) 940
+             942:   48(fvec4) Load 53(inF0)
+             943:   48(fvec4) ExtInst 1(GLSL.std.450) 10(Fract) 942
+                              Store 941(r037) 943
+             945:   48(fvec4) Load 53(inF0)
+             947:946(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 945
+             948:  833(ivec4) CompositeExtract 947 1
+                              Store 54(inF1) 948
+             949:   48(fvec4) CompositeExtract 947 0
+                              Store 944(r038) 949
+             951:   48(fvec4) Load 53(inF0)
+             952:   48(fvec4) Fwidth 951
+                              Store 950(r039) 952
+             955:   48(fvec4) Load 53(inF0)
+             956:  861(bvec4) IsInf 955
+                              Store 954(r040) 956
+             958:   48(fvec4) Load 53(inF0)
+             959:  861(bvec4) IsNan 958
+                              Store 957(r041) 959
+             961:   48(fvec4) Load 53(inF0)
+             962:   48(fvec4) Load 54(inF1)
+             963:   48(fvec4) ExtInst 1(GLSL.std.450) 53(Ldexp) 961 962
+                              Store 960(r042) 963
+             965:   48(fvec4) Load 53(inF0)
+             966:   48(fvec4) Load 54(inF1)
+             967:   48(fvec4) Load 55(inF2)
+             968:   48(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 965 966 967
+                              Store 964(r039a) 968
+             970:   48(fvec4) Load 53(inF0)
+             971:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 970
+                              Store 969(r043) 971
+             973:   48(fvec4) Load 53(inF0)
+             974:   48(fvec4) ExtInst 1(GLSL.std.450) 28(Log) 973
+                              Store 972(r044) 974
+             976:   48(fvec4) Load 53(inF0)
+             977:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 976
+             978:   48(fvec4) VectorTimesScalar 977 263
+                              Store 975(r045) 978
+             980:   48(fvec4) Load 53(inF0)
+             981:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 980
+                              Store 979(r046) 981
+             983:   48(fvec4) Load 53(inF0)
+             984:   48(fvec4) Load 54(inF1)
+             985:   48(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 983 984
+                              Store 982(r047) 985
+             987:   48(fvec4) Load 53(inF0)
+             988:   48(fvec4) Load 54(inF1)
+             989:   48(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 987 988
+                              Store 986(r048) 989
+             991:   48(fvec4) Load 53(inF0)
+             992:   48(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 991
+                              Store 990(r049) 992
+             994:   48(fvec4) Load 53(inF0)
+             995:   48(fvec4) Load 54(inF1)
+             996:   48(fvec4) ExtInst 1(GLSL.std.450) 26(Pow) 994 995
+                              Store 993(r050) 996
+             998:   48(fvec4) Load 53(inF0)
+             999:   48(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 998
+                              Store 997(r051) 999
+            1001:   48(fvec4) Load 53(inF0)
+            1002:   48(fvec4) CompositeConstruct 284 284 284 284
+            1003:   48(fvec4) FDiv 1002 1001
+                              Store 1000(r052) 1003
+            1005:   48(fvec4) Load 53(inF0)
+            1006:   48(fvec4) Load 54(inF1)
+            1007:   48(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 1005 1006
+                              Store 1004(r053) 1007
+            1009:   48(fvec4) Load 53(inF0)
+            1010:   48(fvec4) Load 54(inF1)
+            1011:   48(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 1009 1010 519
+                              Store 1008(r054) 1011
+            1014:   50(ivec4) BitReverse 1013
+                              Store 1012(r055) 1014
+            1016:   48(fvec4) Load 53(inF0)
+            1017:   48(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 1016
+                              Store 1015(r056) 1017
+            1019:   48(fvec4) Load 53(inF0)
+            1020:   48(fvec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1019
+                              Store 1018(r057) 1020
+            1022:   48(fvec4) Load 53(inF0)
+            1023:   48(fvec4) CompositeConstruct 175 175 175 175
+            1024:   48(fvec4) CompositeConstruct 284 284 284 284
+            1025:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 1022 1023 1024
+                              Store 1021(r058) 1025
+            1027:   48(fvec4) Load 53(inF0)
+            1028:   48(fvec4) ExtInst 1(GLSL.std.450) 6(FSign) 1027
+                              Store 1026(r059) 1028
+            1030:   48(fvec4) Load 53(inF0)
+            1031:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1030
+                              Store 1029(r060) 1031
+            1032:   48(fvec4) Load 53(inF0)
+            1033:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1032
+                              Store 54(inF1) 1033
+            1034:   48(fvec4) Load 53(inF0)
+            1035:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 1034
+                              Store 55(inF2) 1035
+            1037:   48(fvec4) Load 53(inF0)
+            1038:   48(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 1037
+                              Store 1036(r061) 1038
+            1040:   48(fvec4) Load 53(inF0)
+            1041:   48(fvec4) Load 54(inF1)
+            1042:   48(fvec4) Load 55(inF2)
+            1043:   48(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 1040 1041 1042
+                              Store 1039(r062) 1043
+            1045:   48(fvec4) Load 53(inF0)
+            1046:   48(fvec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 1045
+                              Store 1044(r063) 1046
+            1048:   48(fvec4) Load 53(inF0)
+            1049:   48(fvec4) Load 54(inF1)
+            1050:   48(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 1048 1049
+                              Store 1047(r064) 1050
+            1052:   48(fvec4) Load 53(inF0)
+            1053:   48(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 1052
+                              Store 1051(r065) 1053
+            1055:   48(fvec4) Load 53(inF0)
+            1056:   48(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 1055
+                              Store 1054(r066) 1056
+            1058:   48(fvec4) Load 53(inF0)
+            1059:   48(fvec4) ExtInst 1(GLSL.std.450) 3(Trunc) 1058
+                              Store 1057(r067) 1059
+                              ReturnValue 1061
                               FunctionEnd
-62(PixelShaderFunction3x3(mf33;mf33;mf33;):          56 Function None 58
-        59(inF0):     57(ptr) FunctionParameter
-        60(inF1):     57(ptr) FunctionParameter
-        61(inF2):     57(ptr) FunctionParameter
-              63:             Label
-      1245(r000):    122(ptr) Variable Function
-      1248(r001):     57(ptr) Variable Function
-      1253(r003):    122(ptr) Variable Function
-      1256(r004):     57(ptr) Variable Function
-      1259(r005):     57(ptr) Variable Function
-      1262(r006):     57(ptr) Variable Function
-      1266(r007):     57(ptr) Variable Function
-      1277(r008):     57(ptr) Variable Function
-      1282(r009):     57(ptr) Variable Function
-      1285(r010):     57(ptr) Variable Function
-      1288(r011):     57(ptr) Variable Function
-      1291(r012):     57(ptr) Variable Function
-      1294(r013):     57(ptr) Variable Function
-      1297(r014):     57(ptr) Variable Function
-      1300(r015):     57(ptr) Variable Function
-      1303(r016):     57(ptr) Variable Function
-      1306(r017):     57(ptr) Variable Function
-      1309(r018):      7(ptr) Variable Function
-      1312(r019):     57(ptr) Variable Function
-      1315(R020):     57(ptr) Variable Function
-      1318(r021):     57(ptr) Variable Function
-      1321(r022):     57(ptr) Variable Function
-      1334(r023):     57(ptr) Variable Function
-      1337(r024):     57(ptr) Variable Function
-      1343(r025):     57(ptr) Variable Function
-      1346(r026):     57(ptr) Variable Function
-     1350(r026a):     57(ptr) Variable Function
-      1355(r027):     57(ptr) Variable Function
-      1358(r028):     57(ptr) Variable Function
-      1362(r029):     57(ptr) Variable Function
-      1365(r030):     57(ptr) Variable Function
-      1369(r031):     57(ptr) Variable Function
-      1373(r032):     57(ptr) Variable Function
-      1377(r033):     57(ptr) Variable Function
-      1380(r034):     57(ptr) Variable Function
-      1383(r035):     57(ptr) Variable Function
-      1386(r036):     57(ptr) Variable Function
-      1391(r037):     57(ptr) Variable Function
-      1394(r038):     57(ptr) Variable Function
-      1401(r039):     57(ptr) Variable Function
-      1404(r049):     57(ptr) Variable Function
-      1409(r041):     57(ptr) Variable Function
-      1412(r042):     57(ptr) Variable Function
-      1416(r043):     57(ptr) Variable Function
-      1419(r044):     57(ptr) Variable Function
-      1424(r046):     57(ptr) Variable Function
-            1246:          56 Load 59(inF0)
-            1247:   121(bool) All 1246
-                              Store 1245(r000) 1247
-            1249:          56 Load 59(inF0)
-            1250:          56 ExtInst 1(GLSL.std.450) 4(FAbs) 1249
-                              Store 1248(r001) 1250
-            1251:          56 Load 59(inF0)
-            1252:          56 ExtInst 1(GLSL.std.450) 17(Acos) 1251
-            1254:          56 Load 59(inF0)
-            1255:   121(bool) Any 1254
-                              Store 1253(r003) 1255
-            1257:          56 Load 59(inF0)
-            1258:          56 ExtInst 1(GLSL.std.450) 16(Asin) 1257
-                              Store 1256(r004) 1258
-            1260:          56 Load 59(inF0)
-            1261:          56 ExtInst 1(GLSL.std.450) 18(Atan) 1260
-                              Store 1259(r005) 1261
-            1263:          56 Load 59(inF0)
-            1264:          56 Load 60(inF1)
-            1265:          56 ExtInst 1(GLSL.std.450) 25(Atan2) 1263 1264
-                              Store 1262(r006) 1265
-            1267:          56 Load 59(inF0)
-            1268:          56 ExtInst 1(GLSL.std.450) 9(Ceil) 1267
-                              Store 1266(r007) 1268
-            1269:          56 Load 59(inF0)
-            1272:        1271 FOrdLessThan 1269 1270
-            1273:   121(bool) Any 1272
-                              SelectionMerge 1275 None
-                              BranchConditional 1273 1274 1275
-            1274:               Label
+66(PixelShaderFunction2x2(mf22;mf22;mf22;):          60 Function None 62
+        63(inF0):     61(ptr) FunctionParameter
+        64(inF1):     61(ptr) FunctionParameter
+        65(inF2):     61(ptr) FunctionParameter
+              67:             Label
+      1064(r000):    132(ptr) Variable Function
+      1067(r001):     61(ptr) Variable Function
+      1072(r003):    132(ptr) Variable Function
+      1075(r004):     61(ptr) Variable Function
+      1078(r005):     61(ptr) Variable Function
+      1081(r006):     61(ptr) Variable Function
+      1085(r007):     61(ptr) Variable Function
+      1096(r008):     61(ptr) Variable Function
+      1101(r009):     61(ptr) Variable Function
+      1104(r010):     61(ptr) Variable Function
+      1107(r011):     61(ptr) Variable Function
+      1110(r012):     61(ptr) Variable Function
+      1113(r013):     61(ptr) Variable Function
+      1116(r014):     61(ptr) Variable Function
+      1119(r015):     61(ptr) Variable Function
+      1122(r016):     61(ptr) Variable Function
+      1125(r017):     61(ptr) Variable Function
+      1128(r018):      7(ptr) Variable Function
+      1131(r019):     61(ptr) Variable Function
+      1134(R020):     61(ptr) Variable Function
+      1137(r021):     61(ptr) Variable Function
+      1140(r022):     61(ptr) Variable Function
+      1150(r023):     61(ptr) Variable Function
+      1153(r024):     61(ptr) Variable Function
+      1159(r025):     61(ptr) Variable Function
+      1162(r026):     61(ptr) Variable Function
+     1166(r026a):     61(ptr) Variable Function
+      1171(r027):     61(ptr) Variable Function
+      1174(r028):     61(ptr) Variable Function
+      1178(r029):     61(ptr) Variable Function
+      1181(r030):     61(ptr) Variable Function
+      1185(r031):     61(ptr) Variable Function
+      1189(r032):     61(ptr) Variable Function
+      1193(r033):     61(ptr) Variable Function
+      1196(r034):     61(ptr) Variable Function
+      1199(r035):     61(ptr) Variable Function
+      1202(r036):     61(ptr) Variable Function
+      1207(r037):     61(ptr) Variable Function
+      1210(r038):     61(ptr) Variable Function
+      1217(r039):     61(ptr) Variable Function
+      1220(r049):     61(ptr) Variable Function
+      1225(r041):     61(ptr) Variable Function
+      1228(r042):     61(ptr) Variable Function
+      1232(r043):     61(ptr) Variable Function
+      1235(r044):     61(ptr) Variable Function
+      1240(r046):     61(ptr) Variable Function
+            1065:          60 Load 63(inF0)
+            1066:   131(bool) All 1065
+                              Store 1064(r000) 1066
+            1068:          60 Load 63(inF0)
+            1069:          60 ExtInst 1(GLSL.std.450) 4(FAbs) 1068
+                              Store 1067(r001) 1069
+            1070:          60 Load 63(inF0)
+            1071:          60 ExtInst 1(GLSL.std.450) 17(Acos) 1070
+            1073:          60 Load 63(inF0)
+            1074:   131(bool) Any 1073
+                              Store 1072(r003) 1074
+            1076:          60 Load 63(inF0)
+            1077:          60 ExtInst 1(GLSL.std.450) 16(Asin) 1076
+                              Store 1075(r004) 1077
+            1079:          60 Load 63(inF0)
+            1080:          60 ExtInst 1(GLSL.std.450) 18(Atan) 1079
+                              Store 1078(r005) 1080
+            1082:          60 Load 63(inF0)
+            1083:          60 Load 64(inF1)
+            1084:          60 ExtInst 1(GLSL.std.450) 25(Atan2) 1082 1083
+                              Store 1081(r006) 1084
+            1086:          60 Load 63(inF0)
+            1087:          60 ExtInst 1(GLSL.std.450) 9(Ceil) 1086
+                              Store 1085(r007) 1087
+            1088:          60 Load 63(inF0)
+            1091:        1090 FOrdLessThan 1088 1089
+            1092:   131(bool) Any 1091
+                              SelectionMerge 1094 None
+                              BranchConditional 1092 1093 1094
+            1093:               Label
                                 Kill
-            1275:             Label
-            1278:          56 Load 59(inF0)
-            1279:          56 Load 60(inF1)
-            1280:          56 Load 61(inF2)
-            1281:          56 ExtInst 1(GLSL.std.450) 43(FClamp) 1278 1279 1280
-                              Store 1277(r008) 1281
-            1283:          56 Load 59(inF0)
-            1284:          56 ExtInst 1(GLSL.std.450) 14(Cos) 1283
-                              Store 1282(r009) 1284
-            1286:          56 Load 59(inF0)
-            1287:          56 ExtInst 1(GLSL.std.450) 20(Cosh) 1286
-                              Store 1285(r010) 1287
-            1289:          56 Load 59(inF0)
-            1290:          56 DPdx 1289
-                              Store 1288(r011) 1290
-            1292:          56 Load 59(inF0)
-            1293:          56 DPdxCoarse 1292
-                              Store 1291(r012) 1293
-            1295:          56 Load 59(inF0)
-            1296:          56 DPdxFine 1295
-                              Store 1294(r013) 1296
-            1298:          56 Load 59(inF0)
-            1299:          56 DPdy 1298
-                              Store 1297(r014) 1299
-            1301:          56 Load 59(inF0)
-            1302:          56 DPdyCoarse 1301
-                              Store 1300(r015) 1302
-            1304:          56 Load 59(inF0)
-            1305:          56 DPdyFine 1304
-                              Store 1303(r016) 1305
-            1307:          56 Load 59(inF0)
-            1308:          56 ExtInst 1(GLSL.std.450) 12(Degrees) 1307
-                              Store 1306(r017) 1308
-            1310:          56 Load 59(inF0)
-            1311:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1310
-                              Store 1309(r018) 1311
-            1313:          56 Load 59(inF0)
-            1314:          56 ExtInst 1(GLSL.std.450) 27(Exp) 1313
-                              Store 1312(r019) 1314
-            1316:          56 Load 59(inF0)
-            1317:          56 ExtInst 1(GLSL.std.450) 29(Exp2) 1316
-                              Store 1315(R020) 1317
-            1319:          56 Load 59(inF0)
-            1320:          56 ExtInst 1(GLSL.std.450) 8(Floor) 1319
-                              Store 1318(r021) 1320
-            1322:          56 Load 59(inF0)
-            1323:          56 Load 60(inF1)
-            1324:   36(fvec3) CompositeExtract 1322 0
-            1325:   36(fvec3) CompositeExtract 1323 0
-            1326:   36(fvec3) FMod 1324 1325
-            1327:   36(fvec3) CompositeExtract 1322 1
-            1328:   36(fvec3) CompositeExtract 1323 1
-            1329:   36(fvec3) FMod 1327 1328
-            1330:   36(fvec3) CompositeExtract 1322 2
-            1331:   36(fvec3) CompositeExtract 1323 2
-            1332:   36(fvec3) FMod 1330 1331
-            1333:          56 CompositeConstruct 1326 1329 1332
-                              Store 1321(r022) 1333
-            1335:          56 Load 59(inF0)
-            1336:          56 ExtInst 1(GLSL.std.450) 10(Fract) 1335
-                              Store 1334(r023) 1336
-            1338:          56 Load 59(inF0)
-            1340:1339(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 1338
-            1341:  578(ivec3) CompositeExtract 1340 1
-                              Store 60(inF1) 1341
-            1342:          56 CompositeExtract 1340 0
-                              Store 1337(r024) 1342
-            1344:          56 Load 59(inF0)
-            1345:          56 Fwidth 1344
-                              Store 1343(r025) 1345
-            1347:          56 Load 59(inF0)
-            1348:          56 Load 60(inF1)
-            1349:          56 ExtInst 1(GLSL.std.450) 53(Ldexp) 1347 1348
-                              Store 1346(r026) 1349
-            1351:          56 Load 59(inF0)
-            1352:          56 Load 60(inF1)
-            1353:          56 Load 61(inF2)
-            1354:          56 ExtInst 1(GLSL.std.450) 46(FMix) 1351 1352 1353
-                              Store 1350(r026a) 1354
-            1356:          56 Load 59(inF0)
-            1357:          56 ExtInst 1(GLSL.std.450) 28(Log) 1356
-                              Store 1355(r027) 1357
-            1359:          56 Load 59(inF0)
-            1360:          56 ExtInst 1(GLSL.std.450) 30(Log2) 1359
-            1361:          56 MatrixTimesScalar 1360 253
-                              Store 1358(r028) 1361
-            1363:          56 Load 59(inF0)
-            1364:          56 ExtInst 1(GLSL.std.450) 30(Log2) 1363
-                              Store 1362(r029) 1364
-            1366:          56 Load 59(inF0)
-            1367:          56 Load 60(inF1)
-            1368:          56 ExtInst 1(GLSL.std.450) 40(FMax) 1366 1367
-                              Store 1365(r030) 1368
-            1370:          56 Load 59(inF0)
-            1371:          56 Load 60(inF1)
-            1372:          56 ExtInst 1(GLSL.std.450) 37(FMin) 1370 1371
-                              Store 1369(r031) 1372
-            1374:          56 Load 59(inF0)
-            1375:          56 Load 60(inF1)
-            1376:          56 ExtInst 1(GLSL.std.450) 26(Pow) 1374 1375
-                              Store 1373(r032) 1376
-            1378:          56 Load 59(inF0)
-            1379:          56 ExtInst 1(GLSL.std.450) 11(Radians) 1378
-                              Store 1377(r033) 1379
-            1381:          56 Load 59(inF0)
-            1382:          56 ExtInst 1(GLSL.std.450) 2(RoundEven) 1381
-                              Store 1380(r034) 1382
-            1384:          56 Load 59(inF0)
-            1385:          56 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1384
-                              Store 1383(r035) 1385
-            1387:          56 Load 59(inF0)
-            1388:   36(fvec3) CompositeConstruct 165 165 165
-            1389:   36(fvec3) CompositeConstruct 274 274 274
-            1390:          56 ExtInst 1(GLSL.std.450) 43(FClamp) 1387 1388 1389
-                              Store 1386(r036) 1390
-            1392:          56 Load 59(inF0)
-            1393:          56 ExtInst 1(GLSL.std.450) 6(FSign) 1392
-                              Store 1391(r037) 1393
-            1395:          56 Load 59(inF0)
-            1396:          56 ExtInst 1(GLSL.std.450) 13(Sin) 1395
-                              Store 1394(r038) 1396
-            1397:          56 Load 59(inF0)
-            1398:          56 ExtInst 1(GLSL.std.450) 13(Sin) 1397
-                              Store 60(inF1) 1398
-            1399:          56 Load 59(inF0)
-            1400:          56 ExtInst 1(GLSL.std.450) 14(Cos) 1399
-                              Store 61(inF2) 1400
-            1402:          56 Load 59(inF0)
-            1403:          56 ExtInst 1(GLSL.std.450) 19(Sinh) 1402
-                              Store 1401(r039) 1403
-            1405:          56 Load 59(inF0)
-            1406:          56 Load 60(inF1)
-            1407:          56 Load 61(inF2)
-            1408:          56 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1405 1406 1407
-                              Store 1404(r049) 1408
-            1410:          56 Load 59(inF0)
-            1411:          56 ExtInst 1(GLSL.std.450) 31(Sqrt) 1410
-                              Store 1409(r041) 1411
-            1413:          56 Load 59(inF0)
-            1414:          56 Load 60(inF1)
-            1415:          56 ExtInst 1(GLSL.std.450) 48(Step) 1413 1414
-                              Store 1412(r042) 1415
-            1417:          56 Load 59(inF0)
-            1418:          56 ExtInst 1(GLSL.std.450) 15(Tan) 1417
-                              Store 1416(r043) 1418
-            1420:          56 Load 59(inF0)
-            1421:          56 ExtInst 1(GLSL.std.450) 21(Tanh) 1420
-                              Store 1419(r044) 1421
-            1422:          56 Load 59(inF0)
-            1423:          56 Transpose 1422
-            1425:          56 Load 59(inF0)
-            1426:          56 ExtInst 1(GLSL.std.450) 3(Trunc) 1425
-                              Store 1424(r046) 1426
-                              ReturnValue 1428
+            1094:             Label
+            1097:          60 Load 63(inF0)
+            1098:          60 Load 64(inF1)
+            1099:          60 Load 65(inF2)
+            1100:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 1097 1098 1099
+                              Store 1096(r008) 1100
+            1102:          60 Load 63(inF0)
+            1103:          60 ExtInst 1(GLSL.std.450) 14(Cos) 1102
+                              Store 1101(r009) 1103
+            1105:          60 Load 63(inF0)
+            1106:          60 ExtInst 1(GLSL.std.450) 20(Cosh) 1105
+                              Store 1104(r010) 1106
+            1108:          60 Load 63(inF0)
+            1109:          60 DPdx 1108
+                              Store 1107(r011) 1109
+            1111:          60 Load 63(inF0)
+            1112:          60 DPdxCoarse 1111
+                              Store 1110(r012) 1112
+            1114:          60 Load 63(inF0)
+            1115:          60 DPdxFine 1114
+                              Store 1113(r013) 1115
+            1117:          60 Load 63(inF0)
+            1118:          60 DPdy 1117
+                              Store 1116(r014) 1118
+            1120:          60 Load 63(inF0)
+            1121:          60 DPdyCoarse 1120
+                              Store 1119(r015) 1121
+            1123:          60 Load 63(inF0)
+            1124:          60 DPdyFine 1123
+                              Store 1122(r016) 1124
+            1126:          60 Load 63(inF0)
+            1127:          60 ExtInst 1(GLSL.std.450) 12(Degrees) 1126
+                              Store 1125(r017) 1127
+            1129:          60 Load 63(inF0)
+            1130:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1129
+                              Store 1128(r018) 1130
+            1132:          60 Load 63(inF0)
+            1133:          60 ExtInst 1(GLSL.std.450) 27(Exp) 1132
+                              Store 1131(r019) 1133
+            1135:          60 Load 63(inF0)
+            1136:          60 ExtInst 1(GLSL.std.450) 29(Exp2) 1135
+                              Store 1134(R020) 1136
+            1138:          60 Load 63(inF0)
+            1139:          60 ExtInst 1(GLSL.std.450) 8(Floor) 1138
+                              Store 1137(r021) 1139
+            1141:          60 Load 63(inF0)
+            1142:          60 Load 64(inF1)
+            1143:   24(fvec2) CompositeExtract 1141 0
+            1144:   24(fvec2) CompositeExtract 1142 0
+            1145:   24(fvec2) FMod 1143 1144
+            1146:   24(fvec2) CompositeExtract 1141 1
+            1147:   24(fvec2) CompositeExtract 1142 1
+            1148:   24(fvec2) FMod 1146 1147
+            1149:          60 CompositeConstruct 1145 1148
+                              Store 1140(r022) 1149
+            1151:          60 Load 63(inF0)
+            1152:          60 ExtInst 1(GLSL.std.450) 10(Fract) 1151
+                              Store 1150(r023) 1152
+            1154:          60 Load 63(inF0)
+            1156:1155(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 1154
+            1157:  352(ivec2) CompositeExtract 1156 1
+                              Store 64(inF1) 1157
+            1158:          60 CompositeExtract 1156 0
+                              Store 1153(r024) 1158
+            1160:          60 Load 63(inF0)
+            1161:          60 Fwidth 1160
+                              Store 1159(r025) 1161
+            1163:          60 Load 63(inF0)
+            1164:          60 Load 64(inF1)
+            1165:          60 ExtInst 1(GLSL.std.450) 53(Ldexp) 1163 1164
+                              Store 1162(r026) 1165
+            1167:          60 Load 63(inF0)
+            1168:          60 Load 64(inF1)
+            1169:          60 Load 65(inF2)
+            1170:          60 ExtInst 1(GLSL.std.450) 46(FMix) 1167 1168 1169
+                              Store 1166(r026a) 1170
+            1172:          60 Load 63(inF0)
+            1173:          60 ExtInst 1(GLSL.std.450) 28(Log) 1172
+                              Store 1171(r027) 1173
+            1175:          60 Load 63(inF0)
+            1176:          60 ExtInst 1(GLSL.std.450) 30(Log2) 1175
+            1177:          60 MatrixTimesScalar 1176 263
+                              Store 1174(r028) 1177
+            1179:          60 Load 63(inF0)
+            1180:          60 ExtInst 1(GLSL.std.450) 30(Log2) 1179
+                              Store 1178(r029) 1180
+            1182:          60 Load 63(inF0)
+            1183:          60 Load 64(inF1)
+            1184:          60 ExtInst 1(GLSL.std.450) 40(FMax) 1182 1183
+                              Store 1181(r030) 1184
+            1186:          60 Load 63(inF0)
+            1187:          60 Load 64(inF1)
+            1188:          60 ExtInst 1(GLSL.std.450) 37(FMin) 1186 1187
+                              Store 1185(r031) 1188
+            1190:          60 Load 63(inF0)
+            1191:          60 Load 64(inF1)
+            1192:          60 ExtInst 1(GLSL.std.450) 26(Pow) 1190 1191
+                              Store 1189(r032) 1192
+            1194:          60 Load 63(inF0)
+            1195:          60 ExtInst 1(GLSL.std.450) 11(Radians) 1194
+                              Store 1193(r033) 1195
+            1197:          60 Load 63(inF0)
+            1198:          60 ExtInst 1(GLSL.std.450) 2(RoundEven) 1197
+                              Store 1196(r034) 1198
+            1200:          60 Load 63(inF0)
+            1201:          60 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1200
+                              Store 1199(r035) 1201
+            1203:          60 Load 63(inF0)
+            1204:   24(fvec2) CompositeConstruct 175 175
+            1205:   24(fvec2) CompositeConstruct 284 284
+            1206:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 1203 1204 1205
+                              Store 1202(r036) 1206
+            1208:          60 Load 63(inF0)
+            1209:          60 ExtInst 1(GLSL.std.450) 6(FSign) 1208
+                              Store 1207(r037) 1209
+            1211:          60 Load 63(inF0)
+            1212:          60 ExtInst 1(GLSL.std.450) 13(Sin) 1211
+                              Store 1210(r038) 1212
+            1213:          60 Load 63(inF0)
+            1214:          60 ExtInst 1(GLSL.std.450) 13(Sin) 1213
+                              Store 64(inF1) 1214
+            1215:          60 Load 63(inF0)
+            1216:          60 ExtInst 1(GLSL.std.450) 14(Cos) 1215
+                              Store 65(inF2) 1216
+            1218:          60 Load 63(inF0)
+            1219:          60 ExtInst 1(GLSL.std.450) 19(Sinh) 1218
+                              Store 1217(r039) 1219
+            1221:          60 Load 63(inF0)
+            1222:          60 Load 64(inF1)
+            1223:          60 Load 65(inF2)
+            1224:          60 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1221 1222 1223
+                              Store 1220(r049) 1224
+            1226:          60 Load 63(inF0)
+            1227:          60 ExtInst 1(GLSL.std.450) 31(Sqrt) 1226
+                              Store 1225(r041) 1227
+            1229:          60 Load 63(inF0)
+            1230:          60 Load 64(inF1)
+            1231:          60 ExtInst 1(GLSL.std.450) 48(Step) 1229 1230
+                              Store 1228(r042) 1231
+            1233:          60 Load 63(inF0)
+            1234:          60 ExtInst 1(GLSL.std.450) 15(Tan) 1233
+                              Store 1232(r043) 1234
+            1236:          60 Load 63(inF0)
+            1237:          60 ExtInst 1(GLSL.std.450) 21(Tanh) 1236
+                              Store 1235(r044) 1237
+            1238:          60 Load 63(inF0)
+            1239:          60 Transpose 1238
+            1241:          60 Load 63(inF0)
+            1242:          60 ExtInst 1(GLSL.std.450) 3(Trunc) 1241
+                              Store 1240(r046) 1242
+                              ReturnValue 1244
                               FunctionEnd
-71(PixelShaderFunction4x4(mf44;mf44;mf44;):          65 Function None 67
-        68(inF0):     66(ptr) FunctionParameter
-        69(inF1):     66(ptr) FunctionParameter
-        70(inF2):     66(ptr) FunctionParameter
-              72:             Label
-      1431(r000):    122(ptr) Variable Function
-      1434(r001):     66(ptr) Variable Function
-      1439(r003):    122(ptr) Variable Function
-      1442(r004):     66(ptr) Variable Function
-      1445(r005):     66(ptr) Variable Function
-      1448(r006):     66(ptr) Variable Function
-      1452(r007):     66(ptr) Variable Function
-      1463(r008):     66(ptr) Variable Function
-      1468(r009):     66(ptr) Variable Function
-      1471(r010):     66(ptr) Variable Function
-      1474(r011):     66(ptr) Variable Function
-      1477(r012):     66(ptr) Variable Function
-      1480(r013):     66(ptr) Variable Function
-      1483(r014):     66(ptr) Variable Function
-      1486(r015):     66(ptr) Variable Function
-      1489(r016):     66(ptr) Variable Function
-      1492(r017):     66(ptr) Variable Function
-      1495(r018):      7(ptr) Variable Function
-      1498(r019):     66(ptr) Variable Function
-      1501(R020):     66(ptr) Variable Function
-      1504(r021):     66(ptr) Variable Function
-      1507(r022):     66(ptr) Variable Function
-      1523(r023):     66(ptr) Variable Function
-      1526(r024):     66(ptr) Variable Function
-      1532(r025):     66(ptr) Variable Function
-      1535(r026):     66(ptr) Variable Function
-     1539(r026a):     66(ptr) Variable Function
-      1544(r027):     66(ptr) Variable Function
-      1547(r028):     66(ptr) Variable Function
-      1551(r029):     66(ptr) Variable Function
-      1554(r030):     66(ptr) Variable Function
-      1558(r031):     66(ptr) Variable Function
-      1562(r032):     66(ptr) Variable Function
-      1566(r033):     66(ptr) Variable Function
-      1569(r034):     66(ptr) Variable Function
-      1572(r035):     66(ptr) Variable Function
-      1575(r036):     66(ptr) Variable Function
-      1580(r037):     66(ptr) Variable Function
-      1583(r038):     66(ptr) Variable Function
-      1590(r039):     66(ptr) Variable Function
-      1593(r049):     66(ptr) Variable Function
-      1598(r041):     66(ptr) Variable Function
-      1601(r042):     66(ptr) Variable Function
-      1605(r043):     66(ptr) Variable Function
-      1608(r044):     66(ptr) Variable Function
-      1613(r046):     66(ptr) Variable Function
-            1432:          65 Load 68(inF0)
-            1433:   121(bool) All 1432
-                              Store 1431(r000) 1433
-            1435:          65 Load 68(inF0)
-            1436:          65 ExtInst 1(GLSL.std.450) 4(FAbs) 1435
-                              Store 1434(r001) 1436
-            1437:          65 Load 68(inF0)
-            1438:          65 ExtInst 1(GLSL.std.450) 17(Acos) 1437
-            1440:          65 Load 68(inF0)
-            1441:   121(bool) Any 1440
-                              Store 1439(r003) 1441
-            1443:          65 Load 68(inF0)
-            1444:          65 ExtInst 1(GLSL.std.450) 16(Asin) 1443
-                              Store 1442(r004) 1444
-            1446:          65 Load 68(inF0)
-            1447:          65 ExtInst 1(GLSL.std.450) 18(Atan) 1446
-                              Store 1445(r005) 1447
-            1449:          65 Load 68(inF0)
-            1450:          65 Load 69(inF1)
-            1451:          65 ExtInst 1(GLSL.std.450) 25(Atan2) 1449 1450
-                              Store 1448(r006) 1451
-            1453:          65 Load 68(inF0)
-            1454:          65 ExtInst 1(GLSL.std.450) 9(Ceil) 1453
-                              Store 1452(r007) 1454
-            1455:          65 Load 68(inF0)
-            1458:        1457 FOrdLessThan 1455 1456
-            1459:   121(bool) Any 1458
-                              SelectionMerge 1461 None
-                              BranchConditional 1459 1460 1461
-            1460:               Label
+74(PixelShaderFunction3x3(mf33;mf33;mf33;):          68 Function None 70
+        71(inF0):     69(ptr) FunctionParameter
+        72(inF1):     69(ptr) FunctionParameter
+        73(inF2):     69(ptr) FunctionParameter
+              75:             Label
+      1247(r000):    132(ptr) Variable Function
+      1250(r001):     69(ptr) Variable Function
+      1255(r003):    132(ptr) Variable Function
+      1258(r004):     69(ptr) Variable Function
+      1261(r005):     69(ptr) Variable Function
+      1264(r006):     69(ptr) Variable Function
+      1268(r007):     69(ptr) Variable Function
+      1279(r008):     69(ptr) Variable Function
+      1284(r009):     69(ptr) Variable Function
+      1287(r010):     69(ptr) Variable Function
+      1290(r011):     69(ptr) Variable Function
+      1293(r012):     69(ptr) Variable Function
+      1296(r013):     69(ptr) Variable Function
+      1299(r014):     69(ptr) Variable Function
+      1302(r015):     69(ptr) Variable Function
+      1305(r016):     69(ptr) Variable Function
+      1308(r017):     69(ptr) Variable Function
+      1311(r018):      7(ptr) Variable Function
+      1314(r019):     69(ptr) Variable Function
+      1317(R020):     69(ptr) Variable Function
+      1320(r021):     69(ptr) Variable Function
+      1323(r022):     69(ptr) Variable Function
+      1336(r023):     69(ptr) Variable Function
+      1339(r024):     69(ptr) Variable Function
+      1345(r025):     69(ptr) Variable Function
+      1348(r026):     69(ptr) Variable Function
+     1352(r026a):     69(ptr) Variable Function
+      1357(r027):     69(ptr) Variable Function
+      1360(r028):     69(ptr) Variable Function
+      1364(r029):     69(ptr) Variable Function
+      1367(r030):     69(ptr) Variable Function
+      1371(r031):     69(ptr) Variable Function
+      1375(r032):     69(ptr) Variable Function
+      1379(r033):     69(ptr) Variable Function
+      1382(r034):     69(ptr) Variable Function
+      1385(r035):     69(ptr) Variable Function
+      1388(r036):     69(ptr) Variable Function
+      1393(r037):     69(ptr) Variable Function
+      1396(r038):     69(ptr) Variable Function
+      1403(r039):     69(ptr) Variable Function
+      1406(r049):     69(ptr) Variable Function
+      1411(r041):     69(ptr) Variable Function
+      1414(r042):     69(ptr) Variable Function
+      1418(r043):     69(ptr) Variable Function
+      1421(r044):     69(ptr) Variable Function
+      1426(r046):     69(ptr) Variable Function
+            1248:          68 Load 71(inF0)
+            1249:   131(bool) All 1248
+                              Store 1247(r000) 1249
+            1251:          68 Load 71(inF0)
+            1252:          68 ExtInst 1(GLSL.std.450) 4(FAbs) 1251
+                              Store 1250(r001) 1252
+            1253:          68 Load 71(inF0)
+            1254:          68 ExtInst 1(GLSL.std.450) 17(Acos) 1253
+            1256:          68 Load 71(inF0)
+            1257:   131(bool) Any 1256
+                              Store 1255(r003) 1257
+            1259:          68 Load 71(inF0)
+            1260:          68 ExtInst 1(GLSL.std.450) 16(Asin) 1259
+                              Store 1258(r004) 1260
+            1262:          68 Load 71(inF0)
+            1263:          68 ExtInst 1(GLSL.std.450) 18(Atan) 1262
+                              Store 1261(r005) 1263
+            1265:          68 Load 71(inF0)
+            1266:          68 Load 72(inF1)
+            1267:          68 ExtInst 1(GLSL.std.450) 25(Atan2) 1265 1266
+                              Store 1264(r006) 1267
+            1269:          68 Load 71(inF0)
+            1270:          68 ExtInst 1(GLSL.std.450) 9(Ceil) 1269
+                              Store 1268(r007) 1270
+            1271:          68 Load 71(inF0)
+            1274:        1273 FOrdLessThan 1271 1272
+            1275:   131(bool) Any 1274
+                              SelectionMerge 1277 None
+                              BranchConditional 1275 1276 1277
+            1276:               Label
                                 Kill
-            1461:             Label
-            1464:          65 Load 68(inF0)
-            1465:          65 Load 69(inF1)
-            1466:          65 Load 70(inF2)
-            1467:          65 ExtInst 1(GLSL.std.450) 43(FClamp) 1464 1465 1466
-                              Store 1463(r008) 1467
-            1469:          65 Load 68(inF0)
-            1470:          65 ExtInst 1(GLSL.std.450) 14(Cos) 1469
-                              Store 1468(r009) 1470
-            1472:          65 Load 68(inF0)
-            1473:          65 ExtInst 1(GLSL.std.450) 20(Cosh) 1472
-                              Store 1471(r010) 1473
-            1475:          65 Load 68(inF0)
-            1476:          65 DPdx 1475
-                              Store 1474(r011) 1476
-            1478:          65 Load 68(inF0)
-            1479:          65 DPdxCoarse 1478
-                              Store 1477(r012) 1479
-            1481:          65 Load 68(inF0)
-            1482:          65 DPdxFine 1481
-                              Store 1480(r013) 1482
-            1484:          65 Load 68(inF0)
-            1485:          65 DPdy 1484
-                              Store 1483(r014) 1485
-            1487:          65 Load 68(inF0)
-            1488:          65 DPdyCoarse 1487
-                              Store 1486(r015) 1488
-            1490:          65 Load 68(inF0)
-            1491:          65 DPdyFine 1490
-                              Store 1489(r016) 1491
-            1493:          65 Load 68(inF0)
-            1494:          65 ExtInst 1(GLSL.std.450) 12(Degrees) 1493
-                              Store 1492(r017) 1494
-            1496:          65 Load 68(inF0)
-            1497:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1496
-                              Store 1495(r018) 1497
-            1499:          65 Load 68(inF0)
-            1500:          65 ExtInst 1(GLSL.std.450) 27(Exp) 1499
-                              Store 1498(r019) 1500
-            1502:          65 Load 68(inF0)
-            1503:          65 ExtInst 1(GLSL.std.450) 29(Exp2) 1502
-                              Store 1501(R020) 1503
-            1505:          65 Load 68(inF0)
-            1506:          65 ExtInst 1(GLSL.std.450) 8(Floor) 1505
-                              Store 1504(r021) 1506
-            1508:          65 Load 68(inF0)
-            1509:          65 Load 69(inF1)
-            1510:   64(fvec4) CompositeExtract 1508 0
-            1511:   64(fvec4) CompositeExtract 1509 0
-            1512:   64(fvec4) FMod 1510 1511
-            1513:   64(fvec4) CompositeExtract 1508 1
-            1514:   64(fvec4) CompositeExtract 1509 1
-            1515:   64(fvec4) FMod 1513 1514
-            1516:   64(fvec4) CompositeExtract 1508 2
-            1517:   64(fvec4) CompositeExtract 1509 2
-            1518:   64(fvec4) FMod 1516 1517
-            1519:   64(fvec4) CompositeExtract 1508 3
-            1520:   64(fvec4) CompositeExtract 1509 3
-            1521:   64(fvec4) FMod 1519 1520
-            1522:          65 CompositeConstruct 1512 1515 1518 1521
-                              Store 1507(r022) 1522
-            1524:          65 Load 68(inF0)
-            1525:          65 ExtInst 1(GLSL.std.450) 10(Fract) 1524
-                              Store 1523(r023) 1525
-            1527:          65 Load 68(inF0)
-            1529:1528(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 1527
-            1530:  825(ivec4) CompositeExtract 1529 1
-                              Store 69(inF1) 1530
-            1531:          65 CompositeExtract 1529 0
-                              Store 1526(r024) 1531
-            1533:          65 Load 68(inF0)
-            1534:          65 Fwidth 1533
-                              Store 1532(r025) 1534
-            1536:          65 Load 68(inF0)
-            1537:          65 Load 69(inF1)
-            1538:          65 ExtInst 1(GLSL.std.450) 53(Ldexp) 1536 1537
-                              Store 1535(r026) 1538
-            1540:          65 Load 68(inF0)
-            1541:          65 Load 69(inF1)
-            1542:          65 Load 70(inF2)
-            1543:          65 ExtInst 1(GLSL.std.450) 46(FMix) 1540 1541 1542
-                              Store 1539(r026a) 1543
-            1545:          65 Load 68(inF0)
-            1546:          65 ExtInst 1(GLSL.std.450) 28(Log) 1545
-                              Store 1544(r027) 1546
-            1548:          65 Load 68(inF0)
-            1549:          65 ExtInst 1(GLSL.std.450) 30(Log2) 1548
-            1550:          65 MatrixTimesScalar 1549 253
-                              Store 1547(r028) 1550
-            1552:          65 Load 68(inF0)
-            1553:          65 ExtInst 1(GLSL.std.450) 30(Log2) 1552
-                              Store 1551(r029) 1553
-            1555:          65 Load 68(inF0)
-            1556:          65 Load 69(inF1)
-            1557:          65 ExtInst 1(GLSL.std.450) 40(FMax) 1555 1556
-                              Store 1554(r030) 1557
-            1559:          65 Load 68(inF0)
-            1560:          65 Load 69(inF1)
-            1561:          65 ExtInst 1(GLSL.std.450) 37(FMin) 1559 1560
-                              Store 1558(r031) 1561
-            1563:          65 Load 68(inF0)
-            1564:          65 Load 69(inF1)
-            1565:          65 ExtInst 1(GLSL.std.450) 26(Pow) 1563 1564
-                              Store 1562(r032) 1565
-            1567:          65 Load 68(inF0)
-            1568:          65 ExtInst 1(GLSL.std.450) 11(Radians) 1567
-                              Store 1566(r033) 1568
-            1570:          65 Load 68(inF0)
-            1571:          65 ExtInst 1(GLSL.std.450) 2(RoundEven) 1570
-                              Store 1569(r034) 1571
-            1573:          65 Load 68(inF0)
-            1574:          65 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1573
-                              Store 1572(r035) 1574
-            1576:          65 Load 68(inF0)
-            1577:   64(fvec4) CompositeConstruct 165 165 165 165
-            1578:   64(fvec4) CompositeConstruct 274 274 274 274
-            1579:          65 ExtInst 1(GLSL.std.450) 43(FClamp) 1576 1577 1578
-                              Store 1575(r036) 1579
-            1581:          65 Load 68(inF0)
-            1582:          65 ExtInst 1(GLSL.std.450) 6(FSign) 1581
-                              Store 1580(r037) 1582
-            1584:          65 Load 68(inF0)
-            1585:          65 ExtInst 1(GLSL.std.450) 13(Sin) 1584
-                              Store 1583(r038) 1585
-            1586:          65 Load 68(inF0)
-            1587:          65 ExtInst 1(GLSL.std.450) 13(Sin) 1586
-                              Store 69(inF1) 1587
-            1588:          65 Load 68(inF0)
-            1589:          65 ExtInst 1(GLSL.std.450) 14(Cos) 1588
-                              Store 70(inF2) 1589
-            1591:          65 Load 68(inF0)
-            1592:          65 ExtInst 1(GLSL.std.450) 19(Sinh) 1591
-                              Store 1590(r039) 1592
-            1594:          65 Load 68(inF0)
-            1595:          65 Load 69(inF1)
-            1596:          65 Load 70(inF2)
-            1597:          65 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1594 1595 1596
-                              Store 1593(r049) 1597
-            1599:          65 Load 68(inF0)
-            1600:          65 ExtInst 1(GLSL.std.450) 31(Sqrt) 1599
-                              Store 1598(r041) 1600
-            1602:          65 Load 68(inF0)
-            1603:          65 Load 69(inF1)
-            1604:          65 ExtInst 1(GLSL.std.450) 48(Step) 1602 1603
-                              Store 1601(r042) 1604
-            1606:          65 Load 68(inF0)
-            1607:          65 ExtInst 1(GLSL.std.450) 15(Tan) 1606
-                              Store 1605(r043) 1607
-            1609:          65 Load 68(inF0)
-            1610:          65 ExtInst 1(GLSL.std.450) 21(Tanh) 1609
-                              Store 1608(r044) 1610
-            1611:          65 Load 68(inF0)
-            1612:          65 Transpose 1611
-            1614:          65 Load 68(inF0)
-            1615:          65 ExtInst 1(GLSL.std.450) 3(Trunc) 1614
-                              Store 1613(r046) 1615
-                              ReturnValue 1617
+            1277:             Label
+            1280:          68 Load 71(inF0)
+            1281:          68 Load 72(inF1)
+            1282:          68 Load 73(inF2)
+            1283:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 1280 1281 1282
+                              Store 1279(r008) 1283
+            1285:          68 Load 71(inF0)
+            1286:          68 ExtInst 1(GLSL.std.450) 14(Cos) 1285
+                              Store 1284(r009) 1286
+            1288:          68 Load 71(inF0)
+            1289:          68 ExtInst 1(GLSL.std.450) 20(Cosh) 1288
+                              Store 1287(r010) 1289
+            1291:          68 Load 71(inF0)
+            1292:          68 DPdx 1291
+                              Store 1290(r011) 1292
+            1294:          68 Load 71(inF0)
+            1295:          68 DPdxCoarse 1294
+                              Store 1293(r012) 1295
+            1297:          68 Load 71(inF0)
+            1298:          68 DPdxFine 1297
+                              Store 1296(r013) 1298
+            1300:          68 Load 71(inF0)
+            1301:          68 DPdy 1300
+                              Store 1299(r014) 1301
+            1303:          68 Load 71(inF0)
+            1304:          68 DPdyCoarse 1303
+                              Store 1302(r015) 1304
+            1306:          68 Load 71(inF0)
+            1307:          68 DPdyFine 1306
+                              Store 1305(r016) 1307
+            1309:          68 Load 71(inF0)
+            1310:          68 ExtInst 1(GLSL.std.450) 12(Degrees) 1309
+                              Store 1308(r017) 1310
+            1312:          68 Load 71(inF0)
+            1313:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1312
+                              Store 1311(r018) 1313
+            1315:          68 Load 71(inF0)
+            1316:          68 ExtInst 1(GLSL.std.450) 27(Exp) 1315
+                              Store 1314(r019) 1316
+            1318:          68 Load 71(inF0)
+            1319:          68 ExtInst 1(GLSL.std.450) 29(Exp2) 1318
+                              Store 1317(R020) 1319
+            1321:          68 Load 71(inF0)
+            1322:          68 ExtInst 1(GLSL.std.450) 8(Floor) 1321
+                              Store 1320(r021) 1322
+            1324:          68 Load 71(inF0)
+            1325:          68 Load 72(inF1)
+            1326:   36(fvec3) CompositeExtract 1324 0
+            1327:   36(fvec3) CompositeExtract 1325 0
+            1328:   36(fvec3) FMod 1326 1327
+            1329:   36(fvec3) CompositeExtract 1324 1
+            1330:   36(fvec3) CompositeExtract 1325 1
+            1331:   36(fvec3) FMod 1329 1330
+            1332:   36(fvec3) CompositeExtract 1324 2
+            1333:   36(fvec3) CompositeExtract 1325 2
+            1334:   36(fvec3) FMod 1332 1333
+            1335:          68 CompositeConstruct 1328 1331 1334
+                              Store 1323(r022) 1335
+            1337:          68 Load 71(inF0)
+            1338:          68 ExtInst 1(GLSL.std.450) 10(Fract) 1337
+                              Store 1336(r023) 1338
+            1340:          68 Load 71(inF0)
+            1342:1341(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 1340
+            1343:  588(ivec3) CompositeExtract 1342 1
+                              Store 72(inF1) 1343
+            1344:          68 CompositeExtract 1342 0
+                              Store 1339(r024) 1344
+            1346:          68 Load 71(inF0)
+            1347:          68 Fwidth 1346
+                              Store 1345(r025) 1347
+            1349:          68 Load 71(inF0)
+            1350:          68 Load 72(inF1)
+            1351:          68 ExtInst 1(GLSL.std.450) 53(Ldexp) 1349 1350
+                              Store 1348(r026) 1351
+            1353:          68 Load 71(inF0)
+            1354:          68 Load 72(inF1)
+            1355:          68 Load 73(inF2)
+            1356:          68 ExtInst 1(GLSL.std.450) 46(FMix) 1353 1354 1355
+                              Store 1352(r026a) 1356
+            1358:          68 Load 71(inF0)
+            1359:          68 ExtInst 1(GLSL.std.450) 28(Log) 1358
+                              Store 1357(r027) 1359
+            1361:          68 Load 71(inF0)
+            1362:          68 ExtInst 1(GLSL.std.450) 30(Log2) 1361
+            1363:          68 MatrixTimesScalar 1362 263
+                              Store 1360(r028) 1363
+            1365:          68 Load 71(inF0)
+            1366:          68 ExtInst 1(GLSL.std.450) 30(Log2) 1365
+                              Store 1364(r029) 1366
+            1368:          68 Load 71(inF0)
+            1369:          68 Load 72(inF1)
+            1370:          68 ExtInst 1(GLSL.std.450) 40(FMax) 1368 1369
+                              Store 1367(r030) 1370
+            1372:          68 Load 71(inF0)
+            1373:          68 Load 72(inF1)
+            1374:          68 ExtInst 1(GLSL.std.450) 37(FMin) 1372 1373
+                              Store 1371(r031) 1374
+            1376:          68 Load 71(inF0)
+            1377:          68 Load 72(inF1)
+            1378:          68 ExtInst 1(GLSL.std.450) 26(Pow) 1376 1377
+                              Store 1375(r032) 1378
+            1380:          68 Load 71(inF0)
+            1381:          68 ExtInst 1(GLSL.std.450) 11(Radians) 1380
+                              Store 1379(r033) 1381
+            1383:          68 Load 71(inF0)
+            1384:          68 ExtInst 1(GLSL.std.450) 2(RoundEven) 1383
+                              Store 1382(r034) 1384
+            1386:          68 Load 71(inF0)
+            1387:          68 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1386
+                              Store 1385(r035) 1387
+            1389:          68 Load 71(inF0)
+            1390:   36(fvec3) CompositeConstruct 175 175 175
+            1391:   36(fvec3) CompositeConstruct 284 284 284
+            1392:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 1389 1390 1391
+                              Store 1388(r036) 1392
+            1394:          68 Load 71(inF0)
+            1395:          68 ExtInst 1(GLSL.std.450) 6(FSign) 1394
+                              Store 1393(r037) 1395
+            1397:          68 Load 71(inF0)
+            1398:          68 ExtInst 1(GLSL.std.450) 13(Sin) 1397
+                              Store 1396(r038) 1398
+            1399:          68 Load 71(inF0)
+            1400:          68 ExtInst 1(GLSL.std.450) 13(Sin) 1399
+                              Store 72(inF1) 1400
+            1401:          68 Load 71(inF0)
+            1402:          68 ExtInst 1(GLSL.std.450) 14(Cos) 1401
+                              Store 73(inF2) 1402
+            1404:          68 Load 71(inF0)
+            1405:          68 ExtInst 1(GLSL.std.450) 19(Sinh) 1404
+                              Store 1403(r039) 1405
+            1407:          68 Load 71(inF0)
+            1408:          68 Load 72(inF1)
+            1409:          68 Load 73(inF2)
+            1410:          68 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1407 1408 1409
+                              Store 1406(r049) 1410
+            1412:          68 Load 71(inF0)
+            1413:          68 ExtInst 1(GLSL.std.450) 31(Sqrt) 1412
+                              Store 1411(r041) 1413
+            1415:          68 Load 71(inF0)
+            1416:          68 Load 72(inF1)
+            1417:          68 ExtInst 1(GLSL.std.450) 48(Step) 1415 1416
+                              Store 1414(r042) 1417
+            1419:          68 Load 71(inF0)
+            1420:          68 ExtInst 1(GLSL.std.450) 15(Tan) 1419
+                              Store 1418(r043) 1420
+            1422:          68 Load 71(inF0)
+            1423:          68 ExtInst 1(GLSL.std.450) 21(Tanh) 1422
+                              Store 1421(r044) 1423
+            1424:          68 Load 71(inF0)
+            1425:          68 Transpose 1424
+            1427:          68 Load 71(inF0)
+            1428:          68 ExtInst 1(GLSL.std.450) 3(Trunc) 1427
+                              Store 1426(r046) 1428
+                              ReturnValue 1430
                               FunctionEnd
-80(TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;):           2 Function None 73
-        74(inF0):      7(ptr) FunctionParameter
-        75(inF1):      7(ptr) FunctionParameter
-       76(inFV0):     25(ptr) FunctionParameter
-       77(inFV1):     25(ptr) FunctionParameter
-       78(inFM0):     49(ptr) FunctionParameter
-       79(inFM1):     49(ptr) FunctionParameter
-              81:             Label
-        1620(r0):      7(ptr) Variable Function
-        1624(r1):     25(ptr) Variable Function
-        1628(r2):     25(ptr) Variable Function
-        1632(r3):      7(ptr) Variable Function
-        1636(r4):     25(ptr) Variable Function
-        1640(r5):     25(ptr) Variable Function
-        1644(r6):     49(ptr) Variable Function
-        1648(r7):     49(ptr) Variable Function
-        1652(r8):     49(ptr) Variable Function
-            1621:    6(float) Load 74(inF0)
-            1622:    6(float) Load 75(inF1)
-            1623:    6(float) FMul 1621 1622
-                              Store 1620(r0) 1623
-            1625:   24(fvec2) Load 76(inFV0)
-            1626:    6(float) Load 74(inF0)
-            1627:   24(fvec2) VectorTimesScalar 1625 1626
-                              Store 1624(r1) 1627
-            1629:    6(float) Load 74(inF0)
-            1630:   24(fvec2) Load 76(inFV0)
-            1631:   24(fvec2) VectorTimesScalar 1630 1629
-                              Store 1628(r2) 1631
-            1633:   24(fvec2) Load 76(inFV0)
-            1634:   24(fvec2) Load 77(inFV1)
-            1635:    6(float) Dot 1633 1634
-                              Store 1632(r3) 1635
-            1637:          48 Load 78(inFM0)
-            1638:   24(fvec2) Load 76(inFV0)
-            1639:   24(fvec2) MatrixTimesVector 1637 1638
-                              Store 1636(r4) 1639
-            1641:   24(fvec2) Load 76(inFV0)
-            1642:          48 Load 78(inFM0)
-            1643:   24(fvec2) VectorTimesMatrix 1641 1642
-                              Store 1640(r5) 1643
-            1645:          48 Load 78(inFM0)
-            1646:    6(float) Load 74(inF0)
-            1647:          48 MatrixTimesScalar 1645 1646
-                              Store 1644(r6) 1647
-            1649:    6(float) Load 74(inF0)
-            1650:          48 Load 78(inFM0)
-            1651:          48 MatrixTimesScalar 1650 1649
-                              Store 1648(r7) 1651
-            1653:          48 Load 78(inFM0)
-            1654:          48 Load 79(inFM1)
-            1655:          48 MatrixTimesMatrix 1653 1654
-                              Store 1652(r8) 1655
+82(PixelShaderFunction4x4(mf44;mf44;mf44;):          76 Function None 78
+        79(inF0):     77(ptr) FunctionParameter
+        80(inF1):     77(ptr) FunctionParameter
+        81(inF2):     77(ptr) FunctionParameter
+              83:             Label
+      1433(r000):    132(ptr) Variable Function
+      1436(r001):     77(ptr) Variable Function
+      1441(r003):    132(ptr) Variable Function
+      1444(r004):     77(ptr) Variable Function
+      1447(r005):     77(ptr) Variable Function
+      1450(r006):     77(ptr) Variable Function
+      1454(r007):     77(ptr) Variable Function
+      1465(r008):     77(ptr) Variable Function
+      1470(r009):     77(ptr) Variable Function
+      1473(r010):     77(ptr) Variable Function
+      1476(r011):     77(ptr) Variable Function
+      1479(r012):     77(ptr) Variable Function
+      1482(r013):     77(ptr) Variable Function
+      1485(r014):     77(ptr) Variable Function
+      1488(r015):     77(ptr) Variable Function
+      1491(r016):     77(ptr) Variable Function
+      1494(r017):     77(ptr) Variable Function
+      1497(r018):      7(ptr) Variable Function
+      1500(r019):     77(ptr) Variable Function
+      1503(R020):     77(ptr) Variable Function
+      1506(r021):     77(ptr) Variable Function
+      1509(r022):     77(ptr) Variable Function
+      1525(r023):     77(ptr) Variable Function
+      1528(r024):     77(ptr) Variable Function
+      1534(r025):     77(ptr) Variable Function
+      1537(r026):     77(ptr) Variable Function
+     1541(r026a):     77(ptr) Variable Function
+      1546(r027):     77(ptr) Variable Function
+      1549(r028):     77(ptr) Variable Function
+      1553(r029):     77(ptr) Variable Function
+      1556(r030):     77(ptr) Variable Function
+      1560(r031):     77(ptr) Variable Function
+      1564(r032):     77(ptr) Variable Function
+      1568(r033):     77(ptr) Variable Function
+      1571(r034):     77(ptr) Variable Function
+      1574(r035):     77(ptr) Variable Function
+      1577(r036):     77(ptr) Variable Function
+      1582(r037):     77(ptr) Variable Function
+      1585(r038):     77(ptr) Variable Function
+      1592(r039):     77(ptr) Variable Function
+      1595(r049):     77(ptr) Variable Function
+      1600(r041):     77(ptr) Variable Function
+      1603(r042):     77(ptr) Variable Function
+      1607(r043):     77(ptr) Variable Function
+      1610(r044):     77(ptr) Variable Function
+      1615(r046):     77(ptr) Variable Function
+            1434:          76 Load 79(inF0)
+            1435:   131(bool) All 1434
+                              Store 1433(r000) 1435
+            1437:          76 Load 79(inF0)
+            1438:          76 ExtInst 1(GLSL.std.450) 4(FAbs) 1437
+                              Store 1436(r001) 1438
+            1439:          76 Load 79(inF0)
+            1440:          76 ExtInst 1(GLSL.std.450) 17(Acos) 1439
+            1442:          76 Load 79(inF0)
+            1443:   131(bool) Any 1442
+                              Store 1441(r003) 1443
+            1445:          76 Load 79(inF0)
+            1446:          76 ExtInst 1(GLSL.std.450) 16(Asin) 1445
+                              Store 1444(r004) 1446
+            1448:          76 Load 79(inF0)
+            1449:          76 ExtInst 1(GLSL.std.450) 18(Atan) 1448
+                              Store 1447(r005) 1449
+            1451:          76 Load 79(inF0)
+            1452:          76 Load 80(inF1)
+            1453:          76 ExtInst 1(GLSL.std.450) 25(Atan2) 1451 1452
+                              Store 1450(r006) 1453
+            1455:          76 Load 79(inF0)
+            1456:          76 ExtInst 1(GLSL.std.450) 9(Ceil) 1455
+                              Store 1454(r007) 1456
+            1457:          76 Load 79(inF0)
+            1460:        1459 FOrdLessThan 1457 1458
+            1461:   131(bool) Any 1460
+                              SelectionMerge 1463 None
+                              BranchConditional 1461 1462 1463
+            1462:               Label
+                                Kill
+            1463:             Label
+            1466:          76 Load 79(inF0)
+            1467:          76 Load 80(inF1)
+            1468:          76 Load 81(inF2)
+            1469:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 1466 1467 1468
+                              Store 1465(r008) 1469
+            1471:          76 Load 79(inF0)
+            1472:          76 ExtInst 1(GLSL.std.450) 14(Cos) 1471
+                              Store 1470(r009) 1472
+            1474:          76 Load 79(inF0)
+            1475:          76 ExtInst 1(GLSL.std.450) 20(Cosh) 1474
+                              Store 1473(r010) 1475
+            1477:          76 Load 79(inF0)
+            1478:          76 DPdx 1477
+                              Store 1476(r011) 1478
+            1480:          76 Load 79(inF0)
+            1481:          76 DPdxCoarse 1480
+                              Store 1479(r012) 1481
+            1483:          76 Load 79(inF0)
+            1484:          76 DPdxFine 1483
+                              Store 1482(r013) 1484
+            1486:          76 Load 79(inF0)
+            1487:          76 DPdy 1486
+                              Store 1485(r014) 1487
+            1489:          76 Load 79(inF0)
+            1490:          76 DPdyCoarse 1489
+                              Store 1488(r015) 1490
+            1492:          76 Load 79(inF0)
+            1493:          76 DPdyFine 1492
+                              Store 1491(r016) 1493
+            1495:          76 Load 79(inF0)
+            1496:          76 ExtInst 1(GLSL.std.450) 12(Degrees) 1495
+                              Store 1494(r017) 1496
+            1498:          76 Load 79(inF0)
+            1499:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1498
+                              Store 1497(r018) 1499
+            1501:          76 Load 79(inF0)
+            1502:          76 ExtInst 1(GLSL.std.450) 27(Exp) 1501
+                              Store 1500(r019) 1502
+            1504:          76 Load 79(inF0)
+            1505:          76 ExtInst 1(GLSL.std.450) 29(Exp2) 1504
+                              Store 1503(R020) 1505
+            1507:          76 Load 79(inF0)
+            1508:          76 ExtInst 1(GLSL.std.450) 8(Floor) 1507
+                              Store 1506(r021) 1508
+            1510:          76 Load 79(inF0)
+            1511:          76 Load 80(inF1)
+            1512:   48(fvec4) CompositeExtract 1510 0
+            1513:   48(fvec4) CompositeExtract 1511 0
+            1514:   48(fvec4) FMod 1512 1513
+            1515:   48(fvec4) CompositeExtract 1510 1
+            1516:   48(fvec4) CompositeExtract 1511 1
+            1517:   48(fvec4) FMod 1515 1516
+            1518:   48(fvec4) CompositeExtract 1510 2
+            1519:   48(fvec4) CompositeExtract 1511 2
+            1520:   48(fvec4) FMod 1518 1519
+            1521:   48(fvec4) CompositeExtract 1510 3
+            1522:   48(fvec4) CompositeExtract 1511 3
+            1523:   48(fvec4) FMod 1521 1522
+            1524:          76 CompositeConstruct 1514 1517 1520 1523
+                              Store 1509(r022) 1524
+            1526:          76 Load 79(inF0)
+            1527:          76 ExtInst 1(GLSL.std.450) 10(Fract) 1526
+                              Store 1525(r023) 1527
+            1529:          76 Load 79(inF0)
+            1531:1530(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 1529
+            1532:  833(ivec4) CompositeExtract 1531 1
+                              Store 80(inF1) 1532
+            1533:          76 CompositeExtract 1531 0
+                              Store 1528(r024) 1533
+            1535:          76 Load 79(inF0)
+            1536:          76 Fwidth 1535
+                              Store 1534(r025) 1536
+            1538:          76 Load 79(inF0)
+            1539:          76 Load 80(inF1)
+            1540:          76 ExtInst 1(GLSL.std.450) 53(Ldexp) 1538 1539
+                              Store 1537(r026) 1540
+            1542:          76 Load 79(inF0)
+            1543:          76 Load 80(inF1)
+            1544:          76 Load 81(inF2)
+            1545:          76 ExtInst 1(GLSL.std.450) 46(FMix) 1542 1543 1544
+                              Store 1541(r026a) 1545
+            1547:          76 Load 79(inF0)
+            1548:          76 ExtInst 1(GLSL.std.450) 28(Log) 1547
+                              Store 1546(r027) 1548
+            1550:          76 Load 79(inF0)
+            1551:          76 ExtInst 1(GLSL.std.450) 30(Log2) 1550
+            1552:          76 MatrixTimesScalar 1551 263
+                              Store 1549(r028) 1552
+            1554:          76 Load 79(inF0)
+            1555:          76 ExtInst 1(GLSL.std.450) 30(Log2) 1554
+                              Store 1553(r029) 1555
+            1557:          76 Load 79(inF0)
+            1558:          76 Load 80(inF1)
+            1559:          76 ExtInst 1(GLSL.std.450) 40(FMax) 1557 1558
+                              Store 1556(r030) 1559
+            1561:          76 Load 79(inF0)
+            1562:          76 Load 80(inF1)
+            1563:          76 ExtInst 1(GLSL.std.450) 37(FMin) 1561 1562
+                              Store 1560(r031) 1563
+            1565:          76 Load 79(inF0)
+            1566:          76 Load 80(inF1)
+            1567:          76 ExtInst 1(GLSL.std.450) 26(Pow) 1565 1566
+                              Store 1564(r032) 1567
+            1569:          76 Load 79(inF0)
+            1570:          76 ExtInst 1(GLSL.std.450) 11(Radians) 1569
+                              Store 1568(r033) 1570
+            1572:          76 Load 79(inF0)
+            1573:          76 ExtInst 1(GLSL.std.450) 2(RoundEven) 1572
+                              Store 1571(r034) 1573
+            1575:          76 Load 79(inF0)
+            1576:          76 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1575
+                              Store 1574(r035) 1576
+            1578:          76 Load 79(inF0)
+            1579:   48(fvec4) CompositeConstruct 175 175 175 175
+            1580:   48(fvec4) CompositeConstruct 284 284 284 284
+            1581:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 1578 1579 1580
+                              Store 1577(r036) 1581
+            1583:          76 Load 79(inF0)
+            1584:          76 ExtInst 1(GLSL.std.450) 6(FSign) 1583
+                              Store 1582(r037) 1584
+            1586:          76 Load 79(inF0)
+            1587:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1586
+                              Store 1585(r038) 1587
+            1588:          76 Load 79(inF0)
+            1589:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1588
+                              Store 80(inF1) 1589
+            1590:          76 Load 79(inF0)
+            1591:          76 ExtInst 1(GLSL.std.450) 14(Cos) 1590
+                              Store 81(inF2) 1591
+            1593:          76 Load 79(inF0)
+            1594:          76 ExtInst 1(GLSL.std.450) 19(Sinh) 1593
+                              Store 1592(r039) 1594
+            1596:          76 Load 79(inF0)
+            1597:          76 Load 80(inF1)
+            1598:          76 Load 81(inF2)
+            1599:          76 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1596 1597 1598
+                              Store 1595(r049) 1599
+            1601:          76 Load 79(inF0)
+            1602:          76 ExtInst 1(GLSL.std.450) 31(Sqrt) 1601
+                              Store 1600(r041) 1602
+            1604:          76 Load 79(inF0)
+            1605:          76 Load 80(inF1)
+            1606:          76 ExtInst 1(GLSL.std.450) 48(Step) 1604 1605
+                              Store 1603(r042) 1606
+            1608:          76 Load 79(inF0)
+            1609:          76 ExtInst 1(GLSL.std.450) 15(Tan) 1608
+                              Store 1607(r043) 1609
+            1611:          76 Load 79(inF0)
+            1612:          76 ExtInst 1(GLSL.std.450) 21(Tanh) 1611
+                              Store 1610(r044) 1612
+            1613:          76 Load 79(inF0)
+            1614:          76 Transpose 1613
+            1616:          76 Load 79(inF0)
+            1617:          76 ExtInst 1(GLSL.std.450) 3(Trunc) 1616
+                              Store 1615(r046) 1617
+                              ReturnValue 1619
+                              FunctionEnd
+91(TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;):           2 Function None 84
+        85(inF0):      7(ptr) FunctionParameter
+        86(inF1):      7(ptr) FunctionParameter
+       87(inFV0):     25(ptr) FunctionParameter
+       88(inFV1):     25(ptr) FunctionParameter
+       89(inFM0):     61(ptr) FunctionParameter
+       90(inFM1):     61(ptr) FunctionParameter
+              92:             Label
+        1622(r0):      7(ptr) Variable Function
+        1626(r1):     25(ptr) Variable Function
+        1630(r2):     25(ptr) Variable Function
+        1634(r3):      7(ptr) Variable Function
+        1638(r4):     25(ptr) Variable Function
+        1642(r5):     25(ptr) Variable Function
+        1646(r6):     61(ptr) Variable Function
+        1650(r7):     61(ptr) Variable Function
+        1654(r8):     61(ptr) Variable Function
+            1623:    6(float) Load 86(inF1)
+            1624:    6(float) Load 85(inF0)
+            1625:    6(float) FMul 1623 1624
+                              Store 1622(r0) 1625
+            1627:    6(float) Load 85(inF0)
+            1628:   24(fvec2) Load 87(inFV0)
+            1629:   24(fvec2) VectorTimesScalar 1628 1627
+                              Store 1626(r1) 1629
+            1631:   24(fvec2) Load 87(inFV0)
+            1632:    6(float) Load 85(inF0)
+            1633:   24(fvec2) VectorTimesScalar 1631 1632
+                              Store 1630(r2) 1633
+            1635:   24(fvec2) Load 87(inFV0)
+            1636:   24(fvec2) Load 88(inFV1)
+            1637:    6(float) Dot 1635 1636
+                              Store 1634(r3) 1637
+            1639:   24(fvec2) Load 87(inFV0)
+            1640:          60 Load 89(inFM0)
+            1641:   24(fvec2) VectorTimesMatrix 1639 1640
+                              Store 1638(r4) 1641
+            1643:          60 Load 89(inFM0)
+            1644:   24(fvec2) Load 87(inFV0)
+            1645:   24(fvec2) MatrixTimesVector 1643 1644
+                              Store 1642(r5) 1645
+            1647:    6(float) Load 85(inF0)
+            1648:          60 Load 89(inFM0)
+            1649:          60 MatrixTimesScalar 1648 1647
+                              Store 1646(r6) 1649
+            1651:          60 Load 89(inFM0)
+            1652:    6(float) Load 85(inF0)
+            1653:          60 MatrixTimesScalar 1651 1652
+                              Store 1650(r7) 1653
+            1655:          60 Load 90(inFM1)
+            1656:          60 Load 89(inFM0)
+            1657:          60 MatrixTimesMatrix 1655 1656
+                              Store 1654(r8) 1657
                               Return
                               FunctionEnd
-89(TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;):           2 Function None 82
-        83(inF0):      7(ptr) FunctionParameter
-        84(inF1):      7(ptr) FunctionParameter
-       85(inFV0):     37(ptr) FunctionParameter
-       86(inFV1):     37(ptr) FunctionParameter
-       87(inFM0):     57(ptr) FunctionParameter
-       88(inFM1):     57(ptr) FunctionParameter
-              90:             Label
-        1656(r0):      7(ptr) Variable Function
-        1660(r1):     37(ptr) Variable Function
-        1664(r2):     37(ptr) Variable Function
-        1668(r3):      7(ptr) Variable Function
-        1672(r4):     37(ptr) Variable Function
-        1676(r5):     37(ptr) Variable Function
-        1680(r6):     57(ptr) Variable Function
-        1684(r7):     57(ptr) Variable Function
-        1688(r8):     57(ptr) Variable Function
-            1657:    6(float) Load 83(inF0)
-            1658:    6(float) Load 84(inF1)
-            1659:    6(float) FMul 1657 1658
-                              Store 1656(r0) 1659
-            1661:   36(fvec3) Load 85(inFV0)
-            1662:    6(float) Load 83(inF0)
-            1663:   36(fvec3) VectorTimesScalar 1661 1662
-                              Store 1660(r1) 1663
-            1665:    6(float) Load 83(inF0)
-            1666:   36(fvec3) Load 85(inFV0)
-            1667:   36(fvec3) VectorTimesScalar 1666 1665
-                              Store 1664(r2) 1667
-            1669:   36(fvec3) Load 85(inFV0)
-            1670:   36(fvec3) Load 86(inFV1)
-            1671:    6(float) Dot 1669 1670
-                              Store 1668(r3) 1671
-            1673:          56 Load 87(inFM0)
-            1674:   36(fvec3) Load 85(inFV0)
-            1675:   36(fvec3) MatrixTimesVector 1673 1674
-                              Store 1672(r4) 1675
-            1677:   36(fvec3) Load 85(inFV0)
-            1678:          56 Load 87(inFM0)
-            1679:   36(fvec3) VectorTimesMatrix 1677 1678
-                              Store 1676(r5) 1679
-            1681:          56 Load 87(inFM0)
-            1682:    6(float) Load 83(inF0)
-            1683:          56 MatrixTimesScalar 1681 1682
-                              Store 1680(r6) 1683
-            1685:    6(float) Load 83(inF0)
-            1686:          56 Load 87(inFM0)
-            1687:          56 MatrixTimesScalar 1686 1685
-                              Store 1684(r7) 1687
-            1689:          56 Load 87(inFM0)
-            1690:          56 Load 88(inFM1)
-            1691:          56 MatrixTimesMatrix 1689 1690
-                              Store 1688(r8) 1691
+100(TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;):           2 Function None 93
+        94(inF0):      7(ptr) FunctionParameter
+        95(inF1):      7(ptr) FunctionParameter
+       96(inFV0):     37(ptr) FunctionParameter
+       97(inFV1):     37(ptr) FunctionParameter
+       98(inFM0):     69(ptr) FunctionParameter
+       99(inFM1):     69(ptr) FunctionParameter
+             101:             Label
+        1658(r0):      7(ptr) Variable Function
+        1662(r1):     37(ptr) Variable Function
+        1666(r2):     37(ptr) Variable Function
+        1670(r3):      7(ptr) Variable Function
+        1674(r4):     37(ptr) Variable Function
+        1678(r5):     37(ptr) Variable Function
+        1682(r6):     69(ptr) Variable Function
+        1686(r7):     69(ptr) Variable Function
+        1690(r8):     69(ptr) Variable Function
+            1659:    6(float) Load 95(inF1)
+            1660:    6(float) Load 94(inF0)
+            1661:    6(float) FMul 1659 1660
+                              Store 1658(r0) 1661
+            1663:    6(float) Load 94(inF0)
+            1664:   36(fvec3) Load 96(inFV0)
+            1665:   36(fvec3) VectorTimesScalar 1664 1663
+                              Store 1662(r1) 1665
+            1667:   36(fvec3) Load 96(inFV0)
+            1668:    6(float) Load 94(inF0)
+            1669:   36(fvec3) VectorTimesScalar 1667 1668
+                              Store 1666(r2) 1669
+            1671:   36(fvec3) Load 96(inFV0)
+            1672:   36(fvec3) Load 97(inFV1)
+            1673:    6(float) Dot 1671 1672
+                              Store 1670(r3) 1673
+            1675:   36(fvec3) Load 96(inFV0)
+            1676:          68 Load 98(inFM0)
+            1677:   36(fvec3) VectorTimesMatrix 1675 1676
+                              Store 1674(r4) 1677
+            1679:          68 Load 98(inFM0)
+            1680:   36(fvec3) Load 96(inFV0)
+            1681:   36(fvec3) MatrixTimesVector 1679 1680
+                              Store 1678(r5) 1681
+            1683:    6(float) Load 94(inF0)
+            1684:          68 Load 98(inFM0)
+            1685:          68 MatrixTimesScalar 1684 1683
+                              Store 1682(r6) 1685
+            1687:          68 Load 98(inFM0)
+            1688:    6(float) Load 94(inF0)
+            1689:          68 MatrixTimesScalar 1687 1688
+                              Store 1686(r7) 1689
+            1691:          68 Load 99(inFM1)
+            1692:          68 Load 98(inFM0)
+            1693:          68 MatrixTimesMatrix 1691 1692
+                              Store 1690(r8) 1693
                               Return
                               FunctionEnd
-99(TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;):           2 Function None 92
-        93(inF0):      7(ptr) FunctionParameter
-        94(inF1):      7(ptr) FunctionParameter
-       95(inFV0):     91(ptr) FunctionParameter
-       96(inFV1):     91(ptr) FunctionParameter
-       97(inFM0):     66(ptr) FunctionParameter
-       98(inFM1):     66(ptr) FunctionParameter
-             100:             Label
-        1692(r0):      7(ptr) Variable Function
-        1696(r1):     91(ptr) Variable Function
-        1700(r2):     91(ptr) Variable Function
-        1704(r3):      7(ptr) Variable Function
-        1708(r4):     91(ptr) Variable Function
-        1712(r5):     91(ptr) Variable Function
-        1716(r6):     66(ptr) Variable Function
-        1720(r7):     66(ptr) Variable Function
-        1724(r8):     66(ptr) Variable Function
-            1693:    6(float) Load 93(inF0)
-            1694:    6(float) Load 94(inF1)
-            1695:    6(float) FMul 1693 1694
-                              Store 1692(r0) 1695
-            1697:   64(fvec4) Load 95(inFV0)
-            1698:    6(float) Load 93(inF0)
-            1699:   64(fvec4) VectorTimesScalar 1697 1698
-                              Store 1696(r1) 1699
-            1701:    6(float) Load 93(inF0)
-            1702:   64(fvec4) Load 95(inFV0)
-            1703:   64(fvec4) VectorTimesScalar 1702 1701
-                              Store 1700(r2) 1703
-            1705:   64(fvec4) Load 95(inFV0)
-            1706:   64(fvec4) Load 96(inFV1)
-            1707:    6(float) Dot 1705 1706
-                              Store 1704(r3) 1707
-            1709:          65 Load 97(inFM0)
-            1710:   64(fvec4) Load 95(inFV0)
-            1711:   64(fvec4) MatrixTimesVector 1709 1710
-                              Store 1708(r4) 1711
-            1713:   64(fvec4) Load 95(inFV0)
-            1714:          65 Load 97(inFM0)
-            1715:   64(fvec4) VectorTimesMatrix 1713 1714
-                              Store 1712(r5) 1715
-            1717:          65 Load 97(inFM0)
-            1718:    6(float) Load 93(inF0)
-            1719:          65 MatrixTimesScalar 1717 1718
-                              Store 1716(r6) 1719
-            1721:    6(float) Load 93(inF0)
-            1722:          65 Load 97(inFM0)
-            1723:          65 MatrixTimesScalar 1722 1721
-                              Store 1720(r7) 1723
-            1725:          65 Load 97(inFM0)
-            1726:          65 Load 98(inFM1)
-            1727:          65 MatrixTimesMatrix 1725 1726
-                              Store 1724(r8) 1727
+109(TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;):           2 Function None 102
+       103(inF0):      7(ptr) FunctionParameter
+       104(inF1):      7(ptr) FunctionParameter
+      105(inFV0):     49(ptr) FunctionParameter
+      106(inFV1):     49(ptr) FunctionParameter
+      107(inFM0):     77(ptr) FunctionParameter
+      108(inFM1):     77(ptr) FunctionParameter
+             110:             Label
+        1694(r0):      7(ptr) Variable Function
+        1698(r1):     49(ptr) Variable Function
+        1702(r2):     49(ptr) Variable Function
+        1706(r3):      7(ptr) Variable Function
+        1710(r4):     49(ptr) Variable Function
+        1714(r5):     49(ptr) Variable Function
+        1718(r6):     77(ptr) Variable Function
+        1722(r7):     77(ptr) Variable Function
+        1726(r8):     77(ptr) Variable Function
+            1695:    6(float) Load 104(inF1)
+            1696:    6(float) Load 103(inF0)
+            1697:    6(float) FMul 1695 1696
+                              Store 1694(r0) 1697
+            1699:    6(float) Load 103(inF0)
+            1700:   48(fvec4) Load 105(inFV0)
+            1701:   48(fvec4) VectorTimesScalar 1700 1699
+                              Store 1698(r1) 1701
+            1703:   48(fvec4) Load 105(inFV0)
+            1704:    6(float) Load 103(inF0)
+            1705:   48(fvec4) VectorTimesScalar 1703 1704
+                              Store 1702(r2) 1705
+            1707:   48(fvec4) Load 105(inFV0)
+            1708:   48(fvec4) Load 106(inFV1)
+            1709:    6(float) Dot 1707 1708
+                              Store 1706(r3) 1709
+            1711:   48(fvec4) Load 105(inFV0)
+            1712:          76 Load 107(inFM0)
+            1713:   48(fvec4) VectorTimesMatrix 1711 1712
+                              Store 1710(r4) 1713
+            1715:          76 Load 107(inFM0)
+            1716:   48(fvec4) Load 105(inFV0)
+            1717:   48(fvec4) MatrixTimesVector 1715 1716
+                              Store 1714(r5) 1717
+            1719:    6(float) Load 103(inF0)
+            1720:          76 Load 107(inFM0)
+            1721:          76 MatrixTimesScalar 1720 1719
+                              Store 1718(r6) 1721
+            1723:          76 Load 107(inFM0)
+            1724:    6(float) Load 103(inF0)
+            1725:          76 MatrixTimesScalar 1723 1724
+                              Store 1722(r7) 1725
+            1727:          76 Load 108(inFM1)
+            1728:          76 Load 107(inFM0)
+            1729:          76 MatrixTimesMatrix 1727 1728
+                              Store 1726(r8) 1729
                               Return
                               FunctionEnd
-119(TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42;):           2 Function None 109
-       110(inF0):      7(ptr) FunctionParameter
-       111(inF1):      7(ptr) FunctionParameter
-      112(inFV2):     25(ptr) FunctionParameter
-      113(inFV3):     37(ptr) FunctionParameter
-    114(inFM2x3):    102(ptr) FunctionParameter
-    115(inFM3x2):    104(ptr) FunctionParameter
-    116(inFM3x3):     57(ptr) FunctionParameter
-    117(inFM3x4):    106(ptr) FunctionParameter
-    118(inFM2x4):    108(ptr) FunctionParameter
-             120:             Label
-       1728(r00):      7(ptr) Variable Function
-       1732(r01):     25(ptr) Variable Function
-       1736(r02):     37(ptr) Variable Function
-       1740(r03):     25(ptr) Variable Function
-       1744(r04):     37(ptr) Variable Function
-       1748(r05):      7(ptr) Variable Function
-       1752(r06):      7(ptr) Variable Function
-       1756(r07):     37(ptr) Variable Function
-       1760(r08):     25(ptr) Variable Function
-       1764(r09):     25(ptr) Variable Function
-       1768(r10):     37(ptr) Variable Function
-       1772(r11):    102(ptr) Variable Function
-       1776(r12):    104(ptr) Variable Function
-       1780(r13):     49(ptr) Variable Function
-       1784(r14):    102(ptr) Variable Function
-       1788(r15):    108(ptr) Variable Function
-       1792(r16):    106(ptr) Variable Function
-            1729:    6(float) Load 110(inF0)
-            1730:    6(float) Load 111(inF1)
-            1731:    6(float) FMul 1729 1730
-                              Store 1728(r00) 1731
-            1733:   24(fvec2) Load 112(inFV2)
-            1734:    6(float) Load 110(inF0)
-            1735:   24(fvec2) VectorTimesScalar 1733 1734
-                              Store 1732(r01) 1735
-            1737:   36(fvec3) Load 113(inFV3)
-            1738:    6(float) Load 110(inF0)
-            1739:   36(fvec3) VectorTimesScalar 1737 1738
-                              Store 1736(r02) 1739
-            1741:    6(float) Load 110(inF0)
-            1742:   24(fvec2) Load 112(inFV2)
-            1743:   24(fvec2) VectorTimesScalar 1742 1741
-                              Store 1740(r03) 1743
-            1745:    6(float) Load 110(inF0)
-            1746:   36(fvec3) Load 113(inFV3)
-            1747:   36(fvec3) VectorTimesScalar 1746 1745
-                              Store 1744(r04) 1747
-            1749:   24(fvec2) Load 112(inFV2)
-            1750:   24(fvec2) Load 112(inFV2)
-            1751:    6(float) Dot 1749 1750
-                              Store 1748(r05) 1751
-            1753:   36(fvec3) Load 113(inFV3)
-            1754:   36(fvec3) Load 113(inFV3)
-            1755:    6(float) Dot 1753 1754
-                              Store 1752(r06) 1755
-            1757:   24(fvec2) Load 112(inFV2)
-            1758:         101 Load 114(inFM2x3)
-            1759:   36(fvec3) VectorTimesMatrix 1757 1758
-                              Store 1756(r07) 1759
-            1761:   36(fvec3) Load 113(inFV3)
-            1762:         103 Load 115(inFM3x2)
-            1763:   24(fvec2) VectorTimesMatrix 1761 1762
-                              Store 1760(r08) 1763
-            1765:         101 Load 114(inFM2x3)
-            1766:   36(fvec3) Load 113(inFV3)
-            1767:   24(fvec2) MatrixTimesVector 1765 1766
-                              Store 1764(r09) 1767
-            1769:         103 Load 115(inFM3x2)
-            1770:   24(fvec2) Load 112(inFV2)
-            1771:   36(fvec3) MatrixTimesVector 1769 1770
-                              Store 1768(r10) 1771
-            1773:         101 Load 114(inFM2x3)
-            1774:    6(float) Load 110(inF0)
-            1775:         101 MatrixTimesScalar 1773 1774
-                              Store 1772(r11) 1775
-            1777:         103 Load 115(inFM3x2)
-            1778:    6(float) Load 110(inF0)
-            1779:         103 MatrixTimesScalar 1777 1778
-                              Store 1776(r12) 1779
-            1781:         101 Load 114(inFM2x3)
-            1782:         103 Load 115(inFM3x2)
-            1783:          48 MatrixTimesMatrix 1781 1782
-                              Store 1780(r13) 1783
-            1785:         101 Load 114(inFM2x3)
-            1786:          56 Load 116(inFM3x3)
-            1787:         101 MatrixTimesMatrix 1785 1786
-                              Store 1784(r14) 1787
-            1789:         101 Load 114(inFM2x3)
-            1790:         105 Load 117(inFM3x4)
-            1791:         107 MatrixTimesMatrix 1789 1790
-                              Store 1788(r15) 1791
-            1793:         103 Load 115(inFM3x2)
-            1794:         107 Load 118(inFM2x4)
-            1795:         105 MatrixTimesMatrix 1793 1794
-                              Store 1792(r16) 1795
+129(TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;):           2 Function None 119
+       120(inF0):      7(ptr) FunctionParameter
+       121(inF1):      7(ptr) FunctionParameter
+      122(inFV2):     25(ptr) FunctionParameter
+      123(inFV3):     37(ptr) FunctionParameter
+    124(inFM2x3):    112(ptr) FunctionParameter
+    125(inFM3x2):    114(ptr) FunctionParameter
+    126(inFM3x3):     69(ptr) FunctionParameter
+    127(inFM3x4):    116(ptr) FunctionParameter
+    128(inFM2x4):    118(ptr) FunctionParameter
+             130:             Label
+       1730(r00):      7(ptr) Variable Function
+       1734(r01):     25(ptr) Variable Function
+       1738(r02):     37(ptr) Variable Function
+       1742(r03):     25(ptr) Variable Function
+       1746(r04):     37(ptr) Variable Function
+       1750(r05):      7(ptr) Variable Function
+       1754(r06):      7(ptr) Variable Function
+       1758(r07):     37(ptr) Variable Function
+       1762(r08):     25(ptr) Variable Function
+       1766(r09):     25(ptr) Variable Function
+       1770(r10):     37(ptr) Variable Function
+       1774(r11):    112(ptr) Variable Function
+       1778(r12):    114(ptr) Variable Function
+       1782(r13):     61(ptr) Variable Function
+       1786(r14):    112(ptr) Variable Function
+       1790(r15):    118(ptr) Variable Function
+       1794(r16):    116(ptr) Variable Function
+            1731:    6(float) Load 121(inF1)
+            1732:    6(float) Load 120(inF0)
+            1733:    6(float) FMul 1731 1732
+                              Store 1730(r00) 1733
+            1735:    6(float) Load 120(inF0)
+            1736:   24(fvec2) Load 122(inFV2)
+            1737:   24(fvec2) VectorTimesScalar 1736 1735
+                              Store 1734(r01) 1737
+            1739:    6(float) Load 120(inF0)
+            1740:   36(fvec3) Load 123(inFV3)
+            1741:   36(fvec3) VectorTimesScalar 1740 1739
+                              Store 1738(r02) 1741
+            1743:   24(fvec2) Load 122(inFV2)
+            1744:    6(float) Load 120(inF0)
+            1745:   24(fvec2) VectorTimesScalar 1743 1744
+                              Store 1742(r03) 1745
+            1747:   36(fvec3) Load 123(inFV3)
+            1748:    6(float) Load 120(inF0)
+            1749:   36(fvec3) VectorTimesScalar 1747 1748
+                              Store 1746(r04) 1749
+            1751:   24(fvec2) Load 122(inFV2)
+            1752:   24(fvec2) Load 122(inFV2)
+            1753:    6(float) Dot 1751 1752
+                              Store 1750(r05) 1753
+            1755:   36(fvec3) Load 123(inFV3)
+            1756:   36(fvec3) Load 123(inFV3)
+            1757:    6(float) Dot 1755 1756
+                              Store 1754(r06) 1757
+            1759:         111 Load 124(inFM2x3)
+            1760:   24(fvec2) Load 122(inFV2)
+            1761:   36(fvec3) MatrixTimesVector 1759 1760
+                              Store 1758(r07) 1761
+            1763:         113 Load 125(inFM3x2)
+            1764:   36(fvec3) Load 123(inFV3)
+            1765:   24(fvec2) MatrixTimesVector 1763 1764
+                              Store 1762(r08) 1765
+            1767:   36(fvec3) Load 123(inFV3)
+            1768:         111 Load 124(inFM2x3)
+            1769:   24(fvec2) VectorTimesMatrix 1767 1768
+                              Store 1766(r09) 1769
+            1771:   24(fvec2) Load 122(inFV2)
+            1772:         113 Load 125(inFM3x2)
+            1773:   36(fvec3) VectorTimesMatrix 1771 1772
+                              Store 1770(r10) 1773
+            1775:    6(float) Load 120(inF0)
+            1776:         111 Load 124(inFM2x3)
+            1777:         111 MatrixTimesScalar 1776 1775
+                              Store 1774(r11) 1777
+            1779:    6(float) Load 120(inF0)
+            1780:         113 Load 125(inFM3x2)
+            1781:         113 MatrixTimesScalar 1780 1779
+                              Store 1778(r12) 1781
+            1783:         113 Load 125(inFM3x2)
+            1784:         111 Load 124(inFM2x3)
+            1785:          60 MatrixTimesMatrix 1783 1784
+                              Store 1782(r13) 1785
+            1787:          68 Load 126(inFM3x3)
+            1788:         111 Load 124(inFM2x3)
+            1789:         111 MatrixTimesMatrix 1787 1788
+                              Store 1786(r14) 1789
+            1791:         115 Load 127(inFM3x4)
+            1792:         111 Load 124(inFM2x3)
+            1793:         117 MatrixTimesMatrix 1791 1792
+                              Store 1790(r15) 1793
+            1795:         117 Load 128(inFM2x4)
+            1796:         113 Load 125(inFM3x2)
+            1797:         115 MatrixTimesMatrix 1795 1796
+                              Store 1794(r16) 1797
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.lit.frag.out b/Test/baseResults/hlsl.intrinsics.lit.frag.out
index fe6f93c..eb3cee7 100644
--- a/Test/baseResults/hlsl.intrinsics.lit.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.lit.frag.out
@@ -2,11 +2,11 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(f1;f1;f1; (global void)
+0:2  Function Definition: PixelShaderFunction(f1;f1;f1; (global void)
 0:2    Function Parameters: 
-0:2      'n_dot_l' (in float)
-0:2      'n_dot_h' (in float)
-0:2      'm' (in float)
+0:2      'n_dot_l' (layout(location=0 ) in float)
+0:2      'n_dot_h' (layout(location=1 ) in float)
+0:2      'm' (layout(location=2 ) in float)
 0:?     Sequence
 0:3      Sequence
 0:3        move second child to first child (temp 4-component vector of float)
@@ -15,15 +15,15 @@
 0:3            Constant:
 0:3              1.000000
 0:3            max (temp float)
-0:3              'n_dot_l' (in float)
+0:3              'n_dot_l' (layout(location=0 ) in float)
 0:3              Constant:
 0:3                0.000000
 0:3            Test condition and select (temp float)
 0:3              Condition
 0:3              Compare Less Than (temp bool)
 0:3                min (temp float)
-0:3                  'n_dot_l' (in float)
-0:3                  'n_dot_h' (in float)
+0:3                  'n_dot_l' (layout(location=0 ) in float)
+0:3                  'n_dot_h' (layout(location=1 ) in float)
 0:3                Constant:
 0:3                  0.000000
 0:3              true case
@@ -31,11 +31,14 @@
 0:3                0.000000
 0:3              false case
 0:3              component-wise multiply (temp float)
-0:3                'n_dot_h' (in float)
-0:3                'm' (in float)
+0:3                'n_dot_h' (layout(location=1 ) in float)
+0:3                'm' (layout(location=2 ) in float)
 0:3            Constant:
 0:3              1.000000
 0:?   Linker Objects
+0:?     'n_dot_l' (layout(location=0 ) in float)
+0:?     'n_dot_h' (layout(location=1 ) in float)
+0:?     'm' (layout(location=2 ) in float)
 
 
 Linked fragment stage:
@@ -44,11 +47,11 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(f1;f1;f1; (global void)
+0:2  Function Definition: PixelShaderFunction(f1;f1;f1; (global void)
 0:2    Function Parameters: 
-0:2      'n_dot_l' (in float)
-0:2      'n_dot_h' (in float)
-0:2      'm' (in float)
+0:2      'n_dot_l' (layout(location=0 ) in float)
+0:2      'n_dot_h' (layout(location=1 ) in float)
+0:2      'm' (layout(location=2 ) in float)
 0:?     Sequence
 0:3      Sequence
 0:3        move second child to first child (temp 4-component vector of float)
@@ -57,15 +60,15 @@
 0:3            Constant:
 0:3              1.000000
 0:3            max (temp float)
-0:3              'n_dot_l' (in float)
+0:3              'n_dot_l' (layout(location=0 ) in float)
 0:3              Constant:
 0:3                0.000000
 0:3            Test condition and select (temp float)
 0:3              Condition
 0:3              Compare Less Than (temp bool)
 0:3                min (temp float)
-0:3                  'n_dot_l' (in float)
-0:3                  'n_dot_h' (in float)
+0:3                  'n_dot_l' (layout(location=0 ) in float)
+0:3                  'n_dot_h' (layout(location=1 ) in float)
 0:3                Constant:
 0:3                  0.000000
 0:3              true case
@@ -73,11 +76,14 @@
 0:3                0.000000
 0:3              false case
 0:3              component-wise multiply (temp float)
-0:3                'n_dot_h' (in float)
-0:3                'm' (in float)
+0:3                'n_dot_h' (layout(location=1 ) in float)
+0:3                'm' (layout(location=2 ) in float)
 0:3            Constant:
 0:3              1.000000
 0:?   Linker Objects
+0:?     'n_dot_l' (layout(location=0 ) in float)
+0:?     'n_dot_h' (layout(location=1 ) in float)
+0:?     'm' (layout(location=2 ) in float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
@@ -88,12 +94,14 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "PixelShaderFunction" 12 19 28
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 9  "r0"
                               Name 12  "n_dot_l"
                               Name 19  "n_dot_h"
                               Name 28  "m"
+                              Decorate 12(n_dot_l) Location 0
+                              Decorate 19(n_dot_h) Location 1
+                              Decorate 28(m) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/hlsl.intrinsics.negative.comp.out b/Test/baseResults/hlsl.intrinsics.negative.comp.out
index 043fa82..0100864 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.comp.out
@@ -1,508 +1,72 @@
 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:56  Function Definition: ComputeShaderFunctionS(f1;f1;f1;i1; (global float)
+0:? Sequence
+0:2  Function Definition: ComputeShaderFunctionS(f1;f1;f1;i1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:2      'inF1' (in float)
 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
-0:65  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
+0:57  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
 0:57    Function Parameters: 
 0:57      'inF0' (in 1-component vector of float)
 0:57      'inF1' (in 1-component vector of float)
 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
-0:112  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
+0:66  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
 0:66    Function Parameters: 
 0:66      'inF0' (in 2-component vector of float)
 0:66      'inF1' (in 2-component vector of float)
 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
 0:?           2.000000
-0:157  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
+0:113  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
 0:113    Function Parameters: 
 0:113      'inF0' (in 3-component vector of float)
 0:113      'inF1' (in 3-component vector of float)
 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
 0:?           2.000000
 0:?           3.000000
-0:202  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
+0:158  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
 0:158    Function Parameters: 
-0:158      'inF0' (in 4-component vector of float)
-0:158      'inF1' (in 4-component vector of float)
-0:158      'inF2' (in 4-component vector of float)
-0:158      'inI0' (in 4-component vector of int)
+0:158      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:158      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:158      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:158      'inI0' (layout(location=3 ) 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
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
+0:199      Sequence
+0:199        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:199        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inI0' (layout(location=3 ) in 4-component vector of int)
 
 
 Linked compute stage:
@@ -510,357 +74,182 @@
 
 Shader version: 450
 local_size = (1, 1, 1)
-ERROR: node is still EOpNull!
-0:56  Function Definition: ComputeShaderFunctionS(f1;f1;f1;i1; (global float)
+0:? Sequence
+0:2  Function Definition: ComputeShaderFunctionS(f1;f1;f1;i1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:2      'inF1' (in float)
 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
-0:65  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
+0:57  Function Definition: ComputeShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
 0:57    Function Parameters: 
 0:57      'inF0' (in 1-component vector of float)
 0:57      'inF1' (in 1-component vector of float)
 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
-0:112  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
+0:66  Function Definition: ComputeShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
 0:66    Function Parameters: 
 0:66      'inF0' (in 2-component vector of float)
 0:66      'inF1' (in 2-component vector of float)
 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
 0:?           2.000000
-0:157  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
+0:113  Function Definition: ComputeShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
 0:113    Function Parameters: 
 0:113      'inF0' (in 3-component vector of float)
 0:113      'inF1' (in 3-component vector of float)
 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
 0:?           2.000000
 0:?           3.000000
-0:202  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
+0:158  Function Definition: ComputeShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
 0:158    Function Parameters: 
-0:158      'inF0' (in 4-component vector of float)
-0:158      'inF1' (in 4-component vector of float)
-0:158      'inF2' (in 4-component vector of float)
-0:158      'inI0' (in 4-component vector of int)
+0:158      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:158      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:158      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:158      'inI0' (layout(location=3 ) 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
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
+0:199      Sequence
+0:199        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:199        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inI0' (layout(location=3 ) in 4-component vector of int)
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 72
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "ComputeShaderFunction" 61 66 67 68 71
+                              ExecutionMode 4 LocalSize 1 1 1
+                              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"
+                              Name 61  "@entryPointOutput"
+                              Name 66  "inF0"
+                              Name 67  "inF1"
+                              Name 68  "inF2"
+                              Name 71  "inI0"
+                              Decorate 61(@entryPointOutput) Location 0
+                              Decorate 66(inF0) Location 0
+                              Decorate 67(inF1) Location 1
+                              Decorate 68(inF2) Location 2
+                              Decorate 71(inI0) Location 3
+               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:             TypePointer Output 59(fvec4)
+61(@entryPointOutput):     60(ptr) Variable Output
+              62:    6(float) Constant 1082130432
+              63:   59(fvec4) ConstantComposite 50 51 55 62
+              65:             TypePointer Input 59(fvec4)
+        66(inF0):     65(ptr) Variable Input
+        67(inF1):     65(ptr) Variable Input
+        68(inF2):     65(ptr) Variable Input
+              69:             TypeVector 8(int) 4
+              70:             TypePointer Input 69(ivec4)
+        71(inI0):     70(ptr) Variable Input
+4(ComputeShaderFunction):           2 Function None 3
+               5:             Label
+                              Store 61(@entryPointOutput) 63
+                              Return
+                              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.frag.out b/Test/baseResults/hlsl.intrinsics.negative.frag.out
index 829b699..2244e8b 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.frag.out
@@ -1,50 +1,24 @@
 hlsl.intrinsics.negative.frag
-ERROR: 0:5: 'asdouble' : no matching overloaded function found 
-ERROR: 0:6: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:7: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: 'cross' : no matching overloaded function found 
-ERROR: 0:9: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:10: 'determinant' : no matching overloaded function found 
-ERROR: 0:12: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:13: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:14: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:23: 'length' : no matching overloaded function found 
-ERROR: 0:24: 'msad4' : no matching overloaded function found 
-ERROR: 0:25: 'normalize' : no matching overloaded function found 
-ERROR: 0:26: 'reflect' : no matching overloaded function found 
-ERROR: 0:27: 'refract' : no matching overloaded function found 
+ERROR: 0:12: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:28: 'refract' : no matching overloaded function found 
-ERROR: 0:29: 'reversebits' : no matching overloaded function found 
 ERROR: 0:30: 'transpose' : no matching overloaded function found 
 ERROR: 0:39: 'GetRenderTargetSamplePosition' : no matching overloaded function found 
-ERROR: 0:46: 'asdouble' : no matching overloaded function found 
+ERROR: 0:46: 'asdouble' : double2 conversion not implemented 
 ERROR: 0:47: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:48: 'countbits' : no matching overloaded function found 
 ERROR: 0:49: 'cross' : no matching overloaded function found 
 ERROR: 0:50: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:51: 'determinant' : no matching overloaded function found 
-ERROR: 0:52: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:53: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:54: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:56: 'reversebits' : no matching overloaded function found 
+ERROR: 0:52: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:57: 'transpose' : no matching overloaded function found 
 ERROR: 0:64: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:65: 'countbits' : no matching overloaded function found 
 ERROR: 0:66: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:67: 'determinant' : no matching overloaded function found 
-ERROR: 0:68: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:69: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:70: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:72: 'reversebits' : no matching overloaded function found 
+ERROR: 0:68: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:73: 'transpose' : no matching overloaded function found 
 ERROR: 0:81: 'CheckAccessFullyMapped' : no matching overloaded function found 
-ERROR: 0:82: 'countbits' : no matching overloaded function found 
-ERROR: 0:83: 'cross' : no matching overloaded function found 
 ERROR: 0:84: 'determinant' : no matching overloaded function found 
-ERROR: 0:85: 'f16tof32' : no matching overloaded function found 
-ERROR: 0:86: 'firstbithigh' : no matching overloaded function found 
-ERROR: 0:87: 'firstbitlow' : no matching overloaded function found 
-ERROR: 0:89: 'reversebits' : no matching overloaded function found 
+ERROR: 0:85: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:90: 'transpose' : no matching overloaded function found 
 ERROR: 0:117: 'countbits' : no matching overloaded function found 
 ERROR: 0:117: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
@@ -85,57 +59,90 @@
 ERROR: 0:133: 'reflect' : no matching overloaded function found 
 ERROR: 0:133: 'refract' : no matching overloaded function found 
 ERROR: 0:133: 'reversebits' : no matching overloaded function found 
-ERROR: 86 compilation errors.  No code generated.
+ERROR: 60 compilation errors.  No code generated.
 
 
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:35  Function Definition: PixelShaderFunctionS(f1;f1;f1;i1; (global float)
+0:2  Function Definition: PixelShaderFunctionS(f1;f1;f1;i1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:2      'inF1' (in float)
 0:2      'inF2' (in float)
 0:2      'inI0' (in int)
 0:?     Sequence
-0:5      Constant:
-0:5        0.000000
-0:6      Constant:
-0:6        0.000000
-0:7      Constant:
-0:7        0.000000
-0:8      Constant:
-0:8        0.000000
-0:9      Constant:
-0:9        0.000000
+0:5      uint64BitsToDouble (temp double)
+0:5        Construct uvec2 (temp 2-component vector of uint)
+0:5          Convert float to uint (temp uint)
+0:5            'inF0' (in float)
+0:5          Convert float to uint (temp uint)
+0:5            'inF1' (in float)
+0:6      Function Call: CheckAccessFullyMapped(u1; (global bool)
+0:6        Constant:
+0:6          3 (const uint)
+0:7      bitCount (global uint)
+0:7        Convert float to uint (temp uint)
+0:7          'inF0' (in float)
+0:8      cross-product (global 3-component vector of float)
+0:8        Construct vec3 (in 3-component vector of float)
+0:8          'inF0' (in float)
+0:8        Construct vec3 (in 3-component vector of float)
+0:8          'inF1' (in float)
+0:9      Function Call: D3DCOLORtoUBYTE4(vf4; (global 4-component vector of int)
+0:9        Construct vec4 (in 4-component vector of float)
+0:9          'inF0' (in float)
 0:10      Constant:
 0:10        0.000000
-0:12      Constant:
-0:12        0.000000
-0:13      Constant:
-0:13        0.000000
-0:14      Constant:
-0:14        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:12      ERROR: Bad unary op
+ (global float)
+0:12        Convert float to uint (temp uint)
+0:12          'inF0' (in float)
+0:13      findMSB (global uint)
+0:13        Convert float to uint (temp uint)
+0:13          'inF0' (in float)
+0:14      findLSB (global uint)
+0:14        Convert float to uint (temp uint)
+0:14          'inF0' (in float)
+0:23      length (global float)
+0:23        Construct vec2 (in 2-component vector of float)
+0:23          'inF0' (in float)
+0:24      Function Call: msad4(u1;vu2;vu4; (global 4-component vector of uint)
+0:24        Convert float to uint (temp uint)
+0:24          'inF0' (in float)
+0:24        Constant:
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:24        Constant:
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:25      normalize (global 2-component vector of float)
+0:25        Construct vec2 (in 2-component vector of float)
+0:25          'inF0' (in float)
+0:26      reflect (global 2-component vector of float)
+0:26        Construct vec2 (in 2-component vector of float)
+0:26          'inF0' (in float)
+0:26        Construct vec2 (in 2-component vector of float)
+0:26          'inF1' (in float)
+0:27      refract (global 2-component vector of float)
+0:27        Construct vec2 (in 2-component vector of float)
+0:27          'inF0' (in float)
+0:27        Construct vec2 (in 2-component vector of float)
+0:27          'inF1' (in float)
+0:27        'inF2' (in float)
 0:28      Constant:
 0:28        0.000000
-0:29      Constant:
-0:29        0.000000
+0:29      bitFieldReverse (global uint)
+0:29        Convert float to uint (temp uint)
+0:29          'inF0' (in float)
 0:30      Constant:
 0:30        0.000000
 0:32      Branch: Return with expression
 0:32        Constant:
 0:32          0.000000
-0:44  Function Definition: PixelShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
+0:36  Function Definition: PixelShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
 0:36    Function Parameters: 
 0:36      'inF0' (in 1-component vector of float)
 0:36      'inF1' (in 1-component vector of float)
@@ -147,40 +154,50 @@
 0:41      Branch: Return with expression
 0:41        Constant:
 0:41          0.000000
-0:62  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
+0:45  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
 0:45    Function Parameters: 
 0:45      'inF0' (in 2-component vector of float)
 0:45      'inF1' (in 2-component vector of float)
 0:45      'inF2' (in 2-component vector of float)
 0:45      'inI0' (in 2-component vector of int)
 0:?     Sequence
-0:46      Constant:
-0:46        0.000000
+0:46      ERROR: Bad aggregation op
+ (global 2-component vector of double)
+0:46        Convert float to uint (temp 2-component vector of uint)
+0:46          'inF0' (in 2-component vector of float)
+0:46        Convert float to uint (temp 2-component vector of uint)
+0:46          'inF1' (in 2-component vector of float)
 0:47      Constant:
 0:47        0.000000
-0:48      Constant:
-0:48        0.000000
+0:48      bitCount (global 2-component vector of uint)
+0:48        Convert float to uint (temp 2-component vector of uint)
+0:48          'inF0' (in 2-component vector of float)
 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:56      Constant:
-0:56        0.000000
+0:52      ERROR: Bad unary op
+ (global 2-component vector of float)
+0:52        Convert float to uint (temp 2-component vector of uint)
+0:52          'inF0' (in 2-component vector of float)
+0:53      findMSB (global 2-component vector of uint)
+0:53        Convert float to uint (temp 2-component vector of uint)
+0:53          'inF0' (in 2-component vector of float)
+0:54      findLSB (global 2-component vector of uint)
+0:54        Convert float to uint (temp 2-component vector of uint)
+0:54          'inF0' (in 2-component vector of float)
+0:56      bitFieldReverse (global 2-component vector of uint)
+0:56        Convert float to uint (temp 2-component vector of uint)
+0:56          'inF0' (in 2-component vector of float)
 0:57      Constant:
 0:57        0.000000
 0:59      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:79  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
+0:63  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
 0:63    Function Parameters: 
 0:63      'inF0' (in 3-component vector of float)
 0:63      'inF1' (in 3-component vector of float)
@@ -189,20 +206,26 @@
 0:?     Sequence
 0:64      Constant:
 0:64        0.000000
-0:65      Constant:
-0:65        0.000000
+0:65      bitCount (global 3-component vector of uint)
+0:65        Convert float to uint (temp 3-component vector of uint)
+0:65          'inF0' (in 3-component vector of float)
 0:66      Constant:
 0:66        0.000000
 0:67      Constant:
 0:67        0.000000
-0:68      Constant:
-0:68        0.000000
-0:69      Constant:
-0:69        0.000000
-0:70      Constant:
-0:70        0.000000
-0:72      Constant:
-0:72        0.000000
+0:68      ERROR: Bad unary op
+ (global 3-component vector of float)
+0:68        Convert float to uint (temp 3-component vector of uint)
+0:68          'inF0' (in 3-component vector of float)
+0:69      findMSB (global 3-component vector of uint)
+0:69        Convert float to uint (temp 3-component vector of uint)
+0:69          'inF0' (in 3-component vector of float)
+0:70      findLSB (global 3-component vector of uint)
+0:70        Convert float to uint (temp 3-component vector of uint)
+0:70          'inF0' (in 3-component vector of float)
+0:72      bitFieldReverse (global 3-component vector of uint)
+0:72        Convert float to uint (temp 3-component vector of uint)
+0:72          'inF0' (in 3-component vector of float)
 0:73      Constant:
 0:73        0.000000
 0:76      Branch: Return with expression
@@ -210,38 +233,50 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:114  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
+0:80  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
 0:80    Function Parameters: 
-0:80      'inF0' (in 4-component vector of float)
-0:80      'inF1' (in 4-component vector of float)
-0:80      'inF2' (in 4-component vector of float)
-0:80      'inI0' (in 4-component vector of int)
+0:80      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:80      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:80      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:80      'inI0' (layout(location=3 ) in 4-component vector of int)
 0:?     Sequence
 0:81      Constant:
 0:81        0.000000
-0:82      Constant:
-0:82        0.000000
-0:83      Constant:
-0:83        0.000000
+0:82      bitCount (global 4-component vector of uint)
+0:82        Convert float to uint (temp 4-component vector of uint)
+0:82          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:83      cross-product (global 3-component vector of float)
+0:83        Construct vec3 (in 3-component vector of float)
+0:83          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:83        Construct vec3 (in 3-component vector of float)
+0:83          'inF1' (layout(location=1 ) in 4-component vector of float)
 0:84      Constant:
 0:84        0.000000
-0:85      Constant:
-0:85        0.000000
-0:86      Constant:
-0:86        0.000000
-0:87      Constant:
-0:87        0.000000
-0:89      Constant:
-0:89        0.000000
+0:85      ERROR: Bad unary op
+ (global 4-component vector of float)
+0:85        Convert float to uint (temp 4-component vector of uint)
+0:85          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:86      findMSB (global 4-component vector of uint)
+0:86        Convert float to uint (temp 4-component vector of uint)
+0:86          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:87      findLSB (global 4-component vector of uint)
+0:87        Convert float to uint (temp 4-component vector of uint)
+0:87          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:89      bitFieldReverse (global 4-component vector of uint)
+0:89        Convert float to uint (temp 4-component vector of uint)
+0:89          'inF0' (layout(location=0 ) in 4-component vector of float)
 0:90      Constant:
 0:90        0.000000
-0:92      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
-0:122  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:92      Sequence
+0:92        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:92        Branch: Return
+0:115  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
 0:115    Function Parameters: 
 0:115      'inF0' (in 2X2 matrix of float)
 0:115      'inF1' (in 2X2 matrix of float)
@@ -279,7 +314,7 @@
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:130  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:123  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
 0:123    Function Parameters: 
 0:123      'inF0' (in 3X3 matrix of float)
 0:123      'inF1' (in 3X3 matrix of float)
@@ -322,7 +357,7 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:137  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:131  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
 0:131    Function Parameters: 
 0:131      'inF0' (in 4X4 matrix of float)
 0:131      'inF1' (in 4X4 matrix of float)
@@ -373,6 +408,11 @@
 0:?           4.000000
 0:?           4.000000
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inI0' (layout(location=3 ) in 4-component vector of int)
 
 
 Linked fragment stage:
@@ -381,51 +421,84 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:35  Function Definition: PixelShaderFunctionS(f1;f1;f1;i1; (global float)
+0:2  Function Definition: PixelShaderFunctionS(f1;f1;f1;i1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:2      'inF1' (in float)
 0:2      'inF2' (in float)
 0:2      'inI0' (in int)
 0:?     Sequence
-0:5      Constant:
-0:5        0.000000
-0:6      Constant:
-0:6        0.000000
-0:7      Constant:
-0:7        0.000000
-0:8      Constant:
-0:8        0.000000
-0:9      Constant:
-0:9        0.000000
+0:5      uint64BitsToDouble (temp double)
+0:5        Construct uvec2 (temp 2-component vector of uint)
+0:5          Convert float to uint (temp uint)
+0:5            'inF0' (in float)
+0:5          Convert float to uint (temp uint)
+0:5            'inF1' (in float)
+0:6      Function Call: CheckAccessFullyMapped(u1; (global bool)
+0:6        Constant:
+0:6          3 (const uint)
+0:7      bitCount (global uint)
+0:7        Convert float to uint (temp uint)
+0:7          'inF0' (in float)
+0:8      cross-product (global 3-component vector of float)
+0:8        Construct vec3 (in 3-component vector of float)
+0:8          'inF0' (in float)
+0:8        Construct vec3 (in 3-component vector of float)
+0:8          'inF1' (in float)
+0:9      Function Call: D3DCOLORtoUBYTE4(vf4; (global 4-component vector of int)
+0:9        Construct vec4 (in 4-component vector of float)
+0:9          'inF0' (in float)
 0:10      Constant:
 0:10        0.000000
-0:12      Constant:
-0:12        0.000000
-0:13      Constant:
-0:13        0.000000
-0:14      Constant:
-0:14        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:12      ERROR: Bad unary op
+ (global float)
+0:12        Convert float to uint (temp uint)
+0:12          'inF0' (in float)
+0:13      findMSB (global uint)
+0:13        Convert float to uint (temp uint)
+0:13          'inF0' (in float)
+0:14      findLSB (global uint)
+0:14        Convert float to uint (temp uint)
+0:14          'inF0' (in float)
+0:23      length (global float)
+0:23        Construct vec2 (in 2-component vector of float)
+0:23          'inF0' (in float)
+0:24      Function Call: msad4(u1;vu2;vu4; (global 4-component vector of uint)
+0:24        Convert float to uint (temp uint)
+0:24          'inF0' (in float)
+0:24        Constant:
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:24        Constant:
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:24          0 (const uint)
+0:25      normalize (global 2-component vector of float)
+0:25        Construct vec2 (in 2-component vector of float)
+0:25          'inF0' (in float)
+0:26      reflect (global 2-component vector of float)
+0:26        Construct vec2 (in 2-component vector of float)
+0:26          'inF0' (in float)
+0:26        Construct vec2 (in 2-component vector of float)
+0:26          'inF1' (in float)
+0:27      refract (global 2-component vector of float)
+0:27        Construct vec2 (in 2-component vector of float)
+0:27          'inF0' (in float)
+0:27        Construct vec2 (in 2-component vector of float)
+0:27          'inF1' (in float)
+0:27        'inF2' (in float)
 0:28      Constant:
 0:28        0.000000
-0:29      Constant:
-0:29        0.000000
+0:29      bitFieldReverse (global uint)
+0:29        Convert float to uint (temp uint)
+0:29          'inF0' (in float)
 0:30      Constant:
 0:30        0.000000
 0:32      Branch: Return with expression
 0:32        Constant:
 0:32          0.000000
-0:44  Function Definition: PixelShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
+0:36  Function Definition: PixelShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
 0:36    Function Parameters: 
 0:36      'inF0' (in 1-component vector of float)
 0:36      'inF1' (in 1-component vector of float)
@@ -437,40 +510,50 @@
 0:41      Branch: Return with expression
 0:41        Constant:
 0:41          0.000000
-0:62  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
+0:45  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
 0:45    Function Parameters: 
 0:45      'inF0' (in 2-component vector of float)
 0:45      'inF1' (in 2-component vector of float)
 0:45      'inF2' (in 2-component vector of float)
 0:45      'inI0' (in 2-component vector of int)
 0:?     Sequence
-0:46      Constant:
-0:46        0.000000
+0:46      ERROR: Bad aggregation op
+ (global 2-component vector of double)
+0:46        Convert float to uint (temp 2-component vector of uint)
+0:46          'inF0' (in 2-component vector of float)
+0:46        Convert float to uint (temp 2-component vector of uint)
+0:46          'inF1' (in 2-component vector of float)
 0:47      Constant:
 0:47        0.000000
-0:48      Constant:
-0:48        0.000000
+0:48      bitCount (global 2-component vector of uint)
+0:48        Convert float to uint (temp 2-component vector of uint)
+0:48          'inF0' (in 2-component vector of float)
 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:56      Constant:
-0:56        0.000000
+0:52      ERROR: Bad unary op
+ (global 2-component vector of float)
+0:52        Convert float to uint (temp 2-component vector of uint)
+0:52          'inF0' (in 2-component vector of float)
+0:53      findMSB (global 2-component vector of uint)
+0:53        Convert float to uint (temp 2-component vector of uint)
+0:53          'inF0' (in 2-component vector of float)
+0:54      findLSB (global 2-component vector of uint)
+0:54        Convert float to uint (temp 2-component vector of uint)
+0:54          'inF0' (in 2-component vector of float)
+0:56      bitFieldReverse (global 2-component vector of uint)
+0:56        Convert float to uint (temp 2-component vector of uint)
+0:56          'inF0' (in 2-component vector of float)
 0:57      Constant:
 0:57        0.000000
 0:59      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:79  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
+0:63  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
 0:63    Function Parameters: 
 0:63      'inF0' (in 3-component vector of float)
 0:63      'inF1' (in 3-component vector of float)
@@ -479,20 +562,26 @@
 0:?     Sequence
 0:64      Constant:
 0:64        0.000000
-0:65      Constant:
-0:65        0.000000
+0:65      bitCount (global 3-component vector of uint)
+0:65        Convert float to uint (temp 3-component vector of uint)
+0:65          'inF0' (in 3-component vector of float)
 0:66      Constant:
 0:66        0.000000
 0:67      Constant:
 0:67        0.000000
-0:68      Constant:
-0:68        0.000000
-0:69      Constant:
-0:69        0.000000
-0:70      Constant:
-0:70        0.000000
-0:72      Constant:
-0:72        0.000000
+0:68      ERROR: Bad unary op
+ (global 3-component vector of float)
+0:68        Convert float to uint (temp 3-component vector of uint)
+0:68          'inF0' (in 3-component vector of float)
+0:69      findMSB (global 3-component vector of uint)
+0:69        Convert float to uint (temp 3-component vector of uint)
+0:69          'inF0' (in 3-component vector of float)
+0:70      findLSB (global 3-component vector of uint)
+0:70        Convert float to uint (temp 3-component vector of uint)
+0:70          'inF0' (in 3-component vector of float)
+0:72      bitFieldReverse (global 3-component vector of uint)
+0:72        Convert float to uint (temp 3-component vector of uint)
+0:72          'inF0' (in 3-component vector of float)
 0:73      Constant:
 0:73        0.000000
 0:76      Branch: Return with expression
@@ -500,38 +589,50 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:114  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
+0:80  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vi4; (global 4-component vector of float)
 0:80    Function Parameters: 
-0:80      'inF0' (in 4-component vector of float)
-0:80      'inF1' (in 4-component vector of float)
-0:80      'inF2' (in 4-component vector of float)
-0:80      'inI0' (in 4-component vector of int)
+0:80      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:80      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:80      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:80      'inI0' (layout(location=3 ) in 4-component vector of int)
 0:?     Sequence
 0:81      Constant:
 0:81        0.000000
-0:82      Constant:
-0:82        0.000000
-0:83      Constant:
-0:83        0.000000
+0:82      bitCount (global 4-component vector of uint)
+0:82        Convert float to uint (temp 4-component vector of uint)
+0:82          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:83      cross-product (global 3-component vector of float)
+0:83        Construct vec3 (in 3-component vector of float)
+0:83          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:83        Construct vec3 (in 3-component vector of float)
+0:83          'inF1' (layout(location=1 ) in 4-component vector of float)
 0:84      Constant:
 0:84        0.000000
-0:85      Constant:
-0:85        0.000000
-0:86      Constant:
-0:86        0.000000
-0:87      Constant:
-0:87        0.000000
-0:89      Constant:
-0:89        0.000000
+0:85      ERROR: Bad unary op
+ (global 4-component vector of float)
+0:85        Convert float to uint (temp 4-component vector of uint)
+0:85          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:86      findMSB (global 4-component vector of uint)
+0:86        Convert float to uint (temp 4-component vector of uint)
+0:86          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:87      findLSB (global 4-component vector of uint)
+0:87        Convert float to uint (temp 4-component vector of uint)
+0:87          'inF0' (layout(location=0 ) in 4-component vector of float)
+0:89      bitFieldReverse (global 4-component vector of uint)
+0:89        Convert float to uint (temp 4-component vector of uint)
+0:89          'inF0' (layout(location=0 ) in 4-component vector of float)
 0:90      Constant:
 0:90        0.000000
-0:92      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
-0:122  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:92      Sequence
+0:92        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:92        Branch: Return
+0:115  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
 0:115    Function Parameters: 
 0:115      'inF0' (in 2X2 matrix of float)
 0:115      'inF1' (in 2X2 matrix of float)
@@ -569,7 +670,7 @@
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:130  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:123  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
 0:123    Function Parameters: 
 0:123      'inF0' (in 3X3 matrix of float)
 0:123      'inF1' (in 3X3 matrix of float)
@@ -612,7 +713,7 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:137  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:131  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
 0:131    Function Parameters: 
 0:131      'inF0' (in 4X4 matrix of float)
 0:131      'inF1' (in 4X4 matrix of float)
@@ -663,5 +764,10 @@
 0:?           4.000000
 0:?           4.000000
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inI0' (layout(location=3 ) in 4-component vector of int)
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.intrinsics.negative.vert.out b/Test/baseResults/hlsl.intrinsics.negative.vert.out
index 0e974a1..e702d33 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.vert.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.vert.out
@@ -1,714 +1,84 @@
 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:74  Function Definition: VertexShaderFunctionS(f1;f1;f1;i1; (global float)
+0:? Sequence
+0:15  Function Definition: VertexShaderFunctionS(f1;f1;f1;i1; (global float)
 0:15    Function Parameters: 
 0:15      'inF0' (in float)
 0:15      'inF1' (in float)
 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
-0:83  Function Definition: VertexShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
+0:75  Function Definition: VertexShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
 0:75    Function Parameters: 
 0:75      'inF0' (in 1-component vector of float)
 0:75      'inF1' (in 1-component vector of float)
 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
-0:130  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
+0:84  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
 0:84    Function Parameters: 
 0:84      'inF0' (in 2-component vector of float)
 0:84      'inF1' (in 2-component vector of float)
 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
 0:?           2.000000
-0:175  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
+0:131  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
 0:131    Function Parameters: 
 0:131      'inF0' (in 3-component vector of float)
 0:131      'inF1' (in 3-component vector of float)
 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:176  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:176      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:176      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:176      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:176      'inI0' (layout(location=3 ) 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:217      Sequence
+0:217        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:217        Branch: Return
+0:226  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:234  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 +89,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:242  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
@@ -804,492 +126,96 @@
 0:?     'gs_ua4' (global 4-component vector of uint)
 0:?     'gs_ub4' (global 4-component vector of uint)
 0:?     'gs_uc4' (global 4-component vector of uint)
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inI0' (layout(location=3 ) in 4-component vector of int)
 
 
 Linked vertex stage:
 
 
 Shader version: 450
-ERROR: node is still EOpNull!
-0:74  Function Definition: VertexShaderFunctionS(f1;f1;f1;i1; (global float)
+0:? Sequence
+0:15  Function Definition: VertexShaderFunctionS(f1;f1;f1;i1; (global float)
 0:15    Function Parameters: 
 0:15      'inF0' (in float)
 0:15      'inF1' (in float)
 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
-0:83  Function Definition: VertexShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
+0:75  Function Definition: VertexShaderFunction1(vf1;vf1;vf1;vi1; (global 1-component vector of float)
 0:75    Function Parameters: 
 0:75      'inF0' (in 1-component vector of float)
 0:75      'inF1' (in 1-component vector of float)
 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
-0:130  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
+0:84  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vi2; (global 2-component vector of float)
 0:84    Function Parameters: 
 0:84      'inF0' (in 2-component vector of float)
 0:84      'inF1' (in 2-component vector of float)
 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
 0:?           2.000000
-0:175  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
+0:131  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vi3; (global 3-component vector of float)
 0:131    Function Parameters: 
 0:131      'inF0' (in 3-component vector of float)
 0:131      'inF1' (in 3-component vector of float)
 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:176  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:176      'inF0' (layout(location=0 ) in 4-component vector of float)
+0:176      'inF1' (layout(location=1 ) in 4-component vector of float)
+0:176      'inF2' (layout(location=2 ) in 4-component vector of float)
+0:176      'inI0' (layout(location=3 ) 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:217      Sequence
+0:217        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:217        Branch: Return
+0:226  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:234  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 +226,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:242  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
@@ -1385,5 +263,200 @@
 0:?     'gs_ua4' (global 4-component vector of uint)
 0:?     'gs_ub4' (global 4-component vector of uint)
 0:?     'gs_uc4' (global 4-component vector of uint)
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
+0:?     'inF1' (layout(location=1 ) in 4-component vector of float)
+0:?     'inF2' (layout(location=2 ) in 4-component vector of float)
+0:?     'inI0' (layout(location=3 ) in 4-component vector of int)
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 128
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "VertexShaderFunction" 85 122 123 124 127
+                              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 85  "@entryPointOutput"
+                              Name 103  "gs_ua"
+                              Name 104  "gs_ub"
+                              Name 105  "gs_uc"
+                              Name 108  "gs_ua2"
+                              Name 109  "gs_ub2"
+                              Name 110  "gs_uc2"
+                              Name 113  "gs_ua3"
+                              Name 114  "gs_ub3"
+                              Name 115  "gs_uc3"
+                              Name 118  "gs_ua4"
+                              Name 119  "gs_ub4"
+                              Name 120  "gs_uc4"
+                              Name 122  "inF0"
+                              Name 123  "inF1"
+                              Name 124  "inF2"
+                              Name 127  "inI0"
+                              Decorate 85(@entryPointOutput) Location 0
+                              Decorate 122(inF0) Location 0
+                              Decorate 123(inF1) Location 1
+                              Decorate 124(inF2) Location 2
+                              Decorate 127(inI0) Location 3
+               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:             TypePointer Output 61(fvec4)
+85(@entryPointOutput):     84(ptr) Variable Output
+              86:    6(float) Constant 1082130432
+              87:   61(fvec4) ConstantComposite 75 76 80 86
+              89:   23(fvec2) ConstantComposite 76 76
+              90:          45 ConstantComposite 89 89
+              93:   34(fvec3) ConstantComposite 80 80 80
+              94:          53 ConstantComposite 93 93 93
+              97:   61(fvec4) ConstantComposite 86 86 86 86
+              98:          62 ConstantComposite 97 97 97 97
+             101:             TypeInt 32 0
+             102:             TypePointer Private 101(int)
+      103(gs_ua):    102(ptr) Variable Private
+      104(gs_ub):    102(ptr) Variable Private
+      105(gs_uc):    102(ptr) Variable Private
+             106:             TypeVector 101(int) 2
+             107:             TypePointer Private 106(ivec2)
+     108(gs_ua2):    107(ptr) Variable Private
+     109(gs_ub2):    107(ptr) Variable Private
+     110(gs_uc2):    107(ptr) Variable Private
+             111:             TypeVector 101(int) 3
+             112:             TypePointer Private 111(ivec3)
+     113(gs_ua3):    112(ptr) Variable Private
+     114(gs_ub3):    112(ptr) Variable Private
+     115(gs_uc3):    112(ptr) Variable Private
+             116:             TypeVector 101(int) 4
+             117:             TypePointer Private 116(ivec4)
+     118(gs_ua4):    117(ptr) Variable Private
+     119(gs_ub4):    117(ptr) Variable Private
+     120(gs_uc4):    117(ptr) Variable Private
+             121:             TypePointer Input 61(fvec4)
+       122(inF0):    121(ptr) Variable Input
+       123(inF1):    121(ptr) Variable Input
+       124(inF2):    121(ptr) Variable Input
+             125:             TypeVector 8(int) 4
+             126:             TypePointer Input 125(ivec4)
+       127(inI0):    126(ptr) Variable Input
+4(VertexShaderFunction):           2 Function None 3
+               5:             Label
+                              Store 85(@entryPointOutput) 87
+                              Return
+                              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 90
+                              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 94
+                              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 98
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.vert.out b/Test/baseResults/hlsl.intrinsics.vert.out
index 926501e..121c809 100644
--- a/Test/baseResults/hlsl.intrinsics.vert.out
+++ b/Test/baseResults/hlsl.intrinsics.vert.out
@@ -1,7 +1,7 @@
 hlsl.intrinsics.vert
 Shader version: 450
 0:? Sequence
-0:63  Function Definition: VertexShaderFunctionS(f1;f1;f1;u1;u1; (global float)
+0:2  Function Definition: VertexShaderFunctionS(f1;f1;f1;u1;u1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:2      'inF1' (in float)
@@ -142,7 +142,7 @@
 0:60      Branch: Return with expression
 0:60        Constant:
 0:60          0.000000
-0:69  Function Definition: VertexShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
+0:64  Function Definition: VertexShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
 0:64    Function Parameters: 
 0:64      'inF0' (in 1-component vector of float)
 0:64      'inF1' (in 1-component vector of float)
@@ -151,7 +151,7 @@
 0:66      Branch: Return with expression
 0:66        Constant:
 0:66          0.000000
-0:139  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
+0:70  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
 0:70    Function Parameters: 
 0:70      'inF0' (in 2-component vector of float)
 0:70      'inF1' (in 2-component vector of float)
@@ -317,7 +317,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:210  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
+0:140  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
 0:140    Function Parameters: 
 0:140      'inF0' (in 3-component vector of float)
 0:140      'inF1' (in 3-component vector of float)
@@ -489,7 +489,7 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:335  Function Definition: VertexShaderFunction4(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
+0:211  Function Definition: VertexShaderFunction4(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
 0:211    Function Parameters: 
 0:211      'inF0' (in 4-component vector of float)
 0:211      'inF1' (in 4-component vector of float)
@@ -681,7 +681,7 @@
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:344  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:336  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
 0:336    Function Parameters: 
 0:336      'inF0' (in 2X2 matrix of float)
 0:336      'inF1' (in 2X2 matrix of float)
@@ -811,7 +811,7 @@
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:353  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:345  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
 0:345    Function Parameters: 
 0:345      'inF0' (in 3X3 matrix of float)
 0:345      'inF1' (in 3X3 matrix of float)
@@ -946,7 +946,7 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:374  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:354  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
 0:354    Function Parameters: 
 0:354      'inF0' (in 4X4 matrix of float)
 0:354      'inF1' (in 4X4 matrix of float)
@@ -1088,7 +1088,7 @@
 0:?           4.000000
 0:?           4.000000
 0:?           4.000000
-0:381  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
+0:377  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
 0:377    Function Parameters: 
 0:377      'inF0' (in float)
 0:377      'inF1' (in float)
@@ -1101,20 +1101,20 @@
 0:378        move second child to first child (temp float)
 0:378          'r0' (temp float)
 0:378          component-wise multiply (temp float)
-0:378            'inF0' (in float)
 0:378            'inF1' (in float)
+0:378            'inF0' (in float)
 0:378      Sequence
 0:378        move second child to first child (temp 2-component vector of float)
 0:378          'r1' (temp 2-component vector of float)
 0:378          vector-scale (temp 2-component vector of float)
-0:378            'inFV0' (in 2-component vector of float)
 0:378            'inF0' (in float)
+0:378            'inFV0' (in 2-component vector of float)
 0:378      Sequence
 0:378        move second child to first child (temp 2-component vector of float)
 0:378          'r2' (temp 2-component vector of float)
 0:378          vector-scale (temp 2-component vector of float)
-0:378            'inF0' (in float)
 0:378            'inFV0' (in 2-component vector of float)
+0:378            'inF0' (in float)
 0:378      Sequence
 0:378        move second child to first child (temp float)
 0:378          'r3' (temp float)
@@ -1124,34 +1124,34 @@
 0:378      Sequence
 0:378        move second child to first child (temp 2-component vector of float)
 0:378          'r4' (temp 2-component vector of float)
-0:378          matrix-times-vector (temp 2-component vector of float)
-0:378            'inFM0' (in 2X2 matrix of float)
-0:378            'inFV0' (in 2-component vector of float)
-0:378      Sequence
-0:378        move second child to first child (temp 2-component vector of float)
-0:378          'r5' (temp 2-component vector of float)
 0:378          vector-times-matrix (temp 2-component vector of float)
 0:378            'inFV0' (in 2-component vector of float)
 0:378            'inFM0' (in 2X2 matrix of float)
 0:378      Sequence
+0:378        move second child to first child (temp 2-component vector of float)
+0:378          'r5' (temp 2-component vector of float)
+0:378          matrix-times-vector (temp 2-component vector of float)
+0:378            'inFM0' (in 2X2 matrix of float)
+0:378            'inFV0' (in 2-component vector of float)
+0:378      Sequence
 0:378        move second child to first child (temp 2X2 matrix of float)
 0:378          'r6' (temp 2X2 matrix of float)
 0:378          matrix-scale (temp 2X2 matrix of float)
-0:378            'inFM0' (in 2X2 matrix of float)
 0:378            'inF0' (in float)
+0:378            'inFM0' (in 2X2 matrix of float)
 0:378      Sequence
 0:378        move second child to first child (temp 2X2 matrix of float)
 0:378          'r7' (temp 2X2 matrix of float)
 0:378          matrix-scale (temp 2X2 matrix of float)
-0:378            'inF0' (in float)
 0:378            'inFM0' (in 2X2 matrix of float)
+0:378            'inF0' (in float)
 0:378      Sequence
 0:378        move second child to first child (temp 2X2 matrix of float)
 0:378          'r8' (temp 2X2 matrix of float)
 0:378          matrix-multiply (temp 2X2 matrix of float)
-0:378            'inFM0' (in 2X2 matrix of float)
 0:378            'inFM1' (in 2X2 matrix of float)
-0:388  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
+0:378            'inFM0' (in 2X2 matrix of float)
+0:384  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
 0:384    Function Parameters: 
 0:384      'inF0' (in float)
 0:384      'inF1' (in float)
@@ -1164,20 +1164,20 @@
 0:385        move second child to first child (temp float)
 0:385          'r0' (temp float)
 0:385          component-wise multiply (temp float)
-0:385            'inF0' (in float)
 0:385            'inF1' (in float)
+0:385            'inF0' (in float)
 0:385      Sequence
 0:385        move second child to first child (temp 3-component vector of float)
 0:385          'r1' (temp 3-component vector of float)
 0:385          vector-scale (temp 3-component vector of float)
-0:385            'inFV0' (in 3-component vector of float)
 0:385            'inF0' (in float)
+0:385            'inFV0' (in 3-component vector of float)
 0:385      Sequence
 0:385        move second child to first child (temp 3-component vector of float)
 0:385          'r2' (temp 3-component vector of float)
 0:385          vector-scale (temp 3-component vector of float)
-0:385            'inF0' (in float)
 0:385            'inFV0' (in 3-component vector of float)
+0:385            'inF0' (in float)
 0:385      Sequence
 0:385        move second child to first child (temp float)
 0:385          'r3' (temp float)
@@ -1187,34 +1187,34 @@
 0:385      Sequence
 0:385        move second child to first child (temp 3-component vector of float)
 0:385          'r4' (temp 3-component vector of float)
-0:385          matrix-times-vector (temp 3-component vector of float)
-0:385            'inFM0' (in 3X3 matrix of float)
-0:385            'inFV0' (in 3-component vector of float)
-0:385      Sequence
-0:385        move second child to first child (temp 3-component vector of float)
-0:385          'r5' (temp 3-component vector of float)
 0:385          vector-times-matrix (temp 3-component vector of float)
 0:385            'inFV0' (in 3-component vector of float)
 0:385            'inFM0' (in 3X3 matrix of float)
 0:385      Sequence
+0:385        move second child to first child (temp 3-component vector of float)
+0:385          'r5' (temp 3-component vector of float)
+0:385          matrix-times-vector (temp 3-component vector of float)
+0:385            'inFM0' (in 3X3 matrix of float)
+0:385            'inFV0' (in 3-component vector of float)
+0:385      Sequence
 0:385        move second child to first child (temp 3X3 matrix of float)
 0:385          'r6' (temp 3X3 matrix of float)
 0:385          matrix-scale (temp 3X3 matrix of float)
-0:385            'inFM0' (in 3X3 matrix of float)
 0:385            'inF0' (in float)
+0:385            'inFM0' (in 3X3 matrix of float)
 0:385      Sequence
 0:385        move second child to first child (temp 3X3 matrix of float)
 0:385          'r7' (temp 3X3 matrix of float)
 0:385          matrix-scale (temp 3X3 matrix of float)
-0:385            'inF0' (in float)
 0:385            'inFM0' (in 3X3 matrix of float)
+0:385            'inF0' (in float)
 0:385      Sequence
 0:385        move second child to first child (temp 3X3 matrix of float)
 0:385          'r8' (temp 3X3 matrix of float)
 0:385          matrix-multiply (temp 3X3 matrix of float)
-0:385            'inFM0' (in 3X3 matrix of float)
 0:385            'inFM1' (in 3X3 matrix of float)
-0:396  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
+0:385            'inFM0' (in 3X3 matrix of float)
+0:391  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
 0:391    Function Parameters: 
 0:391      'inF0' (in float)
 0:391      'inF1' (in float)
@@ -1227,20 +1227,20 @@
 0:392        move second child to first child (temp float)
 0:392          'r0' (temp float)
 0:392          component-wise multiply (temp float)
-0:392            'inF0' (in float)
 0:392            'inF1' (in float)
+0:392            'inF0' (in float)
 0:392      Sequence
 0:392        move second child to first child (temp 4-component vector of float)
 0:392          'r1' (temp 4-component vector of float)
 0:392          vector-scale (temp 4-component vector of float)
-0:392            'inFV0' (in 4-component vector of float)
 0:392            'inF0' (in float)
+0:392            'inFV0' (in 4-component vector of float)
 0:392      Sequence
 0:392        move second child to first child (temp 4-component vector of float)
 0:392          'r2' (temp 4-component vector of float)
 0:392          vector-scale (temp 4-component vector of float)
-0:392            'inF0' (in float)
 0:392            'inFV0' (in 4-component vector of float)
+0:392            'inF0' (in float)
 0:392      Sequence
 0:392        move second child to first child (temp float)
 0:392          'r3' (temp float)
@@ -1250,75 +1250,75 @@
 0:392      Sequence
 0:392        move second child to first child (temp 4-component vector of float)
 0:392          'r4' (temp 4-component vector of float)
-0:392          matrix-times-vector (temp 4-component vector of float)
-0:392            'inFM0' (in 4X4 matrix of float)
-0:392            'inFV0' (in 4-component vector of float)
-0:392      Sequence
-0:392        move second child to first child (temp 4-component vector of float)
-0:392          'r5' (temp 4-component vector of float)
 0:392          vector-times-matrix (temp 4-component vector of float)
 0:392            'inFV0' (in 4-component vector of float)
 0:392            'inFM0' (in 4X4 matrix of float)
 0:392      Sequence
+0:392        move second child to first child (temp 4-component vector of float)
+0:392          'r5' (temp 4-component vector of float)
+0:392          matrix-times-vector (temp 4-component vector of float)
+0:392            'inFM0' (in 4X4 matrix of float)
+0:392            'inFV0' (in 4-component vector of float)
+0:392      Sequence
 0:392        move second child to first child (temp 4X4 matrix of float)
 0:392          'r6' (temp 4X4 matrix of float)
 0:392          matrix-scale (temp 4X4 matrix of float)
-0:392            'inFM0' (in 4X4 matrix of float)
 0:392            'inF0' (in float)
+0:392            'inFM0' (in 4X4 matrix of float)
 0:392      Sequence
 0:392        move second child to first child (temp 4X4 matrix of float)
 0:392          'r7' (temp 4X4 matrix of float)
 0:392          matrix-scale (temp 4X4 matrix of float)
-0:392            'inF0' (in float)
 0:392            'inFM0' (in 4X4 matrix of float)
+0:392            'inF0' (in float)
 0:392      Sequence
 0:392        move second child to first child (temp 4X4 matrix of float)
 0:392          'r8' (temp 4X4 matrix of float)
 0:392          matrix-multiply (temp 4X4 matrix of float)
-0:392            'inFM0' (in 4X4 matrix of float)
 0:392            'inFM1' (in 4X4 matrix of float)
-0:420  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42; (global void)
+0:392            'inFM0' (in 4X4 matrix of float)
+0:401  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; (global void)
 0:401    Function Parameters: 
 0:401      'inF0' (in float)
 0:401      'inF1' (in float)
 0:401      'inFV2' (in 2-component vector of float)
 0:401      'inFV3' (in 3-component vector of float)
-0:401      'inFM2x3' (in 3X2 matrix of float)
-0:401      'inFM3x2' (in 2X3 matrix of float)
+0:401      'inFM2x3' (in 2X3 matrix of float)
+0:401      'inFM3x2' (in 3X2 matrix of float)
 0:401      'inFM3x3' (in 3X3 matrix of float)
-0:401      'inFM3x4' (in 4X3 matrix of float)
-0:401      'inFM2x4' (in 4X2 matrix of float)
+0:401      'inFM3x4' (in 3X4 matrix of float)
+0:401      'inFM2x4' (in 2X4 matrix of float)
 0:?     Sequence
 0:402      Sequence
 0:402        move second child to first child (temp float)
 0:402          'r00' (temp float)
 0:402          component-wise multiply (temp float)
-0:402            'inF0' (in float)
 0:402            'inF1' (in float)
+0:402            'inF0' (in float)
 0:403      Sequence
 0:403        move second child to first child (temp 2-component vector of float)
 0:403          'r01' (temp 2-component vector of float)
 0:403          vector-scale (temp 2-component vector of float)
-0:403            'inFV2' (in 2-component vector of float)
 0:403            'inF0' (in float)
+0:403            'inFV2' (in 2-component vector of float)
 0:404      Sequence
 0:404        move second child to first child (temp 3-component vector of float)
 0:404          'r02' (temp 3-component vector of float)
 0:404          vector-scale (temp 3-component vector of float)
-0:404            'inFV3' (in 3-component vector of float)
 0:404            'inF0' (in float)
+0:404            'inFV3' (in 3-component vector of float)
 0:405      Sequence
 0:405        move second child to first child (temp 2-component vector of float)
 0:405          'r03' (temp 2-component vector of float)
 0:405          vector-scale (temp 2-component vector of float)
-0:405            'inF0' (in float)
 0:405            'inFV2' (in 2-component vector of float)
+0:405            'inF0' (in float)
 0:406      Sequence
 0:406        move second child to first child (temp 3-component vector of float)
 0:406          'r04' (temp 3-component vector of float)
 0:406          vector-scale (temp 3-component vector of float)
-0:406            'inF0' (in float)
 0:406            'inFV3' (in 3-component vector of float)
+0:406            'inF0' (in float)
 0:407      Sequence
 0:407        move second child to first child (temp float)
 0:407          'r05' (temp float)
@@ -1334,63 +1334,63 @@
 0:409      Sequence
 0:409        move second child to first child (temp 3-component vector of float)
 0:409          'r07' (temp 3-component vector of float)
-0:409          vector-times-matrix (temp 3-component vector of float)
+0:409          matrix-times-vector (temp 3-component vector of float)
+0:409            'inFM2x3' (in 2X3 matrix of float)
 0:409            'inFV2' (in 2-component vector of float)
-0:409            'inFM2x3' (in 3X2 matrix of float)
 0:410      Sequence
 0:410        move second child to first child (temp 2-component vector of float)
 0:410          'r08' (temp 2-component vector of float)
-0:410          vector-times-matrix (temp 2-component vector of float)
+0:410          matrix-times-vector (temp 2-component vector of float)
+0:410            'inFM3x2' (in 3X2 matrix of float)
 0:410            'inFV3' (in 3-component vector of float)
-0:410            'inFM3x2' (in 2X3 matrix of float)
 0:411      Sequence
 0:411        move second child to first child (temp 2-component vector of float)
 0:411          'r09' (temp 2-component vector of float)
-0:411          matrix-times-vector (temp 2-component vector of float)
-0:411            'inFM2x3' (in 3X2 matrix of float)
+0:411          vector-times-matrix (temp 2-component vector of float)
 0:411            'inFV3' (in 3-component vector of float)
+0:411            'inFM2x3' (in 2X3 matrix of float)
 0:412      Sequence
 0:412        move second child to first child (temp 3-component vector of float)
 0:412          'r10' (temp 3-component vector of float)
-0:412          matrix-times-vector (temp 3-component vector of float)
-0:412            'inFM3x2' (in 2X3 matrix of float)
+0:412          vector-times-matrix (temp 3-component vector of float)
 0:412            'inFV2' (in 2-component vector of float)
+0:412            'inFM3x2' (in 3X2 matrix of float)
 0:413      Sequence
-0:413        move second child to first child (temp 3X2 matrix of float)
-0:413          'r11' (temp 3X2 matrix of float)
-0:413          matrix-scale (temp 3X2 matrix of float)
-0:413            'inFM2x3' (in 3X2 matrix of float)
+0:413        move second child to first child (temp 2X3 matrix of float)
+0:413          'r11' (temp 2X3 matrix of float)
+0:413          matrix-scale (temp 2X3 matrix of float)
 0:413            'inF0' (in float)
+0:413            'inFM2x3' (in 2X3 matrix of float)
 0:414      Sequence
-0:414        move second child to first child (temp 2X3 matrix of float)
-0:414          'r12' (temp 2X3 matrix of float)
-0:414          matrix-scale (temp 2X3 matrix of float)
-0:414            'inFM3x2' (in 2X3 matrix of float)
+0:414        move second child to first child (temp 3X2 matrix of float)
+0:414          'r12' (temp 3X2 matrix of float)
+0:414          matrix-scale (temp 3X2 matrix of float)
 0:414            'inF0' (in float)
+0:414            'inFM3x2' (in 3X2 matrix of float)
 0:415      Sequence
 0:415        move second child to first child (temp 2X2 matrix of float)
 0:415          'r13' (temp 2X2 matrix of float)
 0:415          matrix-multiply (temp 2X2 matrix of float)
-0:415            'inFM2x3' (in 3X2 matrix of float)
-0:415            'inFM3x2' (in 2X3 matrix of float)
+0:415            'inFM3x2' (in 3X2 matrix of float)
+0:415            'inFM2x3' (in 2X3 matrix of float)
 0:416      Sequence
-0:416        move second child to first child (temp 3X2 matrix of float)
-0:416          'r14' (temp 3X2 matrix of float)
-0:416          matrix-multiply (temp 3X2 matrix of float)
-0:416            'inFM2x3' (in 3X2 matrix of float)
+0:416        move second child to first child (temp 2X3 matrix of float)
+0:416          'r14' (temp 2X3 matrix of float)
+0:416          matrix-multiply (temp 2X3 matrix of float)
 0:416            'inFM3x3' (in 3X3 matrix of float)
+0:416            'inFM2x3' (in 2X3 matrix of float)
 0:417      Sequence
-0:417        move second child to first child (temp 4X2 matrix of float)
-0:417          'r15' (temp 4X2 matrix of float)
-0:417          matrix-multiply (temp 4X2 matrix of float)
-0:417            'inFM2x3' (in 3X2 matrix of float)
-0:417            'inFM3x4' (in 4X3 matrix of float)
+0:417        move second child to first child (temp 2X4 matrix of float)
+0:417          'r15' (temp 2X4 matrix of float)
+0:417          matrix-multiply (temp 2X4 matrix of float)
+0:417            'inFM3x4' (in 3X4 matrix of float)
+0:417            'inFM2x3' (in 2X3 matrix of float)
 0:418      Sequence
-0:418        move second child to first child (temp 4X3 matrix of float)
-0:418          'r16' (temp 4X3 matrix of float)
-0:418          matrix-multiply (temp 4X3 matrix of float)
-0:418            'inFM3x2' (in 2X3 matrix of float)
-0:418            'inFM2x4' (in 4X2 matrix of float)
+0:418        move second child to first child (temp 3X4 matrix of float)
+0:418          'r16' (temp 3X4 matrix of float)
+0:418          matrix-multiply (temp 3X4 matrix of float)
+0:418            'inFM2x4' (in 2X4 matrix of float)
+0:418            'inFM3x2' (in 3X2 matrix of float)
 0:?   Linker Objects
 
 
@@ -1399,7 +1399,7 @@
 
 Shader version: 450
 0:? Sequence
-0:63  Function Definition: VertexShaderFunctionS(f1;f1;f1;u1;u1; (global float)
+0:2  Function Definition: VertexShaderFunctionS(f1;f1;f1;u1;u1; (global float)
 0:2    Function Parameters: 
 0:2      'inF0' (in float)
 0:2      'inF1' (in float)
@@ -1540,7 +1540,7 @@
 0:60      Branch: Return with expression
 0:60        Constant:
 0:60          0.000000
-0:69  Function Definition: VertexShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
+0:64  Function Definition: VertexShaderFunction1(vf1;vf1;vf1; (global 1-component vector of float)
 0:64    Function Parameters: 
 0:64      'inF0' (in 1-component vector of float)
 0:64      'inF1' (in 1-component vector of float)
@@ -1549,7 +1549,7 @@
 0:66      Branch: Return with expression
 0:66        Constant:
 0:66          0.000000
-0:139  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
+0:70  Function Definition: VertexShaderFunction2(vf2;vf2;vf2;vu2;vu2; (global 2-component vector of float)
 0:70    Function Parameters: 
 0:70      'inF0' (in 2-component vector of float)
 0:70      'inF1' (in 2-component vector of float)
@@ -1715,7 +1715,7 @@
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:210  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
+0:140  Function Definition: VertexShaderFunction3(vf3;vf3;vf3;vu3;vu3; (global 3-component vector of float)
 0:140    Function Parameters: 
 0:140      'inF0' (in 3-component vector of float)
 0:140      'inF1' (in 3-component vector of float)
@@ -1887,7 +1887,7 @@
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:335  Function Definition: VertexShaderFunction4(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
+0:211  Function Definition: VertexShaderFunction4(vf4;vf4;vf4;vu4;vu4; (global 4-component vector of float)
 0:211    Function Parameters: 
 0:211      'inF0' (in 4-component vector of float)
 0:211      'inF1' (in 4-component vector of float)
@@ -2079,7 +2079,7 @@
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:344  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
+0:336  Function Definition: VertexShaderFunction2x2(mf22;mf22;mf22; (global 2X2 matrix of float)
 0:336    Function Parameters: 
 0:336      'inF0' (in 2X2 matrix of float)
 0:336      'inF1' (in 2X2 matrix of float)
@@ -2209,7 +2209,7 @@
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:353  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
+0:345  Function Definition: VertexShaderFunction3x3(mf33;mf33;mf33; (global 3X3 matrix of float)
 0:345    Function Parameters: 
 0:345      'inF0' (in 3X3 matrix of float)
 0:345      'inF1' (in 3X3 matrix of float)
@@ -2344,7 +2344,7 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:374  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
+0:354  Function Definition: VertexShaderFunction4x4(mf44;mf44;mf44; (global 4X4 matrix of float)
 0:354    Function Parameters: 
 0:354      'inF0' (in 4X4 matrix of float)
 0:354      'inF1' (in 4X4 matrix of float)
@@ -2486,7 +2486,7 @@
 0:?           4.000000
 0:?           4.000000
 0:?           4.000000
-0:381  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
+0:377  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; (global void)
 0:377    Function Parameters: 
 0:377      'inF0' (in float)
 0:377      'inF1' (in float)
@@ -2499,20 +2499,20 @@
 0:378        move second child to first child (temp float)
 0:378          'r0' (temp float)
 0:378          component-wise multiply (temp float)
-0:378            'inF0' (in float)
 0:378            'inF1' (in float)
+0:378            'inF0' (in float)
 0:378      Sequence
 0:378        move second child to first child (temp 2-component vector of float)
 0:378          'r1' (temp 2-component vector of float)
 0:378          vector-scale (temp 2-component vector of float)
-0:378            'inFV0' (in 2-component vector of float)
 0:378            'inF0' (in float)
+0:378            'inFV0' (in 2-component vector of float)
 0:378      Sequence
 0:378        move second child to first child (temp 2-component vector of float)
 0:378          'r2' (temp 2-component vector of float)
 0:378          vector-scale (temp 2-component vector of float)
-0:378            'inF0' (in float)
 0:378            'inFV0' (in 2-component vector of float)
+0:378            'inF0' (in float)
 0:378      Sequence
 0:378        move second child to first child (temp float)
 0:378          'r3' (temp float)
@@ -2522,34 +2522,34 @@
 0:378      Sequence
 0:378        move second child to first child (temp 2-component vector of float)
 0:378          'r4' (temp 2-component vector of float)
-0:378          matrix-times-vector (temp 2-component vector of float)
-0:378            'inFM0' (in 2X2 matrix of float)
-0:378            'inFV0' (in 2-component vector of float)
-0:378      Sequence
-0:378        move second child to first child (temp 2-component vector of float)
-0:378          'r5' (temp 2-component vector of float)
 0:378          vector-times-matrix (temp 2-component vector of float)
 0:378            'inFV0' (in 2-component vector of float)
 0:378            'inFM0' (in 2X2 matrix of float)
 0:378      Sequence
+0:378        move second child to first child (temp 2-component vector of float)
+0:378          'r5' (temp 2-component vector of float)
+0:378          matrix-times-vector (temp 2-component vector of float)
+0:378            'inFM0' (in 2X2 matrix of float)
+0:378            'inFV0' (in 2-component vector of float)
+0:378      Sequence
 0:378        move second child to first child (temp 2X2 matrix of float)
 0:378          'r6' (temp 2X2 matrix of float)
 0:378          matrix-scale (temp 2X2 matrix of float)
-0:378            'inFM0' (in 2X2 matrix of float)
 0:378            'inF0' (in float)
+0:378            'inFM0' (in 2X2 matrix of float)
 0:378      Sequence
 0:378        move second child to first child (temp 2X2 matrix of float)
 0:378          'r7' (temp 2X2 matrix of float)
 0:378          matrix-scale (temp 2X2 matrix of float)
-0:378            'inF0' (in float)
 0:378            'inFM0' (in 2X2 matrix of float)
+0:378            'inF0' (in float)
 0:378      Sequence
 0:378        move second child to first child (temp 2X2 matrix of float)
 0:378          'r8' (temp 2X2 matrix of float)
 0:378          matrix-multiply (temp 2X2 matrix of float)
-0:378            'inFM0' (in 2X2 matrix of float)
 0:378            'inFM1' (in 2X2 matrix of float)
-0:388  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
+0:378            'inFM0' (in 2X2 matrix of float)
+0:384  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; (global void)
 0:384    Function Parameters: 
 0:384      'inF0' (in float)
 0:384      'inF1' (in float)
@@ -2562,20 +2562,20 @@
 0:385        move second child to first child (temp float)
 0:385          'r0' (temp float)
 0:385          component-wise multiply (temp float)
-0:385            'inF0' (in float)
 0:385            'inF1' (in float)
+0:385            'inF0' (in float)
 0:385      Sequence
 0:385        move second child to first child (temp 3-component vector of float)
 0:385          'r1' (temp 3-component vector of float)
 0:385          vector-scale (temp 3-component vector of float)
-0:385            'inFV0' (in 3-component vector of float)
 0:385            'inF0' (in float)
+0:385            'inFV0' (in 3-component vector of float)
 0:385      Sequence
 0:385        move second child to first child (temp 3-component vector of float)
 0:385          'r2' (temp 3-component vector of float)
 0:385          vector-scale (temp 3-component vector of float)
-0:385            'inF0' (in float)
 0:385            'inFV0' (in 3-component vector of float)
+0:385            'inF0' (in float)
 0:385      Sequence
 0:385        move second child to first child (temp float)
 0:385          'r3' (temp float)
@@ -2585,34 +2585,34 @@
 0:385      Sequence
 0:385        move second child to first child (temp 3-component vector of float)
 0:385          'r4' (temp 3-component vector of float)
-0:385          matrix-times-vector (temp 3-component vector of float)
-0:385            'inFM0' (in 3X3 matrix of float)
-0:385            'inFV0' (in 3-component vector of float)
-0:385      Sequence
-0:385        move second child to first child (temp 3-component vector of float)
-0:385          'r5' (temp 3-component vector of float)
 0:385          vector-times-matrix (temp 3-component vector of float)
 0:385            'inFV0' (in 3-component vector of float)
 0:385            'inFM0' (in 3X3 matrix of float)
 0:385      Sequence
+0:385        move second child to first child (temp 3-component vector of float)
+0:385          'r5' (temp 3-component vector of float)
+0:385          matrix-times-vector (temp 3-component vector of float)
+0:385            'inFM0' (in 3X3 matrix of float)
+0:385            'inFV0' (in 3-component vector of float)
+0:385      Sequence
 0:385        move second child to first child (temp 3X3 matrix of float)
 0:385          'r6' (temp 3X3 matrix of float)
 0:385          matrix-scale (temp 3X3 matrix of float)
-0:385            'inFM0' (in 3X3 matrix of float)
 0:385            'inF0' (in float)
+0:385            'inFM0' (in 3X3 matrix of float)
 0:385      Sequence
 0:385        move second child to first child (temp 3X3 matrix of float)
 0:385          'r7' (temp 3X3 matrix of float)
 0:385          matrix-scale (temp 3X3 matrix of float)
-0:385            'inF0' (in float)
 0:385            'inFM0' (in 3X3 matrix of float)
+0:385            'inF0' (in float)
 0:385      Sequence
 0:385        move second child to first child (temp 3X3 matrix of float)
 0:385          'r8' (temp 3X3 matrix of float)
 0:385          matrix-multiply (temp 3X3 matrix of float)
-0:385            'inFM0' (in 3X3 matrix of float)
 0:385            'inFM1' (in 3X3 matrix of float)
-0:396  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
+0:385            'inFM0' (in 3X3 matrix of float)
+0:391  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; (global void)
 0:391    Function Parameters: 
 0:391      'inF0' (in float)
 0:391      'inF1' (in float)
@@ -2625,20 +2625,20 @@
 0:392        move second child to first child (temp float)
 0:392          'r0' (temp float)
 0:392          component-wise multiply (temp float)
-0:392            'inF0' (in float)
 0:392            'inF1' (in float)
+0:392            'inF0' (in float)
 0:392      Sequence
 0:392        move second child to first child (temp 4-component vector of float)
 0:392          'r1' (temp 4-component vector of float)
 0:392          vector-scale (temp 4-component vector of float)
-0:392            'inFV0' (in 4-component vector of float)
 0:392            'inF0' (in float)
+0:392            'inFV0' (in 4-component vector of float)
 0:392      Sequence
 0:392        move second child to first child (temp 4-component vector of float)
 0:392          'r2' (temp 4-component vector of float)
 0:392          vector-scale (temp 4-component vector of float)
-0:392            'inF0' (in float)
 0:392            'inFV0' (in 4-component vector of float)
+0:392            'inF0' (in float)
 0:392      Sequence
 0:392        move second child to first child (temp float)
 0:392          'r3' (temp float)
@@ -2648,75 +2648,75 @@
 0:392      Sequence
 0:392        move second child to first child (temp 4-component vector of float)
 0:392          'r4' (temp 4-component vector of float)
-0:392          matrix-times-vector (temp 4-component vector of float)
-0:392            'inFM0' (in 4X4 matrix of float)
-0:392            'inFV0' (in 4-component vector of float)
-0:392      Sequence
-0:392        move second child to first child (temp 4-component vector of float)
-0:392          'r5' (temp 4-component vector of float)
 0:392          vector-times-matrix (temp 4-component vector of float)
 0:392            'inFV0' (in 4-component vector of float)
 0:392            'inFM0' (in 4X4 matrix of float)
 0:392      Sequence
+0:392        move second child to first child (temp 4-component vector of float)
+0:392          'r5' (temp 4-component vector of float)
+0:392          matrix-times-vector (temp 4-component vector of float)
+0:392            'inFM0' (in 4X4 matrix of float)
+0:392            'inFV0' (in 4-component vector of float)
+0:392      Sequence
 0:392        move second child to first child (temp 4X4 matrix of float)
 0:392          'r6' (temp 4X4 matrix of float)
 0:392          matrix-scale (temp 4X4 matrix of float)
-0:392            'inFM0' (in 4X4 matrix of float)
 0:392            'inF0' (in float)
+0:392            'inFM0' (in 4X4 matrix of float)
 0:392      Sequence
 0:392        move second child to first child (temp 4X4 matrix of float)
 0:392          'r7' (temp 4X4 matrix of float)
 0:392          matrix-scale (temp 4X4 matrix of float)
-0:392            'inF0' (in float)
 0:392            'inFM0' (in 4X4 matrix of float)
+0:392            'inF0' (in float)
 0:392      Sequence
 0:392        move second child to first child (temp 4X4 matrix of float)
 0:392          'r8' (temp 4X4 matrix of float)
 0:392          matrix-multiply (temp 4X4 matrix of float)
-0:392            'inFM0' (in 4X4 matrix of float)
 0:392            'inFM1' (in 4X4 matrix of float)
-0:420  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42; (global void)
+0:392            'inFM0' (in 4X4 matrix of float)
+0:401  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; (global void)
 0:401    Function Parameters: 
 0:401      'inF0' (in float)
 0:401      'inF1' (in float)
 0:401      'inFV2' (in 2-component vector of float)
 0:401      'inFV3' (in 3-component vector of float)
-0:401      'inFM2x3' (in 3X2 matrix of float)
-0:401      'inFM3x2' (in 2X3 matrix of float)
+0:401      'inFM2x3' (in 2X3 matrix of float)
+0:401      'inFM3x2' (in 3X2 matrix of float)
 0:401      'inFM3x3' (in 3X3 matrix of float)
-0:401      'inFM3x4' (in 4X3 matrix of float)
-0:401      'inFM2x4' (in 4X2 matrix of float)
+0:401      'inFM3x4' (in 3X4 matrix of float)
+0:401      'inFM2x4' (in 2X4 matrix of float)
 0:?     Sequence
 0:402      Sequence
 0:402        move second child to first child (temp float)
 0:402          'r00' (temp float)
 0:402          component-wise multiply (temp float)
-0:402            'inF0' (in float)
 0:402            'inF1' (in float)
+0:402            'inF0' (in float)
 0:403      Sequence
 0:403        move second child to first child (temp 2-component vector of float)
 0:403          'r01' (temp 2-component vector of float)
 0:403          vector-scale (temp 2-component vector of float)
-0:403            'inFV2' (in 2-component vector of float)
 0:403            'inF0' (in float)
+0:403            'inFV2' (in 2-component vector of float)
 0:404      Sequence
 0:404        move second child to first child (temp 3-component vector of float)
 0:404          'r02' (temp 3-component vector of float)
 0:404          vector-scale (temp 3-component vector of float)
-0:404            'inFV3' (in 3-component vector of float)
 0:404            'inF0' (in float)
+0:404            'inFV3' (in 3-component vector of float)
 0:405      Sequence
 0:405        move second child to first child (temp 2-component vector of float)
 0:405          'r03' (temp 2-component vector of float)
 0:405          vector-scale (temp 2-component vector of float)
-0:405            'inF0' (in float)
 0:405            'inFV2' (in 2-component vector of float)
+0:405            'inF0' (in float)
 0:406      Sequence
 0:406        move second child to first child (temp 3-component vector of float)
 0:406          'r04' (temp 3-component vector of float)
 0:406          vector-scale (temp 3-component vector of float)
-0:406            'inF0' (in float)
 0:406            'inFV3' (in 3-component vector of float)
+0:406            'inF0' (in float)
 0:407      Sequence
 0:407        move second child to first child (temp float)
 0:407          'r05' (temp float)
@@ -2732,63 +2732,63 @@
 0:409      Sequence
 0:409        move second child to first child (temp 3-component vector of float)
 0:409          'r07' (temp 3-component vector of float)
-0:409          vector-times-matrix (temp 3-component vector of float)
+0:409          matrix-times-vector (temp 3-component vector of float)
+0:409            'inFM2x3' (in 2X3 matrix of float)
 0:409            'inFV2' (in 2-component vector of float)
-0:409            'inFM2x3' (in 3X2 matrix of float)
 0:410      Sequence
 0:410        move second child to first child (temp 2-component vector of float)
 0:410          'r08' (temp 2-component vector of float)
-0:410          vector-times-matrix (temp 2-component vector of float)
+0:410          matrix-times-vector (temp 2-component vector of float)
+0:410            'inFM3x2' (in 3X2 matrix of float)
 0:410            'inFV3' (in 3-component vector of float)
-0:410            'inFM3x2' (in 2X3 matrix of float)
 0:411      Sequence
 0:411        move second child to first child (temp 2-component vector of float)
 0:411          'r09' (temp 2-component vector of float)
-0:411          matrix-times-vector (temp 2-component vector of float)
-0:411            'inFM2x3' (in 3X2 matrix of float)
+0:411          vector-times-matrix (temp 2-component vector of float)
 0:411            'inFV3' (in 3-component vector of float)
+0:411            'inFM2x3' (in 2X3 matrix of float)
 0:412      Sequence
 0:412        move second child to first child (temp 3-component vector of float)
 0:412          'r10' (temp 3-component vector of float)
-0:412          matrix-times-vector (temp 3-component vector of float)
-0:412            'inFM3x2' (in 2X3 matrix of float)
+0:412          vector-times-matrix (temp 3-component vector of float)
 0:412            'inFV2' (in 2-component vector of float)
+0:412            'inFM3x2' (in 3X2 matrix of float)
 0:413      Sequence
-0:413        move second child to first child (temp 3X2 matrix of float)
-0:413          'r11' (temp 3X2 matrix of float)
-0:413          matrix-scale (temp 3X2 matrix of float)
-0:413            'inFM2x3' (in 3X2 matrix of float)
+0:413        move second child to first child (temp 2X3 matrix of float)
+0:413          'r11' (temp 2X3 matrix of float)
+0:413          matrix-scale (temp 2X3 matrix of float)
 0:413            'inF0' (in float)
+0:413            'inFM2x3' (in 2X3 matrix of float)
 0:414      Sequence
-0:414        move second child to first child (temp 2X3 matrix of float)
-0:414          'r12' (temp 2X3 matrix of float)
-0:414          matrix-scale (temp 2X3 matrix of float)
-0:414            'inFM3x2' (in 2X3 matrix of float)
+0:414        move second child to first child (temp 3X2 matrix of float)
+0:414          'r12' (temp 3X2 matrix of float)
+0:414          matrix-scale (temp 3X2 matrix of float)
 0:414            'inF0' (in float)
+0:414            'inFM3x2' (in 3X2 matrix of float)
 0:415      Sequence
 0:415        move second child to first child (temp 2X2 matrix of float)
 0:415          'r13' (temp 2X2 matrix of float)
 0:415          matrix-multiply (temp 2X2 matrix of float)
-0:415            'inFM2x3' (in 3X2 matrix of float)
-0:415            'inFM3x2' (in 2X3 matrix of float)
+0:415            'inFM3x2' (in 3X2 matrix of float)
+0:415            'inFM2x3' (in 2X3 matrix of float)
 0:416      Sequence
-0:416        move second child to first child (temp 3X2 matrix of float)
-0:416          'r14' (temp 3X2 matrix of float)
-0:416          matrix-multiply (temp 3X2 matrix of float)
-0:416            'inFM2x3' (in 3X2 matrix of float)
+0:416        move second child to first child (temp 2X3 matrix of float)
+0:416          'r14' (temp 2X3 matrix of float)
+0:416          matrix-multiply (temp 2X3 matrix of float)
 0:416            'inFM3x3' (in 3X3 matrix of float)
+0:416            'inFM2x3' (in 2X3 matrix of float)
 0:417      Sequence
-0:417        move second child to first child (temp 4X2 matrix of float)
-0:417          'r15' (temp 4X2 matrix of float)
-0:417          matrix-multiply (temp 4X2 matrix of float)
-0:417            'inFM2x3' (in 3X2 matrix of float)
-0:417            'inFM3x4' (in 4X3 matrix of float)
+0:417        move second child to first child (temp 2X4 matrix of float)
+0:417          'r15' (temp 2X4 matrix of float)
+0:417          matrix-multiply (temp 2X4 matrix of float)
+0:417            'inFM3x4' (in 3X4 matrix of float)
+0:417            'inFM2x3' (in 2X3 matrix of float)
 0:418      Sequence
-0:418        move second child to first child (temp 4X3 matrix of float)
-0:418          'r16' (temp 4X3 matrix of float)
-0:418          matrix-multiply (temp 4X3 matrix of float)
-0:418            'inFM3x2' (in 2X3 matrix of float)
-0:418            'inFM2x4' (in 4X2 matrix of float)
+0:418        move second child to first child (temp 3X4 matrix of float)
+0:418          'r16' (temp 3X4 matrix of float)
+0:418          matrix-multiply (temp 3X4 matrix of float)
+0:418            'inFM2x4' (in 2X4 matrix of float)
+0:418            'inFM3x2' (in 3X2 matrix of float)
 0:?   Linker Objects
 
 // Module Version 10000
@@ -2799,7 +2799,6 @@
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Vertex 4  "VertexShaderFunction"
-                              Source HLSL 450
                               Name 4  "VertexShaderFunction"
                               Name 16  "VertexShaderFunctionS(f1;f1;f1;u1;u1;"
                               Name 11  "inF0"
@@ -2862,7 +2861,7 @@
                               Name 106  "inFV1"
                               Name 107  "inFM0"
                               Name 108  "inFM1"
-                              Name 129  "TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42;"
+                              Name 129  "TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;"
                               Name 120  "inF0"
                               Name 121  "inF1"
                               Name 122  "inFV2"
@@ -2958,13 +2957,13 @@
               84:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 25(ptr) 61(ptr) 61(ptr)
               93:             TypeFunction 2 7(ptr) 7(ptr) 37(ptr) 37(ptr) 69(ptr) 69(ptr)
              102:             TypeFunction 2 7(ptr) 7(ptr) 49(ptr) 49(ptr) 77(ptr) 77(ptr)
-             111:             TypeMatrix 24(fvec2) 3
+             111:             TypeMatrix 36(fvec3) 2
              112:             TypePointer Function 111
-             113:             TypeMatrix 36(fvec3) 2
+             113:             TypeMatrix 24(fvec2) 3
              114:             TypePointer Function 113
-             115:             TypeMatrix 36(fvec3) 4
+             115:             TypeMatrix 48(fvec4) 3
              116:             TypePointer Function 115
-             117:             TypeMatrix 24(fvec2) 4
+             117:             TypeMatrix 48(fvec4) 2
              118:             TypePointer Function 117
              119:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 37(ptr) 112(ptr) 114(ptr) 69(ptr) 116(ptr) 118(ptr)
              132:             TypeBool
@@ -3987,40 +3986,40 @@
         1086(r6):     61(ptr) Variable Function
         1090(r7):     61(ptr) Variable Function
         1094(r8):     61(ptr) Variable Function
-            1063:    6(float) Load 85(inF0)
-            1064:    6(float) Load 86(inF1)
+            1063:    6(float) Load 86(inF1)
+            1064:    6(float) Load 85(inF0)
             1065:    6(float) FMul 1063 1064
                               Store 1062(r0) 1065
-            1067:   24(fvec2) Load 87(inFV0)
-            1068:    6(float) Load 85(inF0)
-            1069:   24(fvec2) VectorTimesScalar 1067 1068
+            1067:    6(float) Load 85(inF0)
+            1068:   24(fvec2) Load 87(inFV0)
+            1069:   24(fvec2) VectorTimesScalar 1068 1067
                               Store 1066(r1) 1069
-            1071:    6(float) Load 85(inF0)
-            1072:   24(fvec2) Load 87(inFV0)
-            1073:   24(fvec2) VectorTimesScalar 1072 1071
+            1071:   24(fvec2) Load 87(inFV0)
+            1072:    6(float) Load 85(inF0)
+            1073:   24(fvec2) VectorTimesScalar 1071 1072
                               Store 1070(r2) 1073
             1075:   24(fvec2) Load 87(inFV0)
             1076:   24(fvec2) Load 88(inFV1)
             1077:    6(float) Dot 1075 1076
                               Store 1074(r3) 1077
-            1079:          60 Load 89(inFM0)
-            1080:   24(fvec2) Load 87(inFV0)
-            1081:   24(fvec2) MatrixTimesVector 1079 1080
+            1079:   24(fvec2) Load 87(inFV0)
+            1080:          60 Load 89(inFM0)
+            1081:   24(fvec2) VectorTimesMatrix 1079 1080
                               Store 1078(r4) 1081
-            1083:   24(fvec2) Load 87(inFV0)
-            1084:          60 Load 89(inFM0)
-            1085:   24(fvec2) VectorTimesMatrix 1083 1084
+            1083:          60 Load 89(inFM0)
+            1084:   24(fvec2) Load 87(inFV0)
+            1085:   24(fvec2) MatrixTimesVector 1083 1084
                               Store 1082(r5) 1085
-            1087:          60 Load 89(inFM0)
-            1088:    6(float) Load 85(inF0)
-            1089:          60 MatrixTimesScalar 1087 1088
+            1087:    6(float) Load 85(inF0)
+            1088:          60 Load 89(inFM0)
+            1089:          60 MatrixTimesScalar 1088 1087
                               Store 1086(r6) 1089
-            1091:    6(float) Load 85(inF0)
-            1092:          60 Load 89(inFM0)
-            1093:          60 MatrixTimesScalar 1092 1091
+            1091:          60 Load 89(inFM0)
+            1092:    6(float) Load 85(inF0)
+            1093:          60 MatrixTimesScalar 1091 1092
                               Store 1090(r7) 1093
-            1095:          60 Load 89(inFM0)
-            1096:          60 Load 90(inFM1)
+            1095:          60 Load 90(inFM1)
+            1096:          60 Load 89(inFM0)
             1097:          60 MatrixTimesMatrix 1095 1096
                               Store 1094(r8) 1097
                               Return
@@ -4042,40 +4041,40 @@
         1122(r6):     69(ptr) Variable Function
         1126(r7):     69(ptr) Variable Function
         1130(r8):     69(ptr) Variable Function
-            1099:    6(float) Load 94(inF0)
-            1100:    6(float) Load 95(inF1)
+            1099:    6(float) Load 95(inF1)
+            1100:    6(float) Load 94(inF0)
             1101:    6(float) FMul 1099 1100
                               Store 1098(r0) 1101
-            1103:   36(fvec3) Load 96(inFV0)
-            1104:    6(float) Load 94(inF0)
-            1105:   36(fvec3) VectorTimesScalar 1103 1104
+            1103:    6(float) Load 94(inF0)
+            1104:   36(fvec3) Load 96(inFV0)
+            1105:   36(fvec3) VectorTimesScalar 1104 1103
                               Store 1102(r1) 1105
-            1107:    6(float) Load 94(inF0)
-            1108:   36(fvec3) Load 96(inFV0)
-            1109:   36(fvec3) VectorTimesScalar 1108 1107
+            1107:   36(fvec3) Load 96(inFV0)
+            1108:    6(float) Load 94(inF0)
+            1109:   36(fvec3) VectorTimesScalar 1107 1108
                               Store 1106(r2) 1109
             1111:   36(fvec3) Load 96(inFV0)
             1112:   36(fvec3) Load 97(inFV1)
             1113:    6(float) Dot 1111 1112
                               Store 1110(r3) 1113
-            1115:          68 Load 98(inFM0)
-            1116:   36(fvec3) Load 96(inFV0)
-            1117:   36(fvec3) MatrixTimesVector 1115 1116
+            1115:   36(fvec3) Load 96(inFV0)
+            1116:          68 Load 98(inFM0)
+            1117:   36(fvec3) VectorTimesMatrix 1115 1116
                               Store 1114(r4) 1117
-            1119:   36(fvec3) Load 96(inFV0)
-            1120:          68 Load 98(inFM0)
-            1121:   36(fvec3) VectorTimesMatrix 1119 1120
+            1119:          68 Load 98(inFM0)
+            1120:   36(fvec3) Load 96(inFV0)
+            1121:   36(fvec3) MatrixTimesVector 1119 1120
                               Store 1118(r5) 1121
-            1123:          68 Load 98(inFM0)
-            1124:    6(float) Load 94(inF0)
-            1125:          68 MatrixTimesScalar 1123 1124
+            1123:    6(float) Load 94(inF0)
+            1124:          68 Load 98(inFM0)
+            1125:          68 MatrixTimesScalar 1124 1123
                               Store 1122(r6) 1125
-            1127:    6(float) Load 94(inF0)
-            1128:          68 Load 98(inFM0)
-            1129:          68 MatrixTimesScalar 1128 1127
+            1127:          68 Load 98(inFM0)
+            1128:    6(float) Load 94(inF0)
+            1129:          68 MatrixTimesScalar 1127 1128
                               Store 1126(r7) 1129
-            1131:          68 Load 98(inFM0)
-            1132:          68 Load 99(inFM1)
+            1131:          68 Load 99(inFM1)
+            1132:          68 Load 98(inFM0)
             1133:          68 MatrixTimesMatrix 1131 1132
                               Store 1130(r8) 1133
                               Return
@@ -4097,45 +4096,45 @@
         1158(r6):     77(ptr) Variable Function
         1162(r7):     77(ptr) Variable Function
         1166(r8):     77(ptr) Variable Function
-            1135:    6(float) Load 103(inF0)
-            1136:    6(float) Load 104(inF1)
+            1135:    6(float) Load 104(inF1)
+            1136:    6(float) Load 103(inF0)
             1137:    6(float) FMul 1135 1136
                               Store 1134(r0) 1137
-            1139:   48(fvec4) Load 105(inFV0)
-            1140:    6(float) Load 103(inF0)
-            1141:   48(fvec4) VectorTimesScalar 1139 1140
+            1139:    6(float) Load 103(inF0)
+            1140:   48(fvec4) Load 105(inFV0)
+            1141:   48(fvec4) VectorTimesScalar 1140 1139
                               Store 1138(r1) 1141
-            1143:    6(float) Load 103(inF0)
-            1144:   48(fvec4) Load 105(inFV0)
-            1145:   48(fvec4) VectorTimesScalar 1144 1143
+            1143:   48(fvec4) Load 105(inFV0)
+            1144:    6(float) Load 103(inF0)
+            1145:   48(fvec4) VectorTimesScalar 1143 1144
                               Store 1142(r2) 1145
             1147:   48(fvec4) Load 105(inFV0)
             1148:   48(fvec4) Load 106(inFV1)
             1149:    6(float) Dot 1147 1148
                               Store 1146(r3) 1149
-            1151:          76 Load 107(inFM0)
-            1152:   48(fvec4) Load 105(inFV0)
-            1153:   48(fvec4) MatrixTimesVector 1151 1152
+            1151:   48(fvec4) Load 105(inFV0)
+            1152:          76 Load 107(inFM0)
+            1153:   48(fvec4) VectorTimesMatrix 1151 1152
                               Store 1150(r4) 1153
-            1155:   48(fvec4) Load 105(inFV0)
-            1156:          76 Load 107(inFM0)
-            1157:   48(fvec4) VectorTimesMatrix 1155 1156
+            1155:          76 Load 107(inFM0)
+            1156:   48(fvec4) Load 105(inFV0)
+            1157:   48(fvec4) MatrixTimesVector 1155 1156
                               Store 1154(r5) 1157
-            1159:          76 Load 107(inFM0)
-            1160:    6(float) Load 103(inF0)
-            1161:          76 MatrixTimesScalar 1159 1160
+            1159:    6(float) Load 103(inF0)
+            1160:          76 Load 107(inFM0)
+            1161:          76 MatrixTimesScalar 1160 1159
                               Store 1158(r6) 1161
-            1163:    6(float) Load 103(inF0)
-            1164:          76 Load 107(inFM0)
-            1165:          76 MatrixTimesScalar 1164 1163
+            1163:          76 Load 107(inFM0)
+            1164:    6(float) Load 103(inF0)
+            1165:          76 MatrixTimesScalar 1163 1164
                               Store 1162(r7) 1165
-            1167:          76 Load 107(inFM0)
-            1168:          76 Load 108(inFM1)
+            1167:          76 Load 108(inFM1)
+            1168:          76 Load 107(inFM0)
             1169:          76 MatrixTimesMatrix 1167 1168
                               Store 1166(r8) 1169
                               Return
                               FunctionEnd
-129(TestGenMulNxM(f1;f1;vf2;vf3;mf32;mf23;mf33;mf43;mf42;):           2 Function None 119
+129(TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;):           2 Function None 119
        120(inF0):      7(ptr) FunctionParameter
        121(inF1):      7(ptr) FunctionParameter
       122(inFV2):     25(ptr) FunctionParameter
@@ -4163,25 +4162,25 @@
        1226(r14):    112(ptr) Variable Function
        1230(r15):    118(ptr) Variable Function
        1234(r16):    116(ptr) Variable Function
-            1171:    6(float) Load 120(inF0)
-            1172:    6(float) Load 121(inF1)
+            1171:    6(float) Load 121(inF1)
+            1172:    6(float) Load 120(inF0)
             1173:    6(float) FMul 1171 1172
                               Store 1170(r00) 1173
-            1175:   24(fvec2) Load 122(inFV2)
-            1176:    6(float) Load 120(inF0)
-            1177:   24(fvec2) VectorTimesScalar 1175 1176
+            1175:    6(float) Load 120(inF0)
+            1176:   24(fvec2) Load 122(inFV2)
+            1177:   24(fvec2) VectorTimesScalar 1176 1175
                               Store 1174(r01) 1177
-            1179:   36(fvec3) Load 123(inFV3)
-            1180:    6(float) Load 120(inF0)
-            1181:   36(fvec3) VectorTimesScalar 1179 1180
+            1179:    6(float) Load 120(inF0)
+            1180:   36(fvec3) Load 123(inFV3)
+            1181:   36(fvec3) VectorTimesScalar 1180 1179
                               Store 1178(r02) 1181
-            1183:    6(float) Load 120(inF0)
-            1184:   24(fvec2) Load 122(inFV2)
-            1185:   24(fvec2) VectorTimesScalar 1184 1183
+            1183:   24(fvec2) Load 122(inFV2)
+            1184:    6(float) Load 120(inF0)
+            1185:   24(fvec2) VectorTimesScalar 1183 1184
                               Store 1182(r03) 1185
-            1187:    6(float) Load 120(inF0)
-            1188:   36(fvec3) Load 123(inFV3)
-            1189:   36(fvec3) VectorTimesScalar 1188 1187
+            1187:   36(fvec3) Load 123(inFV3)
+            1188:    6(float) Load 120(inF0)
+            1189:   36(fvec3) VectorTimesScalar 1187 1188
                               Store 1186(r04) 1189
             1191:   24(fvec2) Load 122(inFV2)
             1192:   24(fvec2) Load 122(inFV2)
@@ -4191,44 +4190,44 @@
             1196:   36(fvec3) Load 123(inFV3)
             1197:    6(float) Dot 1195 1196
                               Store 1194(r06) 1197
-            1199:   24(fvec2) Load 122(inFV2)
-            1200:         111 Load 124(inFM2x3)
-            1201:   36(fvec3) VectorTimesMatrix 1199 1200
+            1199:         111 Load 124(inFM2x3)
+            1200:   24(fvec2) Load 122(inFV2)
+            1201:   36(fvec3) MatrixTimesVector 1199 1200
                               Store 1198(r07) 1201
-            1203:   36(fvec3) Load 123(inFV3)
-            1204:         113 Load 125(inFM3x2)
-            1205:   24(fvec2) VectorTimesMatrix 1203 1204
+            1203:         113 Load 125(inFM3x2)
+            1204:   36(fvec3) Load 123(inFV3)
+            1205:   24(fvec2) MatrixTimesVector 1203 1204
                               Store 1202(r08) 1205
-            1207:         111 Load 124(inFM2x3)
-            1208:   36(fvec3) Load 123(inFV3)
-            1209:   24(fvec2) MatrixTimesVector 1207 1208
+            1207:   36(fvec3) Load 123(inFV3)
+            1208:         111 Load 124(inFM2x3)
+            1209:   24(fvec2) VectorTimesMatrix 1207 1208
                               Store 1206(r09) 1209
-            1211:         113 Load 125(inFM3x2)
-            1212:   24(fvec2) Load 122(inFV2)
-            1213:   36(fvec3) MatrixTimesVector 1211 1212
+            1211:   24(fvec2) Load 122(inFV2)
+            1212:         113 Load 125(inFM3x2)
+            1213:   36(fvec3) VectorTimesMatrix 1211 1212
                               Store 1210(r10) 1213
-            1215:         111 Load 124(inFM2x3)
-            1216:    6(float) Load 120(inF0)
-            1217:         111 MatrixTimesScalar 1215 1216
+            1215:    6(float) Load 120(inF0)
+            1216:         111 Load 124(inFM2x3)
+            1217:         111 MatrixTimesScalar 1216 1215
                               Store 1214(r11) 1217
-            1219:         113 Load 125(inFM3x2)
-            1220:    6(float) Load 120(inF0)
-            1221:         113 MatrixTimesScalar 1219 1220
+            1219:    6(float) Load 120(inF0)
+            1220:         113 Load 125(inFM3x2)
+            1221:         113 MatrixTimesScalar 1220 1219
                               Store 1218(r12) 1221
-            1223:         111 Load 124(inFM2x3)
-            1224:         113 Load 125(inFM3x2)
+            1223:         113 Load 125(inFM3x2)
+            1224:         111 Load 124(inFM2x3)
             1225:          60 MatrixTimesMatrix 1223 1224
                               Store 1222(r13) 1225
-            1227:         111 Load 124(inFM2x3)
-            1228:          68 Load 126(inFM3x3)
+            1227:          68 Load 126(inFM3x3)
+            1228:         111 Load 124(inFM2x3)
             1229:         111 MatrixTimesMatrix 1227 1228
                               Store 1226(r14) 1229
-            1231:         111 Load 124(inFM2x3)
-            1232:         115 Load 127(inFM3x4)
+            1231:         115 Load 127(inFM3x4)
+            1232:         111 Load 124(inFM2x3)
             1233:         117 MatrixTimesMatrix 1231 1232
                               Store 1230(r15) 1233
-            1235:         113 Load 125(inFM3x2)
-            1236:         117 Load 128(inFM2x4)
+            1235:         117 Load 128(inFM2x4)
+            1236:         113 Load 125(inFM3x2)
             1237:         115 MatrixTimesMatrix 1235 1236
                               Store 1234(r16) 1237
                               Return
diff --git a/Test/baseResults/hlsl.layout.frag.out b/Test/baseResults/hlsl.layout.frag.out
new file mode 100755
index 0000000..4455385
--- /dev/null
+++ b/Test/baseResults/hlsl.layout.frag.out
@@ -0,0 +1,137 @@
+hlsl.layout.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:16  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:16    Function Parameters: 
+0:16      'input' (in 4-component vector of float)
+0:?     Sequence
+0:17      Branch: Return with expression
+0:17        add (temp 4-component vector of float)
+0:17          add (temp 4-component vector of float)
+0:17            add (temp 4-component vector of float)
+0:17              'input' (in 4-component vector of float)
+0:17              v1: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
+0:17                'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17            v5: direct index for structure (layout(column_major std430 offset=0 ) buffer 4-component vector of float)
+0:17              'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
+0:17              Constant:
+0:17                0 (const uint)
+0:17          v1PostLayout: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
+0:17            'anon@2' (layout(set=4 binding=7 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})
+0:17            Constant:
+0:17              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
+0:?     'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
+0:?     'specConst' (specialization-constant const int)
+0:?       10 (const int)
+0:?     'anon@2' (layout(set=4 binding=7 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:16  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:16    Function Parameters: 
+0:16      'input' (in 4-component vector of float)
+0:?     Sequence
+0:17      Branch: Return with expression
+0:17        add (temp 4-component vector of float)
+0:17          add (temp 4-component vector of float)
+0:17            add (temp 4-component vector of float)
+0:17              'input' (in 4-component vector of float)
+0:17              v1: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
+0:17                'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17            v5: direct index for structure (layout(column_major std430 offset=0 ) buffer 4-component vector of float)
+0:17              'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
+0:17              Constant:
+0:17                0 (const uint)
+0:17          v1PostLayout: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
+0:17            'anon@2' (layout(set=4 binding=7 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})
+0:17            Constant:
+0:17              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
+0:?     'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
+0:?     'specConst' (specialization-constant const int)
+0:?       10 (const int)
+0:?     'anon@2' (layout(set=4 binding=7 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 39
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 11  "PixelShaderFunction(vf4;"
+                              Name 10  "input"
+                              Name 14  ""
+                              MemberName 14 0  "v1"
+                              Name 16  ""
+                              Name 23  ""
+                              MemberName 23 0  "v5"
+                              Name 25  ""
+                              Name 30  ""
+                              MemberName 30 0  "v1PostLayout"
+                              Name 32  ""
+                              MemberDecorate 14 0 Offset 16
+                              Decorate 14 BufferBlock
+                              Decorate 16 DescriptorSet 3
+                              Decorate 16 Binding 5
+                              MemberDecorate 23 0 Offset 0
+                              Decorate 23 BufferBlock
+                              MemberDecorate 30 0 Offset 16
+                              Decorate 30 BufferBlock
+                              Decorate 32 DescriptorSet 4
+                              Decorate 32 Binding 7
+                              Decorate 38 SpecId 17
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              14:             TypeStruct 7(fvec4)
+              15:             TypePointer Uniform 14(struct)
+              16:     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:             TypePointer Uniform 7(fvec4)
+              23:             TypeStruct 7(fvec4)
+              24:             TypePointer PushConstant 23(struct)
+              25:     24(ptr) Variable PushConstant
+              26:             TypePointer PushConstant 7(fvec4)
+              30:             TypeStruct 7(fvec4)
+              31:             TypePointer Uniform 30(struct)
+              32:     31(ptr) Variable Uniform
+              38:     17(int) SpecConstant 10
+         4(main):           2 Function None 3
+               5:             Label
+                              FunctionEnd
+11(PixelShaderFunction(vf4;):    7(fvec4) Function None 9
+       10(input):      8(ptr) FunctionParameter
+              12:             Label
+              13:    7(fvec4) Load 10(input)
+              20:     19(ptr) AccessChain 16 18
+              21:    7(fvec4) Load 20
+              22:    7(fvec4) FAdd 13 21
+              27:     26(ptr) AccessChain 25 18
+              28:    7(fvec4) Load 27
+              29:    7(fvec4) FAdd 22 28
+              33:     19(ptr) AccessChain 32 18
+              34:    7(fvec4) Load 33
+              35:    7(fvec4) FAdd 29 34
+                              ReturnValue 35
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.load.2dms.dx10.frag.out b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
index c9f4c91..051f201 100644
--- a/Test/baseResults/hlsl.load.2dms.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:57  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:32      textureFetch (global 4-component vector of float)
@@ -73,7 +73,7 @@
 0:49        'o2' (uniform 2-component vector of int)
 0:51      move second child to first child (temp 4-component vector of float)
 0:51        Color: direct index for structure (temp 4-component vector of float)
-0:51          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:51          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:51          Constant:
 0:51            0 (const int)
 0:51        Constant:
@@ -82,14 +82,27 @@
 0:51          1.000000
 0:51          1.000000
 0:52      move second child to first child (temp float)
-0:52        Depth: direct index for structure (temp float FragDepth)
-0:52          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:52        Depth: direct index for structure (temp float)
+0:52          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:52          Constant:
 0:52            1 (const int)
 0:52        Constant:
 0:52          1.000000
-0:54      Branch: Return with expression
-0:54        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:54          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:54            Color: direct index for structure (temp 4-component vector of float)
+0:54              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:54              Constant:
+0:54                0 (const int)
+0:54          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:54            Depth: direct index for structure (temp float)
+0:54              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:54              Constant:
+0:54                1 (const int)
+0:54        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex2dmsf4' (uniform texture2DMS)
@@ -106,6 +119,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -114,7 +129,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:57  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:32      textureFetch (global 4-component vector of float)
@@ -185,7 +200,7 @@
 0:49        'o2' (uniform 2-component vector of int)
 0:51      move second child to first child (temp 4-component vector of float)
 0:51        Color: direct index for structure (temp 4-component vector of float)
-0:51          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:51          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:51          Constant:
 0:51            0 (const int)
 0:51        Constant:
@@ -194,14 +209,27 @@
 0:51          1.000000
 0:51          1.000000
 0:52      move second child to first child (temp float)
-0:52        Depth: direct index for structure (temp float FragDepth)
-0:52          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:52        Depth: direct index for structure (temp float)
+0:52          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:52          Constant:
 0:52            1 (const int)
 0:52        Constant:
 0:52          1.000000
-0:54      Branch: Return with expression
-0:54        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:54          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:54            Color: direct index for structure (temp 4-component vector of float)
+0:54              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:54              Constant:
+0:54                0 (const int)
+0:54          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:54            Depth: direct index for structure (temp float)
+0:54              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:54              Constant:
+0:54                1 (const int)
+0:54        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex2dmsf4' (uniform texture2DMS)
@@ -218,19 +246,20 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 103
+// Id's are bound by 110
 
                               Capability Shader
                               Capability ImageGatherExtended
                               Capability ImageMSArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 92 96
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "g_tTex2dmsf4"
                               Name 14  "c2"
@@ -245,21 +274,24 @@
                               MemberName 80(PS_OUTPUT) 0  "Color"
                               MemberName 80(PS_OUTPUT) 1  "Depth"
                               Name 82  "psout"
-                              Name 95  "g_sSamp"
-                              Name 97  "c1"
-                              Name 99  "c4"
-                              Name 100  "o1"
-                              Name 101  "o3"
-                              Name 102  "o4"
+                              Name 92  "Color"
+                              Name 96  "Depth"
+                              Name 102  "g_sSamp"
+                              Name 104  "c1"
+                              Name 106  "c4"
+                              Name 107  "o1"
+                              Name 108  "o3"
+                              Name 109  "o4"
                               Decorate 9(g_tTex2dmsf4) DescriptorSet 0
                               Decorate 21(g_tTex2dmsi4) DescriptorSet 0
                               Decorate 29(g_tTex2dmsu4) DescriptorSet 0
                               Decorate 49(g_tTex2dmsf4a) DescriptorSet 0
                               Decorate 58(g_tTex2dmsi4a) DescriptorSet 0
                               Decorate 64(g_tTex2dmsu4a) DescriptorSet 0
-                              MemberDecorate 80(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 95(g_sSamp) DescriptorSet 0
-                              Decorate 95(g_sSamp) Binding 0
+                              Decorate 92(Color) Location 0
+                              Decorate 96(Depth) BuiltIn FragDepth
+                              Decorate 102(g_sSamp) DescriptorSet 0
+                              Decorate 102(g_sSamp) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -302,16 +334,20 @@
               86:             TypePointer Function 17(fvec4)
               88:     11(int) Constant 1
               89:             TypePointer Function 6(float)
-              93:             TypeSampler
-              94:             TypePointer UniformConstant 93
-     95(g_sSamp):     94(ptr) Variable UniformConstant
-              96:             TypePointer UniformConstant 11(int)
-          97(c1):     96(ptr) Variable UniformConstant
-              98:             TypePointer UniformConstant 24(ivec4)
-          99(c4):     98(ptr) Variable UniformConstant
-         100(o1):     96(ptr) Variable UniformConstant
-         101(o3):     52(ptr) Variable UniformConstant
-         102(o4):     98(ptr) Variable UniformConstant
+              91:             TypePointer Output 17(fvec4)
+       92(Color):     91(ptr) Variable Output
+              95:             TypePointer Output 6(float)
+       96(Depth):     95(ptr) Variable Output
+             100:             TypeSampler
+             101:             TypePointer UniformConstant 100
+    102(g_sSamp):    101(ptr) Variable UniformConstant
+             103:             TypePointer UniformConstant 11(int)
+         104(c1):    103(ptr) Variable UniformConstant
+             105:             TypePointer UniformConstant 24(ivec4)
+         106(c4):    105(ptr) Variable UniformConstant
+         107(o1):    103(ptr) Variable UniformConstant
+         108(o3):     52(ptr) Variable UniformConstant
+         109(o4):    105(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
        82(psout):     81(ptr) Variable Function
@@ -361,6 +397,11 @@
                               Store 87 85
               90:     89(ptr) AccessChain 82(psout) 88
                               Store 90 84
-              91:80(PS_OUTPUT) Load 82(psout)
-                              ReturnValue 91
+              93:     86(ptr) AccessChain 82(psout) 83
+              94:   17(fvec4) Load 93
+                              Store 92(Color) 94
+              97:     89(ptr) AccessChain 82(psout) 88
+              98:    6(float) Load 97
+                              Store 96(Depth) 98
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.load.array.dx10.frag.out b/Test/baseResults/hlsl.load.array.dx10.frag.out
index ea7e347..3723883 100644
--- a/Test/baseResults/hlsl.load.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.array.dx10.frag.out
@@ -2,7 +2,7 @@
 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:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetch (global 4-component vector of float)
@@ -91,7 +91,7 @@
 0:59            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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:67          Constant:
 0:67            0 (const int)
 0:67        Constant:
@@ -100,14 +100,27 @@
 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        Depth: direct index for structure (temp float)
+0:68          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:70          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:70            Color: direct index for structure (temp 4-component vector of float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                0 (const int)
+0:70          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:70            Depth: direct index for structure (temp float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                1 (const int)
+0:70        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -139,6 +152,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -147,7 +162,7 @@
 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:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetch (global 4-component vector of float)
@@ -236,7 +251,7 @@
 0:59            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          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:67          Constant:
 0:67            0 (const int)
 0:67        Constant:
@@ -245,14 +260,27 @@
 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        Depth: direct index for structure (temp float)
+0:68          'psout' (temp structure{temp 4-component vector of float Color, temp float 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:?       Sequence
+0:?         Sequence
+0:70          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:70            Color: direct index for structure (temp 4-component vector of float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                0 (const int)
+0:70          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:70            Depth: direct index for structure (temp float)
+0:70              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:70              Constant:
+0:70                1 (const int)
+0:70        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -284,19 +312,20 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 143
+// Id's are bound by 150
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 87 91
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "g_tTex1df4a"
                               Name 14  "c3"
@@ -310,53 +339,56 @@
                               MemberName 75(PS_OUTPUT) 0  "Color"
                               MemberName 75(PS_OUTPUT) 1  "Depth"
                               Name 77  "psout"
-                              Name 90  "g_sSamp"
-                              Name 93  "g_tTex1df4"
-                              Name 96  "g_tTex1di4"
-                              Name 99  "g_tTex1du4"
-                              Name 102  "g_tTex2df4"
-                              Name 105  "g_tTex2di4"
-                              Name 108  "g_tTex2du4"
-                              Name 111  "g_tTex3df4"
-                              Name 114  "g_tTex3di4"
-                              Name 117  "g_tTex3du4"
-                              Name 120  "g_tTexcdf4"
-                              Name 123  "g_tTexcdi4"
-                              Name 126  "g_tTexcdu4"
-                              Name 129  "g_tTexcdf4a"
-                              Name 132  "g_tTexcdi4a"
-                              Name 135  "g_tTexcdu4a"
-                              Name 136  "c1"
-                              Name 138  "c2"
-                              Name 139  "o1"
-                              Name 140  "o2"
-                              Name 141  "o3"
-                              Name 142  "o4"
+                              Name 87  "Color"
+                              Name 91  "Depth"
+                              Name 97  "g_sSamp"
+                              Name 100  "g_tTex1df4"
+                              Name 103  "g_tTex1di4"
+                              Name 106  "g_tTex1du4"
+                              Name 109  "g_tTex2df4"
+                              Name 112  "g_tTex2di4"
+                              Name 115  "g_tTex2du4"
+                              Name 118  "g_tTex3df4"
+                              Name 121  "g_tTex3di4"
+                              Name 124  "g_tTex3du4"
+                              Name 127  "g_tTexcdf4"
+                              Name 130  "g_tTexcdi4"
+                              Name 133  "g_tTexcdu4"
+                              Name 136  "g_tTexcdf4a"
+                              Name 139  "g_tTexcdi4a"
+                              Name 142  "g_tTexcdu4a"
+                              Name 143  "c1"
+                              Name 145  "c2"
+                              Name 146  "o1"
+                              Name 147  "o2"
+                              Name 148  "o3"
+                              Name 149  "o4"
                               Decorate 9(g_tTex1df4a) DescriptorSet 0
                               Decorate 27(g_tTex1di4a) DescriptorSet 0
                               Decorate 37(g_tTex1du4a) DescriptorSet 0
                               Decorate 47(g_tTex2df4a) DescriptorSet 0
                               Decorate 59(g_tTex2di4a) DescriptorSet 0
                               Decorate 68(g_tTex2du4a) DescriptorSet 0
-                              MemberDecorate 75(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 90(g_sSamp) DescriptorSet 0
-                              Decorate 90(g_sSamp) Binding 0
-                              Decorate 93(g_tTex1df4) DescriptorSet 0
-                              Decorate 93(g_tTex1df4) Binding 0
-                              Decorate 96(g_tTex1di4) DescriptorSet 0
-                              Decorate 99(g_tTex1du4) DescriptorSet 0
-                              Decorate 102(g_tTex2df4) DescriptorSet 0
-                              Decorate 105(g_tTex2di4) DescriptorSet 0
-                              Decorate 108(g_tTex2du4) DescriptorSet 0
-                              Decorate 111(g_tTex3df4) DescriptorSet 0
-                              Decorate 114(g_tTex3di4) DescriptorSet 0
-                              Decorate 117(g_tTex3du4) DescriptorSet 0
-                              Decorate 120(g_tTexcdf4) DescriptorSet 0
-                              Decorate 123(g_tTexcdi4) DescriptorSet 0
-                              Decorate 126(g_tTexcdu4) DescriptorSet 0
-                              Decorate 129(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 132(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 135(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 87(Color) Location 0
+                              Decorate 91(Depth) BuiltIn FragDepth
+                              Decorate 97(g_sSamp) DescriptorSet 0
+                              Decorate 97(g_sSamp) Binding 0
+                              Decorate 100(g_tTex1df4) DescriptorSet 0
+                              Decorate 100(g_tTex1df4) Binding 0
+                              Decorate 103(g_tTex1di4) DescriptorSet 0
+                              Decorate 106(g_tTex1du4) DescriptorSet 0
+                              Decorate 109(g_tTex2df4) DescriptorSet 0
+                              Decorate 112(g_tTex2di4) DescriptorSet 0
+                              Decorate 115(g_tTex2du4) DescriptorSet 0
+                              Decorate 118(g_tTex3df4) DescriptorSet 0
+                              Decorate 121(g_tTex3di4) DescriptorSet 0
+                              Decorate 124(g_tTex3du4) DescriptorSet 0
+                              Decorate 127(g_tTexcdf4) DescriptorSet 0
+                              Decorate 130(g_tTexcdi4) DescriptorSet 0
+                              Decorate 133(g_tTexcdu4) DescriptorSet 0
+                              Decorate 136(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 139(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 142(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -400,61 +432,65 @@
               81:             TypePointer Function 23(fvec4)
               83:     11(int) Constant 1
               84:             TypePointer Function 6(float)
-              88:             TypeSampler
-              89:             TypePointer UniformConstant 88
-     90(g_sSamp):     89(ptr) Variable UniformConstant
-              91:             TypeImage 6(float) 1D sampled format:Unknown
-              92:             TypePointer UniformConstant 91
-  93(g_tTex1df4):     92(ptr) Variable UniformConstant
-              94:             TypeImage 11(int) 1D sampled format:Unknown
-              95:             TypePointer UniformConstant 94
-  96(g_tTex1di4):     95(ptr) Variable UniformConstant
-              97:             TypeImage 18(int) 1D sampled format:Unknown
-              98:             TypePointer UniformConstant 97
-  99(g_tTex1du4):     98(ptr) Variable UniformConstant
-             100:             TypeImage 6(float) 2D sampled format:Unknown
-             101:             TypePointer UniformConstant 100
- 102(g_tTex2df4):    101(ptr) Variable UniformConstant
-             103:             TypeImage 11(int) 2D sampled format:Unknown
-             104:             TypePointer UniformConstant 103
- 105(g_tTex2di4):    104(ptr) Variable UniformConstant
-             106:             TypeImage 18(int) 2D sampled format:Unknown
-             107:             TypePointer UniformConstant 106
- 108(g_tTex2du4):    107(ptr) Variable UniformConstant
-             109:             TypeImage 6(float) 3D sampled format:Unknown
-             110:             TypePointer UniformConstant 109
- 111(g_tTex3df4):    110(ptr) Variable UniformConstant
-             112:             TypeImage 11(int) 3D sampled format:Unknown
-             113:             TypePointer UniformConstant 112
- 114(g_tTex3di4):    113(ptr) Variable UniformConstant
-             115:             TypeImage 18(int) 3D sampled format:Unknown
-             116:             TypePointer UniformConstant 115
- 117(g_tTex3du4):    116(ptr) Variable UniformConstant
-             118:             TypeImage 6(float) Cube sampled format:Unknown
-             119:             TypePointer UniformConstant 118
- 120(g_tTexcdf4):    119(ptr) Variable UniformConstant
-             121:             TypeImage 11(int) Cube sampled format:Unknown
-             122:             TypePointer UniformConstant 121
- 123(g_tTexcdi4):    122(ptr) Variable UniformConstant
-             124:             TypeImage 18(int) Cube sampled format:Unknown
-             125:             TypePointer UniformConstant 124
- 126(g_tTexcdu4):    125(ptr) Variable UniformConstant
-             127:             TypeImage 6(float) Cube array sampled format:Unknown
-             128:             TypePointer UniformConstant 127
-129(g_tTexcdf4a):    128(ptr) Variable UniformConstant
-             130:             TypeImage 11(int) Cube array sampled format:Unknown
-             131:             TypePointer UniformConstant 130
-132(g_tTexcdi4a):    131(ptr) Variable UniformConstant
-             133:             TypeImage 18(int) Cube array sampled format:Unknown
-             134:             TypePointer UniformConstant 133
-135(g_tTexcdu4a):    134(ptr) Variable UniformConstant
-         136(c1):     20(ptr) Variable UniformConstant
-             137:             TypePointer UniformConstant 15(ivec2)
-         138(c2):    137(ptr) Variable UniformConstant
-         139(o1):     20(ptr) Variable UniformConstant
-         140(o2):    137(ptr) Variable UniformConstant
-         141(o3):     13(ptr) Variable UniformConstant
-         142(o4):     49(ptr) Variable UniformConstant
+              86:             TypePointer Output 23(fvec4)
+       87(Color):     86(ptr) Variable Output
+              90:             TypePointer Output 6(float)
+       91(Depth):     90(ptr) Variable Output
+              95:             TypeSampler
+              96:             TypePointer UniformConstant 95
+     97(g_sSamp):     96(ptr) Variable UniformConstant
+              98:             TypeImage 6(float) 1D sampled format:Unknown
+              99:             TypePointer UniformConstant 98
+ 100(g_tTex1df4):     99(ptr) Variable UniformConstant
+             101:             TypeImage 11(int) 1D sampled format:Unknown
+             102:             TypePointer UniformConstant 101
+ 103(g_tTex1di4):    102(ptr) Variable UniformConstant
+             104:             TypeImage 18(int) 1D sampled format:Unknown
+             105:             TypePointer UniformConstant 104
+ 106(g_tTex1du4):    105(ptr) Variable UniformConstant
+             107:             TypeImage 6(float) 2D sampled format:Unknown
+             108:             TypePointer UniformConstant 107
+ 109(g_tTex2df4):    108(ptr) Variable UniformConstant
+             110:             TypeImage 11(int) 2D sampled format:Unknown
+             111:             TypePointer UniformConstant 110
+ 112(g_tTex2di4):    111(ptr) Variable UniformConstant
+             113:             TypeImage 18(int) 2D sampled format:Unknown
+             114:             TypePointer UniformConstant 113
+ 115(g_tTex2du4):    114(ptr) Variable UniformConstant
+             116:             TypeImage 6(float) 3D sampled format:Unknown
+             117:             TypePointer UniformConstant 116
+ 118(g_tTex3df4):    117(ptr) Variable UniformConstant
+             119:             TypeImage 11(int) 3D sampled format:Unknown
+             120:             TypePointer UniformConstant 119
+ 121(g_tTex3di4):    120(ptr) Variable UniformConstant
+             122:             TypeImage 18(int) 3D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex3du4):    123(ptr) Variable UniformConstant
+             125:             TypeImage 6(float) Cube sampled format:Unknown
+             126:             TypePointer UniformConstant 125
+ 127(g_tTexcdf4):    126(ptr) Variable UniformConstant
+             128:             TypeImage 11(int) Cube sampled format:Unknown
+             129:             TypePointer UniformConstant 128
+ 130(g_tTexcdi4):    129(ptr) Variable UniformConstant
+             131:             TypeImage 18(int) Cube sampled format:Unknown
+             132:             TypePointer UniformConstant 131
+ 133(g_tTexcdu4):    132(ptr) Variable UniformConstant
+             134:             TypeImage 6(float) Cube array sampled format:Unknown
+             135:             TypePointer UniformConstant 134
+136(g_tTexcdf4a):    135(ptr) Variable UniformConstant
+             137:             TypeImage 11(int) Cube array sampled format:Unknown
+             138:             TypePointer UniformConstant 137
+139(g_tTexcdi4a):    138(ptr) Variable UniformConstant
+             140:             TypeImage 18(int) Cube array sampled format:Unknown
+             141:             TypePointer UniformConstant 140
+142(g_tTexcdu4a):    141(ptr) Variable UniformConstant
+         143(c1):     20(ptr) Variable UniformConstant
+             144:             TypePointer UniformConstant 15(ivec2)
+         145(c2):    144(ptr) Variable UniformConstant
+         146(o1):     20(ptr) Variable UniformConstant
+         147(o2):    144(ptr) Variable UniformConstant
+         148(o3):     13(ptr) Variable UniformConstant
+         149(o4):     49(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
        77(psout):     76(ptr) Variable Function
@@ -498,6 +534,11 @@
                               Store 82 80
               85:     84(ptr) AccessChain 77(psout) 83
                               Store 85 79
-              86:75(PS_OUTPUT) Load 77(psout)
-                              ReturnValue 86
+              88:     81(ptr) AccessChain 77(psout) 78
+              89:   23(fvec4) Load 88
+                              Store 87(Color) 89
+              92:     84(ptr) AccessChain 77(psout) 83
+              93:    6(float) Load 92
+                              Store 91(Depth) 93
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.load.basic.dx10.frag.out b/Test/baseResults/hlsl.load.basic.dx10.frag.out
index 54f964e..41d44ee 100644
--- a/Test/baseResults/hlsl.load.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:77  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetch (global 4-component vector of float)
@@ -124,7 +124,7 @@
 0:64            3 (const int)
 0:72      move second child to first child (temp 4-component vector of float)
 0:72        Color: direct index for structure (temp 4-component vector of float)
-0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:72          Constant:
 0:72            0 (const int)
 0:72        Constant:
@@ -133,14 +133,27 @@
 0:72          1.000000
 0:72          1.000000
 0:73      move second child to first child (temp float)
-0:73        Depth: direct index for structure (temp float FragDepth)
-0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:73        Depth: direct index for structure (temp float)
+0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:73          Constant:
 0:73            1 (const int)
 0:73        Constant:
 0:73          1.000000
-0:75      Branch: Return with expression
-0:75        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:75          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:75            Color: direct index for structure (temp 4-component vector of float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                0 (const int)
+0:75          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:75            Depth: direct index for structure (temp float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                1 (const int)
+0:75        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -172,6 +185,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -180,7 +195,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:77  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetch (global 4-component vector of float)
@@ -302,7 +317,7 @@
 0:64            3 (const int)
 0:72      move second child to first child (temp 4-component vector of float)
 0:72        Color: direct index for structure (temp 4-component vector of float)
-0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:72          Constant:
 0:72            0 (const int)
 0:72        Constant:
@@ -311,14 +326,27 @@
 0:72          1.000000
 0:72          1.000000
 0:73      move second child to first child (temp float)
-0:73        Depth: direct index for structure (temp float FragDepth)
-0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:73        Depth: direct index for structure (temp float)
+0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:73          Constant:
 0:73            1 (const int)
 0:73        Constant:
 0:73          1.000000
-0:75      Branch: Return with expression
-0:75        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:75          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:75            Color: direct index for structure (temp 4-component vector of float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                0 (const int)
+0:75          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:75            Depth: direct index for structure (temp float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                1 (const int)
+0:75        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -350,19 +378,20 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 163
+// Id's are bound by 170
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 118 122
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "g_tTex1df4"
                               Name 14  "c2"
@@ -380,24 +409,26 @@
                               MemberName 106(PS_OUTPUT) 0  "Color"
                               MemberName 106(PS_OUTPUT) 1  "Depth"
                               Name 108  "psout"
-                              Name 121  "g_sSamp"
-                              Name 124  "g_tTexcdf4"
-                              Name 127  "g_tTexcdi4"
-                              Name 130  "g_tTexcdu4"
-                              Name 133  "g_tTex1df4a"
-                              Name 136  "g_tTex1di4a"
-                              Name 139  "g_tTex1du4a"
-                              Name 142  "g_tTex2df4a"
-                              Name 145  "g_tTex2di4a"
-                              Name 148  "g_tTex2du4a"
-                              Name 151  "g_tTexcdf4a"
-                              Name 154  "g_tTexcdi4a"
-                              Name 157  "g_tTexcdu4a"
-                              Name 158  "c1"
-                              Name 159  "o1"
-                              Name 160  "o2"
-                              Name 161  "o3"
-                              Name 162  "o4"
+                              Name 118  "Color"
+                              Name 122  "Depth"
+                              Name 128  "g_sSamp"
+                              Name 131  "g_tTexcdf4"
+                              Name 134  "g_tTexcdi4"
+                              Name 137  "g_tTexcdu4"
+                              Name 140  "g_tTex1df4a"
+                              Name 143  "g_tTex1di4a"
+                              Name 146  "g_tTex1du4a"
+                              Name 149  "g_tTex2df4a"
+                              Name 152  "g_tTex2di4a"
+                              Name 155  "g_tTex2du4a"
+                              Name 158  "g_tTexcdf4a"
+                              Name 161  "g_tTexcdi4a"
+                              Name 164  "g_tTexcdu4a"
+                              Name 165  "c1"
+                              Name 166  "o1"
+                              Name 167  "o2"
+                              Name 168  "o3"
+                              Name 169  "o4"
                               Decorate 9(g_tTex1df4) DescriptorSet 0
                               Decorate 9(g_tTex1df4) Binding 0
                               Decorate 27(g_tTex1di4) DescriptorSet 0
@@ -408,21 +439,22 @@
                               Decorate 78(g_tTex3df4) DescriptorSet 0
                               Decorate 90(g_tTex3di4) DescriptorSet 0
                               Decorate 99(g_tTex3du4) DescriptorSet 0
-                              MemberDecorate 106(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 121(g_sSamp) DescriptorSet 0
-                              Decorate 121(g_sSamp) Binding 0
-                              Decorate 124(g_tTexcdf4) DescriptorSet 0
-                              Decorate 127(g_tTexcdi4) DescriptorSet 0
-                              Decorate 130(g_tTexcdu4) DescriptorSet 0
-                              Decorate 133(g_tTex1df4a) DescriptorSet 0
-                              Decorate 136(g_tTex1di4a) DescriptorSet 0
-                              Decorate 139(g_tTex1du4a) DescriptorSet 0
-                              Decorate 142(g_tTex2df4a) DescriptorSet 0
-                              Decorate 145(g_tTex2di4a) DescriptorSet 0
-                              Decorate 148(g_tTex2du4a) DescriptorSet 0
-                              Decorate 151(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 154(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 157(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 118(Color) Location 0
+                              Decorate 122(Depth) BuiltIn FragDepth
+                              Decorate 128(g_sSamp) DescriptorSet 0
+                              Decorate 128(g_sSamp) Binding 0
+                              Decorate 131(g_tTexcdf4) DescriptorSet 0
+                              Decorate 134(g_tTexcdi4) DescriptorSet 0
+                              Decorate 137(g_tTexcdu4) DescriptorSet 0
+                              Decorate 140(g_tTex1df4a) DescriptorSet 0
+                              Decorate 143(g_tTex1di4a) DescriptorSet 0
+                              Decorate 146(g_tTex1du4a) DescriptorSet 0
+                              Decorate 149(g_tTex2df4a) DescriptorSet 0
+                              Decorate 152(g_tTex2di4a) DescriptorSet 0
+                              Decorate 155(g_tTex2du4a) DescriptorSet 0
+                              Decorate 158(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 161(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 164(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -479,50 +511,54 @@
              112:             TypePointer Function 23(fvec4)
              114:     11(int) Constant 1
              115:             TypePointer Function 6(float)
-             119:             TypeSampler
-             120:             TypePointer UniformConstant 119
-    121(g_sSamp):    120(ptr) Variable UniformConstant
-             122:             TypeImage 6(float) Cube sampled format:Unknown
-             123:             TypePointer UniformConstant 122
- 124(g_tTexcdf4):    123(ptr) Variable UniformConstant
-             125:             TypeImage 11(int) Cube sampled format:Unknown
-             126:             TypePointer UniformConstant 125
- 127(g_tTexcdi4):    126(ptr) Variable UniformConstant
-             128:             TypeImage 15(int) Cube sampled format:Unknown
-             129:             TypePointer UniformConstant 128
- 130(g_tTexcdu4):    129(ptr) Variable UniformConstant
-             131:             TypeImage 6(float) 1D array sampled format:Unknown
-             132:             TypePointer UniformConstant 131
-133(g_tTex1df4a):    132(ptr) Variable UniformConstant
-             134:             TypeImage 11(int) 1D array sampled format:Unknown
-             135:             TypePointer UniformConstant 134
-136(g_tTex1di4a):    135(ptr) Variable UniformConstant
-             137:             TypeImage 15(int) 1D array sampled format:Unknown
-             138:             TypePointer UniformConstant 137
-139(g_tTex1du4a):    138(ptr) Variable UniformConstant
-             140:             TypeImage 6(float) 2D array sampled format:Unknown
-             141:             TypePointer UniformConstant 140
-142(g_tTex2df4a):    141(ptr) Variable UniformConstant
-             143:             TypeImage 11(int) 2D array sampled format:Unknown
-             144:             TypePointer UniformConstant 143
-145(g_tTex2di4a):    144(ptr) Variable UniformConstant
-             146:             TypeImage 15(int) 2D array sampled format:Unknown
-             147:             TypePointer UniformConstant 146
-148(g_tTex2du4a):    147(ptr) Variable UniformConstant
-             149:             TypeImage 6(float) Cube array sampled format:Unknown
-             150:             TypePointer UniformConstant 149
-151(g_tTexcdf4a):    150(ptr) Variable UniformConstant
-             152:             TypeImage 11(int) Cube array sampled format:Unknown
-             153:             TypePointer UniformConstant 152
-154(g_tTexcdi4a):    153(ptr) Variable UniformConstant
-             155:             TypeImage 15(int) Cube array sampled format:Unknown
-             156:             TypePointer UniformConstant 155
-157(g_tTexcdu4a):    156(ptr) Variable UniformConstant
-         158(c1):     17(ptr) Variable UniformConstant
-         159(o1):     17(ptr) Variable UniformConstant
-         160(o2):     13(ptr) Variable UniformConstant
-         161(o3):     50(ptr) Variable UniformConstant
-         162(o4):     80(ptr) Variable UniformConstant
+             117:             TypePointer Output 23(fvec4)
+      118(Color):    117(ptr) Variable Output
+             121:             TypePointer Output 6(float)
+      122(Depth):    121(ptr) Variable Output
+             126:             TypeSampler
+             127:             TypePointer UniformConstant 126
+    128(g_sSamp):    127(ptr) Variable UniformConstant
+             129:             TypeImage 6(float) Cube sampled format:Unknown
+             130:             TypePointer UniformConstant 129
+ 131(g_tTexcdf4):    130(ptr) Variable UniformConstant
+             132:             TypeImage 11(int) Cube sampled format:Unknown
+             133:             TypePointer UniformConstant 132
+ 134(g_tTexcdi4):    133(ptr) Variable UniformConstant
+             135:             TypeImage 15(int) Cube sampled format:Unknown
+             136:             TypePointer UniformConstant 135
+ 137(g_tTexcdu4):    136(ptr) Variable UniformConstant
+             138:             TypeImage 6(float) 1D array sampled format:Unknown
+             139:             TypePointer UniformConstant 138
+140(g_tTex1df4a):    139(ptr) Variable UniformConstant
+             141:             TypeImage 11(int) 1D array sampled format:Unknown
+             142:             TypePointer UniformConstant 141
+143(g_tTex1di4a):    142(ptr) Variable UniformConstant
+             144:             TypeImage 15(int) 1D array sampled format:Unknown
+             145:             TypePointer UniformConstant 144
+146(g_tTex1du4a):    145(ptr) Variable UniformConstant
+             147:             TypeImage 6(float) 2D array sampled format:Unknown
+             148:             TypePointer UniformConstant 147
+149(g_tTex2df4a):    148(ptr) Variable UniformConstant
+             150:             TypeImage 11(int) 2D array sampled format:Unknown
+             151:             TypePointer UniformConstant 150
+152(g_tTex2di4a):    151(ptr) Variable UniformConstant
+             153:             TypeImage 15(int) 2D array sampled format:Unknown
+             154:             TypePointer UniformConstant 153
+155(g_tTex2du4a):    154(ptr) Variable UniformConstant
+             156:             TypeImage 6(float) Cube array sampled format:Unknown
+             157:             TypePointer UniformConstant 156
+158(g_tTexcdf4a):    157(ptr) Variable UniformConstant
+             159:             TypeImage 11(int) Cube array sampled format:Unknown
+             160:             TypePointer UniformConstant 159
+161(g_tTexcdi4a):    160(ptr) Variable UniformConstant
+             162:             TypeImage 15(int) Cube array sampled format:Unknown
+             163:             TypePointer UniformConstant 162
+164(g_tTexcdu4a):    163(ptr) Variable UniformConstant
+         165(c1):     17(ptr) Variable UniformConstant
+         166(o1):     17(ptr) Variable UniformConstant
+         167(o2):     13(ptr) Variable UniformConstant
+         168(o3):     50(ptr) Variable UniformConstant
+         169(o4):     80(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       108(psout):    107(ptr) Variable Function
@@ -584,6 +620,11 @@
                               Store 113 111
              116:    115(ptr) AccessChain 108(psout) 114
                               Store 116 110
-             117:106(PS_OUTPUT) Load 108(psout)
-                              ReturnValue 117
+             119:    112(ptr) AccessChain 108(psout) 109
+             120:   23(fvec4) Load 119
+                              Store 118(Color) 120
+             123:    115(ptr) AccessChain 108(psout) 114
+             124:    6(float) Load 123
+                              Store 122(Depth) 124
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.load.basic.dx10.vert.out b/Test/baseResults/hlsl.load.basic.dx10.vert.out
index cd4fea5..62e6128 100644
--- a/Test/baseResults/hlsl.load.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.load.basic.dx10.vert.out
@@ -1,7 +1,7 @@
 hlsl.load.basic.dx10.vert
 Shader version: 450
 0:? Sequence
-0:71  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:47  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:47    Function Parameters: 
 0:?     Sequence
 0:51      textureFetch (global 4-component vector of float)
@@ -122,8 +122,8 @@
 0:63          Constant:
 0:63            3 (const int)
 0:67      move second child to first child (temp 4-component vector of float)
-0:67        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:67          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:67        Pos: direct index for structure (temp 4-component vector of float)
+0:67          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:67          Constant:
 0:67            0 (const int)
 0:?         Constant:
@@ -131,8 +131,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:69      Branch: Return with expression
-0:69        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:69          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:69            Pos: direct index for structure (temp 4-component vector of float)
+0:69              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:69              Constant:
+0:69                0 (const int)
+0:69        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -164,6 +171,7 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Pos' (out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -171,7 +179,7 @@
 
 Shader version: 450
 0:? Sequence
-0:71  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:47  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:47    Function Parameters: 
 0:?     Sequence
 0:51      textureFetch (global 4-component vector of float)
@@ -292,8 +300,8 @@
 0:63          Constant:
 0:63            3 (const int)
 0:67      move second child to first child (temp 4-component vector of float)
-0:67        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:67          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:67        Pos: direct index for structure (temp 4-component vector of float)
+0:67          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:67          Constant:
 0:67            0 (const int)
 0:?         Constant:
@@ -301,8 +309,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:69      Branch: Return with expression
-0:69        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:69          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:69            Pos: direct index for structure (temp 4-component vector of float)
+0:69              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:69              Constant:
+0:69                0 (const int)
+0:69        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -334,18 +349,18 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Pos' (out 4-component vector of float Position)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 160
+// Id's are bound by 163
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main"
-                              Source HLSL 450
+                              EntryPoint Vertex 4  "main" 115
                               Name 4  "main"
                               Name 9  "g_tTex1df4"
                               Name 14  "c2"
@@ -362,24 +377,25 @@
                               Name 106  "VS_OUTPUT"
                               MemberName 106(VS_OUTPUT) 0  "Pos"
                               Name 108  "vsout"
-                              Name 118  "g_sSamp"
-                              Name 121  "g_tTexcdf4"
-                              Name 124  "g_tTexcdi4"
-                              Name 127  "g_tTexcdu4"
-                              Name 130  "g_tTex1df4a"
-                              Name 133  "g_tTex1di4a"
-                              Name 136  "g_tTex1du4a"
-                              Name 139  "g_tTex2df4a"
-                              Name 142  "g_tTex2di4a"
-                              Name 145  "g_tTex2du4a"
-                              Name 148  "g_tTexcdf4a"
-                              Name 151  "g_tTexcdi4a"
-                              Name 154  "g_tTexcdu4a"
-                              Name 155  "c1"
-                              Name 156  "o1"
-                              Name 157  "o2"
-                              Name 158  "o3"
-                              Name 159  "o4"
+                              Name 115  "Pos"
+                              Name 121  "g_sSamp"
+                              Name 124  "g_tTexcdf4"
+                              Name 127  "g_tTexcdi4"
+                              Name 130  "g_tTexcdu4"
+                              Name 133  "g_tTex1df4a"
+                              Name 136  "g_tTex1di4a"
+                              Name 139  "g_tTex1du4a"
+                              Name 142  "g_tTex2df4a"
+                              Name 145  "g_tTex2di4a"
+                              Name 148  "g_tTex2du4a"
+                              Name 151  "g_tTexcdf4a"
+                              Name 154  "g_tTexcdi4a"
+                              Name 157  "g_tTexcdu4a"
+                              Name 158  "c1"
+                              Name 159  "o1"
+                              Name 160  "o2"
+                              Name 161  "o3"
+                              Name 162  "o4"
                               Decorate 9(g_tTex1df4) DescriptorSet 0
                               Decorate 9(g_tTex1df4) Binding 0
                               Decorate 27(g_tTex1di4) DescriptorSet 0
@@ -390,21 +406,21 @@
                               Decorate 78(g_tTex3df4) DescriptorSet 0
                               Decorate 90(g_tTex3di4) DescriptorSet 0
                               Decorate 99(g_tTex3du4) DescriptorSet 0
-                              MemberDecorate 106(VS_OUTPUT) 0 BuiltIn FragCoord
-                              Decorate 118(g_sSamp) DescriptorSet 0
-                              Decorate 118(g_sSamp) Binding 0
-                              Decorate 121(g_tTexcdf4) DescriptorSet 0
-                              Decorate 124(g_tTexcdi4) DescriptorSet 0
-                              Decorate 127(g_tTexcdu4) DescriptorSet 0
-                              Decorate 130(g_tTex1df4a) DescriptorSet 0
-                              Decorate 133(g_tTex1di4a) DescriptorSet 0
-                              Decorate 136(g_tTex1du4a) DescriptorSet 0
-                              Decorate 139(g_tTex2df4a) DescriptorSet 0
-                              Decorate 142(g_tTex2di4a) DescriptorSet 0
-                              Decorate 145(g_tTex2du4a) DescriptorSet 0
-                              Decorate 148(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 151(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 154(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 115(Pos) BuiltIn Position
+                              Decorate 121(g_sSamp) DescriptorSet 0
+                              Decorate 121(g_sSamp) Binding 0
+                              Decorate 124(g_tTexcdf4) DescriptorSet 0
+                              Decorate 127(g_tTexcdi4) DescriptorSet 0
+                              Decorate 130(g_tTexcdu4) DescriptorSet 0
+                              Decorate 133(g_tTex1df4a) DescriptorSet 0
+                              Decorate 136(g_tTex1di4a) DescriptorSet 0
+                              Decorate 139(g_tTex1du4a) DescriptorSet 0
+                              Decorate 142(g_tTex2df4a) DescriptorSet 0
+                              Decorate 145(g_tTex2di4a) DescriptorSet 0
+                              Decorate 148(g_tTex2du4a) DescriptorSet 0
+                              Decorate 151(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 154(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 157(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -459,50 +475,52 @@
              110:    6(float) Constant 0
              111:   23(fvec4) ConstantComposite 110 110 110 110
              112:             TypePointer Function 23(fvec4)
-             116:             TypeSampler
-             117:             TypePointer UniformConstant 116
-    118(g_sSamp):    117(ptr) Variable UniformConstant
-             119:             TypeImage 6(float) Cube sampled format:Unknown
+             114:             TypePointer Output 23(fvec4)
+        115(Pos):    114(ptr) Variable Output
+             119:             TypeSampler
              120:             TypePointer UniformConstant 119
- 121(g_tTexcdf4):    120(ptr) Variable UniformConstant
-             122:             TypeImage 11(int) Cube sampled format:Unknown
+    121(g_sSamp):    120(ptr) Variable UniformConstant
+             122:             TypeImage 6(float) Cube sampled format:Unknown
              123:             TypePointer UniformConstant 122
- 124(g_tTexcdi4):    123(ptr) Variable UniformConstant
-             125:             TypeImage 15(int) Cube sampled format:Unknown
+ 124(g_tTexcdf4):    123(ptr) Variable UniformConstant
+             125:             TypeImage 11(int) Cube sampled format:Unknown
              126:             TypePointer UniformConstant 125
- 127(g_tTexcdu4):    126(ptr) Variable UniformConstant
-             128:             TypeImage 6(float) 1D array sampled format:Unknown
+ 127(g_tTexcdi4):    126(ptr) Variable UniformConstant
+             128:             TypeImage 15(int) Cube sampled format:Unknown
              129:             TypePointer UniformConstant 128
-130(g_tTex1df4a):    129(ptr) Variable UniformConstant
-             131:             TypeImage 11(int) 1D array sampled format:Unknown
+ 130(g_tTexcdu4):    129(ptr) Variable UniformConstant
+             131:             TypeImage 6(float) 1D array sampled format:Unknown
              132:             TypePointer UniformConstant 131
-133(g_tTex1di4a):    132(ptr) Variable UniformConstant
-             134:             TypeImage 15(int) 1D array sampled format:Unknown
+133(g_tTex1df4a):    132(ptr) Variable UniformConstant
+             134:             TypeImage 11(int) 1D array sampled format:Unknown
              135:             TypePointer UniformConstant 134
-136(g_tTex1du4a):    135(ptr) Variable UniformConstant
-             137:             TypeImage 6(float) 2D array sampled format:Unknown
+136(g_tTex1di4a):    135(ptr) Variable UniformConstant
+             137:             TypeImage 15(int) 1D array sampled format:Unknown
              138:             TypePointer UniformConstant 137
-139(g_tTex2df4a):    138(ptr) Variable UniformConstant
-             140:             TypeImage 11(int) 2D array sampled format:Unknown
+139(g_tTex1du4a):    138(ptr) Variable UniformConstant
+             140:             TypeImage 6(float) 2D array sampled format:Unknown
              141:             TypePointer UniformConstant 140
-142(g_tTex2di4a):    141(ptr) Variable UniformConstant
-             143:             TypeImage 15(int) 2D array sampled format:Unknown
+142(g_tTex2df4a):    141(ptr) Variable UniformConstant
+             143:             TypeImage 11(int) 2D array sampled format:Unknown
              144:             TypePointer UniformConstant 143
-145(g_tTex2du4a):    144(ptr) Variable UniformConstant
-             146:             TypeImage 6(float) Cube array sampled format:Unknown
+145(g_tTex2di4a):    144(ptr) Variable UniformConstant
+             146:             TypeImage 15(int) 2D array sampled format:Unknown
              147:             TypePointer UniformConstant 146
-148(g_tTexcdf4a):    147(ptr) Variable UniformConstant
-             149:             TypeImage 11(int) Cube array sampled format:Unknown
+148(g_tTex2du4a):    147(ptr) Variable UniformConstant
+             149:             TypeImage 6(float) Cube array sampled format:Unknown
              150:             TypePointer UniformConstant 149
-151(g_tTexcdi4a):    150(ptr) Variable UniformConstant
-             152:             TypeImage 15(int) Cube array sampled format:Unknown
+151(g_tTexcdf4a):    150(ptr) Variable UniformConstant
+             152:             TypeImage 11(int) Cube array sampled format:Unknown
              153:             TypePointer UniformConstant 152
-154(g_tTexcdu4a):    153(ptr) Variable UniformConstant
-         155(c1):     17(ptr) Variable UniformConstant
-         156(o1):     17(ptr) Variable UniformConstant
-         157(o2):     13(ptr) Variable UniformConstant
-         158(o3):     50(ptr) Variable UniformConstant
-         159(o4):     80(ptr) Variable UniformConstant
+154(g_tTexcdi4a):    153(ptr) Variable UniformConstant
+             155:             TypeImage 15(int) Cube array sampled format:Unknown
+             156:             TypePointer UniformConstant 155
+157(g_tTexcdu4a):    156(ptr) Variable UniformConstant
+         158(c1):     17(ptr) Variable UniformConstant
+         159(o1):     17(ptr) Variable UniformConstant
+         160(o2):     13(ptr) Variable UniformConstant
+         161(o3):     50(ptr) Variable UniformConstant
+         162(o4):     80(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       108(vsout):    107(ptr) Variable Function
@@ -562,6 +580,8 @@
              105:   43(ivec4) ImageFetch 100 102 Lod 104
              113:    112(ptr) AccessChain 108(vsout) 109
                               Store 113 111
-             114:106(VS_OUTPUT) Load 108(vsout)
-                              ReturnValue 114
+             116:    112(ptr) AccessChain 108(vsout) 109
+             117:   23(fvec4) Load 116
+                              Store 115(Pos) 117
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.load.buffer.dx10.frag.out b/Test/baseResults/hlsl.load.buffer.dx10.frag.out
index 8c77675..012af86 100644
--- a/Test/baseResults/hlsl.load.buffer.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.buffer.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:39  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:28      Sequence
@@ -25,7 +25,7 @@
 0:30            'c1' (uniform int)
 0:34      move second child to first child (temp 4-component vector of float)
 0:34        Color: direct index for structure (temp 4-component vector of float)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            0 (const int)
 0:34        Constant:
@@ -34,14 +34,27 @@
 0:34          1.000000
 0:34          1.000000
 0:35      move second child to first child (temp float)
-0:35        Depth: direct index for structure (temp float FragDepth)
-0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:35        Depth: direct index for structure (temp float)
+0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:35          Constant:
 0:35            1 (const int)
 0:35        Constant:
 0:35          1.000000
-0:37      Branch: Return with expression
-0:37        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:37          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:37            Color: direct index for structure (temp 4-component vector of float)
+0:37              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:37              Constant:
+0:37                0 (const int)
+0:37          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:37            Depth: direct index for structure (temp float)
+0:37              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:37              Constant:
+0:37                1 (const int)
+0:37        Branch: Return
 0:?   Linker Objects
 0:?     'g_tTexbf4_test' (layout(binding=0 ) uniform samplerBuffer)
 0:?     'g_tTexbf4' (uniform samplerBuffer)
@@ -55,6 +68,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -63,7 +78,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:39  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:28      Sequence
@@ -86,7 +101,7 @@
 0:30            'c1' (uniform int)
 0:34      move second child to first child (temp 4-component vector of float)
 0:34        Color: direct index for structure (temp 4-component vector of float)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            0 (const int)
 0:34        Constant:
@@ -95,14 +110,27 @@
 0:34          1.000000
 0:34          1.000000
 0:35      move second child to first child (temp float)
-0:35        Depth: direct index for structure (temp float FragDepth)
-0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:35        Depth: direct index for structure (temp float)
+0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:35          Constant:
 0:35            1 (const int)
 0:35        Constant:
 0:35          1.000000
-0:37      Branch: Return with expression
-0:37        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:37          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:37            Color: direct index for structure (temp 4-component vector of float)
+0:37              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:37              Constant:
+0:37                0 (const int)
+0:37          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:37            Depth: direct index for structure (temp float)
+0:37              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:37              Constant:
+0:37                1 (const int)
+0:37        Branch: Return
 0:?   Linker Objects
 0:?     'g_tTexbf4_test' (layout(binding=0 ) uniform samplerBuffer)
 0:?     'g_tTexbf4' (uniform samplerBuffer)
@@ -116,18 +144,19 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 69
+// Id's are bound by 76
 
                               Capability Shader
                               Capability SampledBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 55 59
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "r00"
                               Name 13  "g_tTexbf4"
@@ -140,20 +169,23 @@
                               MemberName 44(PS_OUTPUT) 0  "Color"
                               MemberName 44(PS_OUTPUT) 1  "Depth"
                               Name 46  "psout"
-                              Name 56  "g_tTexbf4_test"
-                              Name 59  "c2"
-                              Name 62  "c3"
-                              Name 64  "c4"
-                              Name 65  "o1"
-                              Name 66  "o2"
-                              Name 67  "o3"
-                              Name 68  "o4"
+                              Name 55  "Color"
+                              Name 59  "Depth"
+                              Name 63  "g_tTexbf4_test"
+                              Name 66  "c2"
+                              Name 69  "c3"
+                              Name 71  "c4"
+                              Name 72  "o1"
+                              Name 73  "o2"
+                              Name 74  "o3"
+                              Name 75  "o4"
                               Decorate 13(g_tTexbf4) DescriptorSet 0
                               Decorate 27(g_tTexbi4) DescriptorSet 0
                               Decorate 39(g_tTexbu4) DescriptorSet 0
-                              MemberDecorate 44(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 56(g_tTexbf4_test) DescriptorSet 0
-                              Decorate 56(g_tTexbf4_test) Binding 0
+                              Decorate 55(Color) Location 0
+                              Decorate 59(Depth) BuiltIn FragDepth
+                              Decorate 63(g_tTexbf4_test) DescriptorSet 0
+                              Decorate 63(g_tTexbf4_test) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -186,19 +218,23 @@
               49:    7(fvec4) ConstantComposite 48 48 48 48
               51:     15(int) Constant 1
               52:             TypePointer Function 6(float)
-56(g_tTexbf4_test):     12(ptr) Variable UniformConstant
-              57:             TypeVector 15(int) 2
-              58:             TypePointer UniformConstant 57(ivec2)
-          59(c2):     58(ptr) Variable UniformConstant
-              60:             TypeVector 15(int) 3
-              61:             TypePointer UniformConstant 60(ivec3)
-          62(c3):     61(ptr) Variable UniformConstant
-              63:             TypePointer UniformConstant 21(ivec4)
-          64(c4):     63(ptr) Variable UniformConstant
-          65(o1):     16(ptr) Variable UniformConstant
-          66(o2):     58(ptr) Variable UniformConstant
-          67(o3):     61(ptr) Variable UniformConstant
-          68(o4):     63(ptr) Variable UniformConstant
+              54:             TypePointer Output 7(fvec4)
+       55(Color):     54(ptr) Variable Output
+              58:             TypePointer Output 6(float)
+       59(Depth):     58(ptr) Variable Output
+63(g_tTexbf4_test):     12(ptr) Variable UniformConstant
+              64:             TypeVector 15(int) 2
+              65:             TypePointer UniformConstant 64(ivec2)
+          66(c2):     65(ptr) Variable UniformConstant
+              67:             TypeVector 15(int) 3
+              68:             TypePointer UniformConstant 67(ivec3)
+          69(c3):     68(ptr) Variable UniformConstant
+              70:             TypePointer UniformConstant 21(ivec4)
+          71(c4):     70(ptr) Variable UniformConstant
+          72(o1):     16(ptr) Variable UniformConstant
+          73(o2):     65(ptr) Variable UniformConstant
+          74(o3):     68(ptr) Variable UniformConstant
+          75(o4):     70(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           9(r00):      8(ptr) Variable Function
@@ -224,6 +260,11 @@
                               Store 50 49
               53:     52(ptr) AccessChain 46(psout) 51
                               Store 53 48
-              54:44(PS_OUTPUT) Load 46(psout)
-                              ReturnValue 54
+              56:      8(ptr) AccessChain 46(psout) 47
+              57:    7(fvec4) Load 56
+                              Store 55(Color) 57
+              60:     52(ptr) AccessChain 46(psout) 51
+              61:    6(float) Load 60
+                              Store 59(Depth) 61
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.load.offset.dx10.frag.out b/Test/baseResults/hlsl.load.offset.dx10.frag.out
index da9f2e4..2110e6f 100644
--- a/Test/baseResults/hlsl.load.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:77  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetchOffset (global 4-component vector of float)
@@ -133,7 +133,7 @@
 0:64        'o3' (uniform 3-component vector of int)
 0:72      move second child to first child (temp 4-component vector of float)
 0:72        Color: direct index for structure (temp 4-component vector of float)
-0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:72          Constant:
 0:72            0 (const int)
 0:72        Constant:
@@ -142,14 +142,27 @@
 0:72          1.000000
 0:72          1.000000
 0:73      move second child to first child (temp float)
-0:73        Depth: direct index for structure (temp float FragDepth)
-0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:73        Depth: direct index for structure (temp float)
+0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:73          Constant:
 0:73            1 (const int)
 0:73        Constant:
 0:73          1.000000
-0:75      Branch: Return with expression
-0:75        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:75          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:75            Color: direct index for structure (temp 4-component vector of float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                0 (const int)
+0:75          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:75            Depth: direct index for structure (temp float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                1 (const int)
+0:75        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -181,6 +194,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -189,7 +204,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:77  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetchOffset (global 4-component vector of float)
@@ -320,7 +335,7 @@
 0:64        'o3' (uniform 3-component vector of int)
 0:72      move second child to first child (temp 4-component vector of float)
 0:72        Color: direct index for structure (temp 4-component vector of float)
-0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:72          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:72          Constant:
 0:72            0 (const int)
 0:72        Constant:
@@ -329,14 +344,27 @@
 0:72          1.000000
 0:72          1.000000
 0:73      move second child to first child (temp float)
-0:73        Depth: direct index for structure (temp float FragDepth)
-0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:73        Depth: direct index for structure (temp float)
+0:73          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:73          Constant:
 0:73            1 (const int)
 0:73        Constant:
 0:73          1.000000
-0:75      Branch: Return with expression
-0:75        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:75          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:75            Color: direct index for structure (temp 4-component vector of float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                0 (const int)
+0:75          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:75            Depth: direct index for structure (temp float)
+0:75              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:75              Constant:
+0:75                1 (const int)
+0:75        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -368,10 +396,12 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 172
+// Id's are bound by 179
 
                               Capability Shader
                               Capability ImageGatherExtended
@@ -379,9 +409,8 @@
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 130 134
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "g_tTex1df4"
                               Name 14  "c2"
@@ -402,21 +431,23 @@
                               MemberName 118(PS_OUTPUT) 0  "Color"
                               MemberName 118(PS_OUTPUT) 1  "Depth"
                               Name 120  "psout"
-                              Name 133  "g_sSamp"
-                              Name 136  "g_tTexcdf4"
-                              Name 139  "g_tTexcdi4"
-                              Name 142  "g_tTexcdu4"
-                              Name 145  "g_tTex1df4a"
-                              Name 148  "g_tTex1di4a"
-                              Name 151  "g_tTex1du4a"
-                              Name 154  "g_tTex2df4a"
-                              Name 157  "g_tTex2di4a"
-                              Name 160  "g_tTex2du4a"
-                              Name 163  "g_tTexcdf4a"
-                              Name 166  "g_tTexcdi4a"
-                              Name 169  "g_tTexcdu4a"
-                              Name 170  "c1"
-                              Name 171  "o4"
+                              Name 130  "Color"
+                              Name 134  "Depth"
+                              Name 140  "g_sSamp"
+                              Name 143  "g_tTexcdf4"
+                              Name 146  "g_tTexcdi4"
+                              Name 149  "g_tTexcdu4"
+                              Name 152  "g_tTex1df4a"
+                              Name 155  "g_tTex1di4a"
+                              Name 158  "g_tTex1du4a"
+                              Name 161  "g_tTex2df4a"
+                              Name 164  "g_tTex2di4a"
+                              Name 167  "g_tTex2du4a"
+                              Name 170  "g_tTexcdf4a"
+                              Name 173  "g_tTexcdi4a"
+                              Name 176  "g_tTexcdu4a"
+                              Name 177  "c1"
+                              Name 178  "o4"
                               Decorate 9(g_tTex1df4) DescriptorSet 0
                               Decorate 9(g_tTex1df4) Binding 0
                               Decorate 29(g_tTex1di4) DescriptorSet 0
@@ -427,21 +458,22 @@
                               Decorate 86(g_tTex3df4) DescriptorSet 0
                               Decorate 100(g_tTex3di4) DescriptorSet 0
                               Decorate 110(g_tTex3du4) DescriptorSet 0
-                              MemberDecorate 118(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 133(g_sSamp) DescriptorSet 0
-                              Decorate 133(g_sSamp) Binding 0
-                              Decorate 136(g_tTexcdf4) DescriptorSet 0
-                              Decorate 139(g_tTexcdi4) DescriptorSet 0
-                              Decorate 142(g_tTexcdu4) DescriptorSet 0
-                              Decorate 145(g_tTex1df4a) DescriptorSet 0
-                              Decorate 148(g_tTex1di4a) DescriptorSet 0
-                              Decorate 151(g_tTex1du4a) DescriptorSet 0
-                              Decorate 154(g_tTex2df4a) DescriptorSet 0
-                              Decorate 157(g_tTex2di4a) DescriptorSet 0
-                              Decorate 160(g_tTex2du4a) DescriptorSet 0
-                              Decorate 163(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 166(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 169(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 130(Color) Location 0
+                              Decorate 134(Depth) BuiltIn FragDepth
+                              Decorate 140(g_sSamp) DescriptorSet 0
+                              Decorate 140(g_sSamp) Binding 0
+                              Decorate 143(g_tTexcdf4) DescriptorSet 0
+                              Decorate 146(g_tTexcdi4) DescriptorSet 0
+                              Decorate 149(g_tTexcdu4) DescriptorSet 0
+                              Decorate 152(g_tTex1df4a) DescriptorSet 0
+                              Decorate 155(g_tTex1di4a) DescriptorSet 0
+                              Decorate 158(g_tTex1du4a) DescriptorSet 0
+                              Decorate 161(g_tTex2df4a) DescriptorSet 0
+                              Decorate 164(g_tTex2di4a) DescriptorSet 0
+                              Decorate 167(g_tTex2du4a) DescriptorSet 0
+                              Decorate 170(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 173(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 176(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -501,47 +533,51 @@
              124:             TypePointer Function 25(fvec4)
              126:     11(int) Constant 1
              127:             TypePointer Function 6(float)
-             131:             TypeSampler
-             132:             TypePointer UniformConstant 131
-    133(g_sSamp):    132(ptr) Variable UniformConstant
-             134:             TypeImage 6(float) Cube sampled format:Unknown
-             135:             TypePointer UniformConstant 134
- 136(g_tTexcdf4):    135(ptr) Variable UniformConstant
-             137:             TypeImage 11(int) Cube sampled format:Unknown
-             138:             TypePointer UniformConstant 137
- 139(g_tTexcdi4):    138(ptr) Variable UniformConstant
-             140:             TypeImage 15(int) Cube sampled format:Unknown
-             141:             TypePointer UniformConstant 140
- 142(g_tTexcdu4):    141(ptr) Variable UniformConstant
-             143:             TypeImage 6(float) 1D array sampled format:Unknown
-             144:             TypePointer UniformConstant 143
-145(g_tTex1df4a):    144(ptr) Variable UniformConstant
-             146:             TypeImage 11(int) 1D array sampled format:Unknown
-             147:             TypePointer UniformConstant 146
-148(g_tTex1di4a):    147(ptr) Variable UniformConstant
-             149:             TypeImage 15(int) 1D array sampled format:Unknown
-             150:             TypePointer UniformConstant 149
-151(g_tTex1du4a):    150(ptr) Variable UniformConstant
-             152:             TypeImage 6(float) 2D array sampled format:Unknown
-             153:             TypePointer UniformConstant 152
-154(g_tTex2df4a):    153(ptr) Variable UniformConstant
-             155:             TypeImage 11(int) 2D array sampled format:Unknown
-             156:             TypePointer UniformConstant 155
-157(g_tTex2di4a):    156(ptr) Variable UniformConstant
-             158:             TypeImage 15(int) 2D array sampled format:Unknown
-             159:             TypePointer UniformConstant 158
-160(g_tTex2du4a):    159(ptr) Variable UniformConstant
-             161:             TypeImage 6(float) Cube array sampled format:Unknown
-             162:             TypePointer UniformConstant 161
-163(g_tTexcdf4a):    162(ptr) Variable UniformConstant
-             164:             TypeImage 11(int) Cube array sampled format:Unknown
-             165:             TypePointer UniformConstant 164
-166(g_tTexcdi4a):    165(ptr) Variable UniformConstant
-             167:             TypeImage 15(int) Cube array sampled format:Unknown
-             168:             TypePointer UniformConstant 167
-169(g_tTexcdu4a):    168(ptr) Variable UniformConstant
-         170(c1):     17(ptr) Variable UniformConstant
-         171(o4):     88(ptr) Variable UniformConstant
+             129:             TypePointer Output 25(fvec4)
+      130(Color):    129(ptr) Variable Output
+             133:             TypePointer Output 6(float)
+      134(Depth):    133(ptr) Variable Output
+             138:             TypeSampler
+             139:             TypePointer UniformConstant 138
+    140(g_sSamp):    139(ptr) Variable UniformConstant
+             141:             TypeImage 6(float) Cube sampled format:Unknown
+             142:             TypePointer UniformConstant 141
+ 143(g_tTexcdf4):    142(ptr) Variable UniformConstant
+             144:             TypeImage 11(int) Cube sampled format:Unknown
+             145:             TypePointer UniformConstant 144
+ 146(g_tTexcdi4):    145(ptr) Variable UniformConstant
+             147:             TypeImage 15(int) Cube sampled format:Unknown
+             148:             TypePointer UniformConstant 147
+ 149(g_tTexcdu4):    148(ptr) Variable UniformConstant
+             150:             TypeImage 6(float) 1D array sampled format:Unknown
+             151:             TypePointer UniformConstant 150
+152(g_tTex1df4a):    151(ptr) Variable UniformConstant
+             153:             TypeImage 11(int) 1D array sampled format:Unknown
+             154:             TypePointer UniformConstant 153
+155(g_tTex1di4a):    154(ptr) Variable UniformConstant
+             156:             TypeImage 15(int) 1D array sampled format:Unknown
+             157:             TypePointer UniformConstant 156
+158(g_tTex1du4a):    157(ptr) Variable UniformConstant
+             159:             TypeImage 6(float) 2D array sampled format:Unknown
+             160:             TypePointer UniformConstant 159
+161(g_tTex2df4a):    160(ptr) Variable UniformConstant
+             162:             TypeImage 11(int) 2D array sampled format:Unknown
+             163:             TypePointer UniformConstant 162
+164(g_tTex2di4a):    163(ptr) Variable UniformConstant
+             165:             TypeImage 15(int) 2D array sampled format:Unknown
+             166:             TypePointer UniformConstant 165
+167(g_tTex2du4a):    166(ptr) Variable UniformConstant
+             168:             TypeImage 6(float) Cube array sampled format:Unknown
+             169:             TypePointer UniformConstant 168
+170(g_tTexcdf4a):    169(ptr) Variable UniformConstant
+             171:             TypeImage 11(int) Cube array sampled format:Unknown
+             172:             TypePointer UniformConstant 171
+173(g_tTexcdi4a):    172(ptr) Variable UniformConstant
+             174:             TypeImage 15(int) Cube array sampled format:Unknown
+             175:             TypePointer UniformConstant 174
+176(g_tTexcdu4a):    175(ptr) Variable UniformConstant
+         177(c1):     17(ptr) Variable UniformConstant
+         178(o4):     88(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       120(psout):    119(ptr) Variable Function
@@ -612,6 +648,11 @@
                               Store 125 123
              128:    127(ptr) AccessChain 120(psout) 126
                               Store 128 122
-             129:118(PS_OUTPUT) Load 120(psout)
-                              ReturnValue 129
+             131:    124(ptr) AccessChain 120(psout) 121
+             132:   25(fvec4) Load 131
+                              Store 130(Color) 132
+             135:    127(ptr) AccessChain 120(psout) 126
+             136:    6(float) Load 135
+                              Store 134(Depth) 136
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
index 97c164c..d5f6671 100644
--- a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:70  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetchOffset (global 4-component vector of float)
@@ -97,7 +97,7 @@
 0:59        'o2' (uniform 2-component vector of int)
 0:65      move second child to first child (temp 4-component vector of float)
 0:65        Color: direct index for structure (temp 4-component vector of float)
-0:65          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:65          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:65          Constant:
 0:65            0 (const int)
 0:65        Constant:
@@ -106,14 +106,27 @@
 0:65          1.000000
 0:65          1.000000
 0:66      move second child to first child (temp float)
-0:66        Depth: direct index for structure (temp float FragDepth)
-0:66          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:66        Depth: direct index for structure (temp float)
+0:66          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:66          Constant:
 0:66            1 (const int)
 0:66        Constant:
 0:66          1.000000
-0:68      Branch: Return with expression
-0:68        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:68          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:68            Color: direct index for structure (temp 4-component vector of float)
+0:68              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:68              Constant:
+0:68                0 (const int)
+0:68          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:68            Depth: direct index for structure (temp float)
+0:68              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:68              Constant:
+0:68                1 (const int)
+0:68        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -145,6 +158,8 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -153,7 +168,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:70  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:48    Function Parameters: 
 0:?     Sequence
 0:52      textureFetchOffset (global 4-component vector of float)
@@ -248,7 +263,7 @@
 0:59        'o2' (uniform 2-component vector of int)
 0:65      move second child to first child (temp 4-component vector of float)
 0:65        Color: direct index for structure (temp 4-component vector of float)
-0:65          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:65          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:65          Constant:
 0:65            0 (const int)
 0:65        Constant:
@@ -257,14 +272,27 @@
 0:65          1.000000
 0:65          1.000000
 0:66      move second child to first child (temp float)
-0:66        Depth: direct index for structure (temp float FragDepth)
-0:66          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:66        Depth: direct index for structure (temp float)
+0:66          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:66          Constant:
 0:66            1 (const int)
 0:66        Constant:
 0:66          1.000000
-0:68      Branch: Return with expression
-0:68        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:68          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:68            Color: direct index for structure (temp 4-component vector of float)
+0:68              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:68              Constant:
+0:68                0 (const int)
+0:68          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:68            Depth: direct index for structure (temp float)
+0:68              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:68              Constant:
+0:68                1 (const int)
+0:68        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -296,10 +324,12 @@
 0:?     'o2' (uniform 2-component vector of int)
 0:?     'o3' (uniform 3-component vector of int)
 0:?     'o4' (uniform 4-component vector of int)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 149
+// Id's are bound by 156
 
                               Capability Shader
                               Capability ImageGatherExtended
@@ -307,9 +337,8 @@
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 96 100
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "g_tTex1df4a"
                               Name 14  "c3"
@@ -325,51 +354,54 @@
                               MemberName 84(PS_OUTPUT) 0  "Color"
                               MemberName 84(PS_OUTPUT) 1  "Depth"
                               Name 86  "psout"
-                              Name 99  "g_sSamp"
-                              Name 102  "g_tTex1df4"
-                              Name 105  "g_tTex1di4"
-                              Name 108  "g_tTex1du4"
-                              Name 111  "g_tTex2df4"
-                              Name 114  "g_tTex2di4"
-                              Name 117  "g_tTex2du4"
-                              Name 120  "g_tTex3df4"
-                              Name 123  "g_tTex3di4"
-                              Name 126  "g_tTex3du4"
-                              Name 129  "g_tTexcdf4"
-                              Name 132  "g_tTexcdi4"
-                              Name 135  "g_tTexcdu4"
-                              Name 138  "g_tTexcdf4a"
-                              Name 141  "g_tTexcdi4a"
-                              Name 144  "g_tTexcdu4a"
-                              Name 145  "c1"
-                              Name 146  "c2"
-                              Name 147  "o3"
-                              Name 148  "o4"
+                              Name 96  "Color"
+                              Name 100  "Depth"
+                              Name 106  "g_sSamp"
+                              Name 109  "g_tTex1df4"
+                              Name 112  "g_tTex1di4"
+                              Name 115  "g_tTex1du4"
+                              Name 118  "g_tTex2df4"
+                              Name 121  "g_tTex2di4"
+                              Name 124  "g_tTex2du4"
+                              Name 127  "g_tTex3df4"
+                              Name 130  "g_tTex3di4"
+                              Name 133  "g_tTex3du4"
+                              Name 136  "g_tTexcdf4"
+                              Name 139  "g_tTexcdi4"
+                              Name 142  "g_tTexcdu4"
+                              Name 145  "g_tTexcdf4a"
+                              Name 148  "g_tTexcdi4a"
+                              Name 151  "g_tTexcdu4a"
+                              Name 152  "c1"
+                              Name 153  "c2"
+                              Name 154  "o3"
+                              Name 155  "o4"
                               Decorate 9(g_tTex1df4a) DescriptorSet 0
                               Decorate 29(g_tTex1di4a) DescriptorSet 0
                               Decorate 40(g_tTex1du4a) DescriptorSet 0
                               Decorate 51(g_tTex2df4a) DescriptorSet 0
                               Decorate 66(g_tTex2di4a) DescriptorSet 0
                               Decorate 76(g_tTex2du4a) DescriptorSet 0
-                              MemberDecorate 84(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 99(g_sSamp) DescriptorSet 0
-                              Decorate 99(g_sSamp) Binding 0
-                              Decorate 102(g_tTex1df4) DescriptorSet 0
-                              Decorate 102(g_tTex1df4) Binding 0
-                              Decorate 105(g_tTex1di4) DescriptorSet 0
-                              Decorate 108(g_tTex1du4) DescriptorSet 0
-                              Decorate 111(g_tTex2df4) DescriptorSet 0
-                              Decorate 114(g_tTex2di4) DescriptorSet 0
-                              Decorate 117(g_tTex2du4) DescriptorSet 0
-                              Decorate 120(g_tTex3df4) DescriptorSet 0
-                              Decorate 123(g_tTex3di4) DescriptorSet 0
-                              Decorate 126(g_tTex3du4) DescriptorSet 0
-                              Decorate 129(g_tTexcdf4) DescriptorSet 0
-                              Decorate 132(g_tTexcdi4) DescriptorSet 0
-                              Decorate 135(g_tTexcdu4) DescriptorSet 0
-                              Decorate 138(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 141(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 144(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 96(Color) Location 0
+                              Decorate 100(Depth) BuiltIn FragDepth
+                              Decorate 106(g_sSamp) DescriptorSet 0
+                              Decorate 106(g_sSamp) Binding 0
+                              Decorate 109(g_tTex1df4) DescriptorSet 0
+                              Decorate 109(g_tTex1df4) Binding 0
+                              Decorate 112(g_tTex1di4) DescriptorSet 0
+                              Decorate 115(g_tTex1du4) DescriptorSet 0
+                              Decorate 118(g_tTex2df4) DescriptorSet 0
+                              Decorate 121(g_tTex2di4) DescriptorSet 0
+                              Decorate 124(g_tTex2du4) DescriptorSet 0
+                              Decorate 127(g_tTex3df4) DescriptorSet 0
+                              Decorate 130(g_tTex3di4) DescriptorSet 0
+                              Decorate 133(g_tTex3du4) DescriptorSet 0
+                              Decorate 136(g_tTexcdf4) DescriptorSet 0
+                              Decorate 139(g_tTexcdi4) DescriptorSet 0
+                              Decorate 142(g_tTexcdu4) DescriptorSet 0
+                              Decorate 145(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 148(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 151(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -416,58 +448,62 @@
               90:             TypePointer Function 25(fvec4)
               92:     11(int) Constant 1
               93:             TypePointer Function 6(float)
-              97:             TypeSampler
-              98:             TypePointer UniformConstant 97
-     99(g_sSamp):     98(ptr) Variable UniformConstant
-             100:             TypeImage 6(float) 1D sampled format:Unknown
-             101:             TypePointer UniformConstant 100
- 102(g_tTex1df4):    101(ptr) Variable UniformConstant
-             103:             TypeImage 11(int) 1D sampled format:Unknown
-             104:             TypePointer UniformConstant 103
- 105(g_tTex1di4):    104(ptr) Variable UniformConstant
-             106:             TypeImage 18(int) 1D sampled format:Unknown
-             107:             TypePointer UniformConstant 106
- 108(g_tTex1du4):    107(ptr) Variable UniformConstant
-             109:             TypeImage 6(float) 2D sampled format:Unknown
-             110:             TypePointer UniformConstant 109
- 111(g_tTex2df4):    110(ptr) Variable UniformConstant
-             112:             TypeImage 11(int) 2D sampled format:Unknown
-             113:             TypePointer UniformConstant 112
- 114(g_tTex2di4):    113(ptr) Variable UniformConstant
-             115:             TypeImage 18(int) 2D sampled format:Unknown
-             116:             TypePointer UniformConstant 115
- 117(g_tTex2du4):    116(ptr) Variable UniformConstant
-             118:             TypeImage 6(float) 3D sampled format:Unknown
-             119:             TypePointer UniformConstant 118
- 120(g_tTex3df4):    119(ptr) Variable UniformConstant
-             121:             TypeImage 11(int) 3D sampled format:Unknown
-             122:             TypePointer UniformConstant 121
- 123(g_tTex3di4):    122(ptr) Variable UniformConstant
-             124:             TypeImage 18(int) 3D sampled format:Unknown
-             125:             TypePointer UniformConstant 124
- 126(g_tTex3du4):    125(ptr) Variable UniformConstant
-             127:             TypeImage 6(float) Cube sampled format:Unknown
-             128:             TypePointer UniformConstant 127
- 129(g_tTexcdf4):    128(ptr) Variable UniformConstant
-             130:             TypeImage 11(int) Cube sampled format:Unknown
-             131:             TypePointer UniformConstant 130
- 132(g_tTexcdi4):    131(ptr) Variable UniformConstant
-             133:             TypeImage 18(int) Cube sampled format:Unknown
-             134:             TypePointer UniformConstant 133
- 135(g_tTexcdu4):    134(ptr) Variable UniformConstant
-             136:             TypeImage 6(float) Cube array sampled format:Unknown
-             137:             TypePointer UniformConstant 136
-138(g_tTexcdf4a):    137(ptr) Variable UniformConstant
-             139:             TypeImage 11(int) Cube array sampled format:Unknown
-             140:             TypePointer UniformConstant 139
-141(g_tTexcdi4a):    140(ptr) Variable UniformConstant
-             142:             TypeImage 18(int) Cube array sampled format:Unknown
-             143:             TypePointer UniformConstant 142
-144(g_tTexcdu4a):    143(ptr) Variable UniformConstant
-         145(c1):     20(ptr) Variable UniformConstant
-         146(c2):     60(ptr) Variable UniformConstant
-         147(o3):     13(ptr) Variable UniformConstant
-         148(o4):     53(ptr) Variable UniformConstant
+              95:             TypePointer Output 25(fvec4)
+       96(Color):     95(ptr) Variable Output
+              99:             TypePointer Output 6(float)
+      100(Depth):     99(ptr) Variable Output
+             104:             TypeSampler
+             105:             TypePointer UniformConstant 104
+    106(g_sSamp):    105(ptr) Variable UniformConstant
+             107:             TypeImage 6(float) 1D sampled format:Unknown
+             108:             TypePointer UniformConstant 107
+ 109(g_tTex1df4):    108(ptr) Variable UniformConstant
+             110:             TypeImage 11(int) 1D sampled format:Unknown
+             111:             TypePointer UniformConstant 110
+ 112(g_tTex1di4):    111(ptr) Variable UniformConstant
+             113:             TypeImage 18(int) 1D sampled format:Unknown
+             114:             TypePointer UniformConstant 113
+ 115(g_tTex1du4):    114(ptr) Variable UniformConstant
+             116:             TypeImage 6(float) 2D sampled format:Unknown
+             117:             TypePointer UniformConstant 116
+ 118(g_tTex2df4):    117(ptr) Variable UniformConstant
+             119:             TypeImage 11(int) 2D sampled format:Unknown
+             120:             TypePointer UniformConstant 119
+ 121(g_tTex2di4):    120(ptr) Variable UniformConstant
+             122:             TypeImage 18(int) 2D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex2du4):    123(ptr) Variable UniformConstant
+             125:             TypeImage 6(float) 3D sampled format:Unknown
+             126:             TypePointer UniformConstant 125
+ 127(g_tTex3df4):    126(ptr) Variable UniformConstant
+             128:             TypeImage 11(int) 3D sampled format:Unknown
+             129:             TypePointer UniformConstant 128
+ 130(g_tTex3di4):    129(ptr) Variable UniformConstant
+             131:             TypeImage 18(int) 3D sampled format:Unknown
+             132:             TypePointer UniformConstant 131
+ 133(g_tTex3du4):    132(ptr) Variable UniformConstant
+             134:             TypeImage 6(float) Cube sampled format:Unknown
+             135:             TypePointer UniformConstant 134
+ 136(g_tTexcdf4):    135(ptr) Variable UniformConstant
+             137:             TypeImage 11(int) Cube sampled format:Unknown
+             138:             TypePointer UniformConstant 137
+ 139(g_tTexcdi4):    138(ptr) Variable UniformConstant
+             140:             TypeImage 18(int) Cube sampled format:Unknown
+             141:             TypePointer UniformConstant 140
+ 142(g_tTexcdu4):    141(ptr) Variable UniformConstant
+             143:             TypeImage 6(float) Cube array sampled format:Unknown
+             144:             TypePointer UniformConstant 143
+145(g_tTexcdf4a):    144(ptr) Variable UniformConstant
+             146:             TypeImage 11(int) Cube array sampled format:Unknown
+             147:             TypePointer UniformConstant 146
+148(g_tTexcdi4a):    147(ptr) Variable UniformConstant
+             149:             TypeImage 18(int) Cube array sampled format:Unknown
+             150:             TypePointer UniformConstant 149
+151(g_tTexcdu4a):    150(ptr) Variable UniformConstant
+         152(c1):     20(ptr) Variable UniformConstant
+         153(c2):     60(ptr) Variable UniformConstant
+         154(o3):     13(ptr) Variable UniformConstant
+         155(o4):     53(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
        86(psout):     85(ptr) Variable Function
@@ -517,6 +553,11 @@
                               Store 91 89
               94:     93(ptr) AccessChain 86(psout) 92
                               Store 94 88
-              95:84(PS_OUTPUT) Load 86(psout)
-                              ReturnValue 95
+              97:     90(ptr) AccessChain 86(psout) 87
+              98:   25(fvec4) Load 97
+                              Store 96(Color) 98
+             101:     93(ptr) AccessChain 86(psout) 92
+             102:    6(float) Load 101
+                              Store 100(Depth) 102
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.matType.frag.out b/Test/baseResults/hlsl.matType.frag.out
index b081a4a..2d63460 100755
--- a/Test/baseResults/hlsl.matType.frag.out
+++ b/Test/baseResults/hlsl.matType.frag.out
@@ -7,16 +7,19 @@
 0:1      'f1' (global 1-component vector of float)
 0:1      Constant:
 0:1        1.000000
-0:11  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
+0:9  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
 0:9    Function Parameters: 
 0:9      'inFloat1' (in 1-component vector of float)
 0:9      'inScalar' (in float)
+0:?     Sequence
+0:10      Branch: Return with expression
+0:10        'inFloat1' (in 1-component vector of float)
 0:?   Linker Objects
 0:?     'f1' (global 1-component vector of float)
 0:?     'fmat11' (global 1X1 matrix of float)
-0:?     'fmat41' (global 1X4 matrix of float)
-0:?     'fmat12' (global 2X1 matrix of float)
-0:?     'dmat23' (global 3X2 matrix of double)
+0:?     'fmat41' (global 4X1 matrix of float)
+0:?     'fmat12' (global 1X2 matrix of float)
+0:?     'dmat23' (global 2X3 matrix of double)
 0:?     'int44' (global 4X4 matrix of int)
 
 
@@ -31,21 +34,24 @@
 0:1      'f1' (global 1-component vector of float)
 0:1      Constant:
 0:1        1.000000
-0:11  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
+0:9  Function Definition: ShaderFunction(vf1;f1; (global 1-component vector of float)
 0:9    Function Parameters: 
 0:9      'inFloat1' (in 1-component vector of float)
 0:9      'inScalar' (in float)
+0:?     Sequence
+0:10      Branch: Return with expression
+0:10        'inFloat1' (in 1-component vector of float)
 0:?   Linker Objects
 0:?     'f1' (global 1-component vector of float)
 0:?     'fmat11' (global 1X1 matrix of float)
-0:?     'fmat41' (global 1X4 matrix of float)
-0:?     'fmat12' (global 2X1 matrix of float)
-0:?     'dmat23' (global 3X2 matrix of double)
+0:?     'fmat41' (global 4X1 matrix of float)
+0:?     'fmat12' (global 1X2 matrix of float)
+0:?     'dmat23' (global 2X3 matrix of double)
 0:?     'int44' (global 4X4 matrix of int)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 38
+// Id's are bound by 40
 
                               Capability Shader
                               Capability Float64
@@ -53,17 +59,16 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "PixelShaderFunction"
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 11  "ShaderFunction(vf1;f1;"
                               Name 9  "inFloat1"
                               Name 10  "inScalar"
                               Name 14  "f1"
-                              Name 20  "fmat11"
-                              Name 24  "fmat41"
-                              Name 27  "fmat12"
-                              Name 32  "dmat23"
-                              Name 37  "int44"
+                              Name 22  "fmat11"
+                              Name 25  "fmat41"
+                              Name 29  "fmat12"
+                              Name 34  "dmat23"
+                              Name 39  "int44"
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -72,27 +77,27 @@
               13:             TypePointer Private 6(float)
           14(f1):     13(ptr) Variable Private
               15:    6(float) Constant 1065353216
-              17:             TypeVector 6(float) 1
-              18:             TypeMatrix 17(fvec) 1
-              19:             TypePointer Private 18
-      20(fmat11):     19(ptr) Variable Private
-              21:             TypeVector 6(float) 4
-              22:             TypeMatrix 21(fvec4) 1
-              23:             TypePointer Private 22
-      24(fmat41):     23(ptr) Variable Private
-              25:             TypeMatrix 17(fvec) 2
-              26:             TypePointer Private 25
-      27(fmat12):     26(ptr) Variable Private
-              28:             TypeFloat 64
-              29:             TypeVector 28(float) 2
-              30:             TypeMatrix 29(fvec2) 3
-              31:             TypePointer Private 30
-      32(dmat23):     31(ptr) Variable Private
-              33:             TypeInt 32 1
-              34:             TypeVector 33(int) 4
-              35:             TypeMatrix 34(ivec4) 4
-              36:             TypePointer Private 35
-       37(int44):     36(ptr) Variable Private
+              19:             TypeVector 6(float) 1
+              20:             TypeMatrix 19(fvec) 1
+              21:             TypePointer Private 20
+      22(fmat11):     21(ptr) Variable Private
+              23:             TypeMatrix 19(fvec) 4
+              24:             TypePointer Private 23
+      25(fmat41):     24(ptr) Variable Private
+              26:             TypeVector 6(float) 2
+              27:             TypeMatrix 26(fvec2) 1
+              28:             TypePointer Private 27
+      29(fmat12):     28(ptr) Variable Private
+              30:             TypeFloat 64
+              31:             TypeVector 30(float) 3
+              32:             TypeMatrix 31(fvec3) 2
+              33:             TypePointer Private 32
+      34(dmat23):     33(ptr) Variable Private
+              35:             TypeInt 32 1
+              36:             TypeVector 35(int) 4
+              37:             TypeMatrix 36(ivec4) 4
+              38:             TypePointer Private 37
+       39(int44):     38(ptr) Variable Private
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
                               Store 14(f1) 15
@@ -101,6 +106,6 @@
      9(inFloat1):      7(ptr) FunctionParameter
     10(inScalar):      7(ptr) FunctionParameter
               12:             Label
-              16:    6(float) Undef
+              16:    6(float) Load 9(inFloat1)
                               ReturnValue 16
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.matrixindex.frag.out b/Test/baseResults/hlsl.matrixindex.frag.out
new file mode 100644
index 0000000..7acaa71
--- /dev/null
+++ b/Test/baseResults/hlsl.matrixindex.frag.out
@@ -0,0 +1,380 @@
+hlsl.matrixindex.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main( (global structure{temp 4-component vector of float Color})
+0:10    Function Parameters: 
+0:?     Sequence
+0:22      Sequence
+0:22        move second child to first child (temp float)
+0:22          'e1_00' (temp float)
+0:22          Constant:
+0:22            10.000000
+0:23      Sequence
+0:23        move second child to first child (temp float)
+0:23          'e1_01' (temp float)
+0:23          Constant:
+0:23            11.000000
+0:24      Sequence
+0:24        move second child to first child (temp float)
+0:24          'e1_10' (temp float)
+0:24          Constant:
+0:24            12.000000
+0:25      Sequence
+0:25        move second child to first child (temp float)
+0:25          'e1_11' (temp float)
+0:25          Constant:
+0:25            13.000000
+0:26      Sequence
+0:26        move second child to first child (temp float)
+0:26          'e1_20' (temp float)
+0:26          Constant:
+0:26            14.000000
+0:27      Sequence
+0:27        move second child to first child (temp float)
+0:27          'e1_21' (temp float)
+0:27          Constant:
+0:27            15.000000
+0:29      Sequence
+0:29        move second child to first child (temp float)
+0:29          'e2_00' (temp float)
+0:29          Constant:
+0:29            20.000000
+0:30      Sequence
+0:30        move second child to first child (temp float)
+0:30          'e2_01' (temp float)
+0:30          Constant:
+0:30            21.000000
+0:31      Sequence
+0:31        move second child to first child (temp float)
+0:31          'e2_10' (temp float)
+0:31          Constant:
+0:31            22.000000
+0:32      Sequence
+0:32        move second child to first child (temp float)
+0:32          'e2_11' (temp float)
+0:32          Constant:
+0:32            23.000000
+0:33      Sequence
+0:33        move second child to first child (temp float)
+0:33          'e2_20' (temp float)
+0:33          Constant:
+0:33            24.000000
+0:34      Sequence
+0:34        move second child to first child (temp float)
+0:34          'e2_21' (temp float)
+0:34          Constant:
+0:34            25.000000
+0:39      Sequence
+0:39        move second child to first child (temp 2-component vector of float)
+0:39          'r0a' (temp 2-component vector of float)
+0:39          Constant:
+0:39            10.000000
+0:39            11.000000
+0:40      Sequence
+0:40        move second child to first child (temp 2-component vector of float)
+0:40          'r1a' (temp 2-component vector of float)
+0:40          Constant:
+0:40            12.000000
+0:40            13.000000
+0:41      Sequence
+0:41        move second child to first child (temp 2-component vector of float)
+0:41          'r2a' (temp 2-component vector of float)
+0:41          Constant:
+0:41            14.000000
+0:41            15.000000
+0:43      Sequence
+0:43        move second child to first child (temp 2-component vector of float)
+0:43          'r0b' (temp 2-component vector of float)
+0:43          indirect index (temp 2-component vector of float)
+0:43            Constant:
+0:43              20.000000
+0:43              21.000000
+0:43              22.000000
+0:43              23.000000
+0:43              24.000000
+0:43              25.000000
+0:43            'idx' (uniform int)
+0:44      Sequence
+0:44        move second child to first child (temp 2-component vector of float)
+0:44          'r0c' (temp 2-component vector of float)
+0:44          indirect index (temp 2-component vector of float)
+0:44            'um' (uniform 3X2 matrix of float)
+0:44            'idx' (uniform int)
+0:47      move second child to first child (temp 4-component vector of float)
+0:47        Color: direct index for structure (temp 4-component vector of float)
+0:47          'psout' (temp structure{temp 4-component vector of float Color})
+0:47          Constant:
+0:47            0 (const int)
+0:47        Construct vec4 (temp 4-component vector of float)
+0:47          'e2_11' (temp float)
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color})
+0:48              Constant:
+0:48                0 (const int)
+0:48        Branch: Return
+0:?   Linker Objects
+0:?     'idx' (uniform int)
+0:?     'um' (uniform 3X2 matrix of float)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main( (global structure{temp 4-component vector of float Color})
+0:10    Function Parameters: 
+0:?     Sequence
+0:22      Sequence
+0:22        move second child to first child (temp float)
+0:22          'e1_00' (temp float)
+0:22          Constant:
+0:22            10.000000
+0:23      Sequence
+0:23        move second child to first child (temp float)
+0:23          'e1_01' (temp float)
+0:23          Constant:
+0:23            11.000000
+0:24      Sequence
+0:24        move second child to first child (temp float)
+0:24          'e1_10' (temp float)
+0:24          Constant:
+0:24            12.000000
+0:25      Sequence
+0:25        move second child to first child (temp float)
+0:25          'e1_11' (temp float)
+0:25          Constant:
+0:25            13.000000
+0:26      Sequence
+0:26        move second child to first child (temp float)
+0:26          'e1_20' (temp float)
+0:26          Constant:
+0:26            14.000000
+0:27      Sequence
+0:27        move second child to first child (temp float)
+0:27          'e1_21' (temp float)
+0:27          Constant:
+0:27            15.000000
+0:29      Sequence
+0:29        move second child to first child (temp float)
+0:29          'e2_00' (temp float)
+0:29          Constant:
+0:29            20.000000
+0:30      Sequence
+0:30        move second child to first child (temp float)
+0:30          'e2_01' (temp float)
+0:30          Constant:
+0:30            21.000000
+0:31      Sequence
+0:31        move second child to first child (temp float)
+0:31          'e2_10' (temp float)
+0:31          Constant:
+0:31            22.000000
+0:32      Sequence
+0:32        move second child to first child (temp float)
+0:32          'e2_11' (temp float)
+0:32          Constant:
+0:32            23.000000
+0:33      Sequence
+0:33        move second child to first child (temp float)
+0:33          'e2_20' (temp float)
+0:33          Constant:
+0:33            24.000000
+0:34      Sequence
+0:34        move second child to first child (temp float)
+0:34          'e2_21' (temp float)
+0:34          Constant:
+0:34            25.000000
+0:39      Sequence
+0:39        move second child to first child (temp 2-component vector of float)
+0:39          'r0a' (temp 2-component vector of float)
+0:39          Constant:
+0:39            10.000000
+0:39            11.000000
+0:40      Sequence
+0:40        move second child to first child (temp 2-component vector of float)
+0:40          'r1a' (temp 2-component vector of float)
+0:40          Constant:
+0:40            12.000000
+0:40            13.000000
+0:41      Sequence
+0:41        move second child to first child (temp 2-component vector of float)
+0:41          'r2a' (temp 2-component vector of float)
+0:41          Constant:
+0:41            14.000000
+0:41            15.000000
+0:43      Sequence
+0:43        move second child to first child (temp 2-component vector of float)
+0:43          'r0b' (temp 2-component vector of float)
+0:43          indirect index (temp 2-component vector of float)
+0:43            Constant:
+0:43              20.000000
+0:43              21.000000
+0:43              22.000000
+0:43              23.000000
+0:43              24.000000
+0:43              25.000000
+0:43            'idx' (uniform int)
+0:44      Sequence
+0:44        move second child to first child (temp 2-component vector of float)
+0:44          'r0c' (temp 2-component vector of float)
+0:44          indirect index (temp 2-component vector of float)
+0:44            'um' (uniform 3X2 matrix of float)
+0:44            'idx' (uniform int)
+0:47      move second child to first child (temp 4-component vector of float)
+0:47        Color: direct index for structure (temp 4-component vector of float)
+0:47          'psout' (temp structure{temp 4-component vector of float Color})
+0:47          Constant:
+0:47            0 (const int)
+0:47        Construct vec4 (temp 4-component vector of float)
+0:47          'e2_11' (temp float)
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color})
+0:48              Constant:
+0:48                0 (const int)
+0:48        Branch: Return
+0:?   Linker Objects
+0:?     'idx' (uniform int)
+0:?     'um' (uniform 3X2 matrix of float)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 75
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 71
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 8  "e1_00"
+                              Name 10  "e1_01"
+                              Name 12  "e1_10"
+                              Name 14  "e1_11"
+                              Name 16  "e1_20"
+                              Name 18  "e1_21"
+                              Name 20  "e2_00"
+                              Name 22  "e2_01"
+                              Name 24  "e2_10"
+                              Name 26  "e2_11"
+                              Name 28  "e2_20"
+                              Name 30  "e2_21"
+                              Name 34  "r0a"
+                              Name 36  "r1a"
+                              Name 38  "r2a"
+                              Name 40  "r0b"
+                              Name 48  "idx"
+                              Name 51  "indexable"
+                              Name 54  "r0c"
+                              Name 56  "um"
+                              Name 62  "PS_OUTPUT"
+                              MemberName 62(PS_OUTPUT) 0  "Color"
+                              Name 64  "psout"
+                              Name 71  "Color"
+                              Decorate 71(Color) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:    6(float) Constant 1092616192
+              11:    6(float) Constant 1093664768
+              13:    6(float) Constant 1094713344
+              15:    6(float) Constant 1095761920
+              17:    6(float) Constant 1096810496
+              19:    6(float) Constant 1097859072
+              21:    6(float) Constant 1101004800
+              23:    6(float) Constant 1101529088
+              25:    6(float) Constant 1102053376
+              27:    6(float) Constant 1102577664
+              29:    6(float) Constant 1103101952
+              31:    6(float) Constant 1103626240
+              32:             TypeVector 6(float) 2
+              33:             TypePointer Function 32(fvec2)
+              35:   32(fvec2) ConstantComposite 9 11
+              37:   32(fvec2) ConstantComposite 13 15
+              39:   32(fvec2) ConstantComposite 17 19
+              41:             TypeMatrix 32(fvec2) 3
+              42:   32(fvec2) ConstantComposite 21 23
+              43:   32(fvec2) ConstantComposite 25 27
+              44:   32(fvec2) ConstantComposite 29 31
+              45:          41 ConstantComposite 42 43 44
+              46:             TypeInt 32 1
+              47:             TypePointer UniformConstant 46(int)
+         48(idx):     47(ptr) Variable UniformConstant
+              50:             TypePointer Function 41
+              55:             TypePointer UniformConstant 41
+          56(um):     55(ptr) Variable UniformConstant
+              58:             TypePointer UniformConstant 32(fvec2)
+              61:             TypeVector 6(float) 4
+   62(PS_OUTPUT):             TypeStruct 61(fvec4)
+              63:             TypePointer Function 62(PS_OUTPUT)
+              65:     46(int) Constant 0
+              68:             TypePointer Function 61(fvec4)
+              70:             TypePointer Output 61(fvec4)
+       71(Color):     70(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+        8(e1_00):      7(ptr) Variable Function
+       10(e1_01):      7(ptr) Variable Function
+       12(e1_10):      7(ptr) Variable Function
+       14(e1_11):      7(ptr) Variable Function
+       16(e1_20):      7(ptr) Variable Function
+       18(e1_21):      7(ptr) Variable Function
+       20(e2_00):      7(ptr) Variable Function
+       22(e2_01):      7(ptr) Variable Function
+       24(e2_10):      7(ptr) Variable Function
+       26(e2_11):      7(ptr) Variable Function
+       28(e2_20):      7(ptr) Variable Function
+       30(e2_21):      7(ptr) Variable Function
+         34(r0a):     33(ptr) Variable Function
+         36(r1a):     33(ptr) Variable Function
+         38(r2a):     33(ptr) Variable Function
+         40(r0b):     33(ptr) Variable Function
+   51(indexable):     50(ptr) Variable Function
+         54(r0c):     33(ptr) Variable Function
+       64(psout):     63(ptr) Variable Function
+                              Store 8(e1_00) 9
+                              Store 10(e1_01) 11
+                              Store 12(e1_10) 13
+                              Store 14(e1_11) 15
+                              Store 16(e1_20) 17
+                              Store 18(e1_21) 19
+                              Store 20(e2_00) 21
+                              Store 22(e2_01) 23
+                              Store 24(e2_10) 25
+                              Store 26(e2_11) 27
+                              Store 28(e2_20) 29
+                              Store 30(e2_21) 31
+                              Store 34(r0a) 35
+                              Store 36(r1a) 37
+                              Store 38(r2a) 39
+              49:     46(int) Load 48(idx)
+                              Store 51(indexable) 45
+              52:     33(ptr) AccessChain 51(indexable) 49
+              53:   32(fvec2) Load 52
+                              Store 40(r0b) 53
+              57:     46(int) Load 48(idx)
+              59:     58(ptr) AccessChain 56(um) 57
+              60:   32(fvec2) Load 59
+                              Store 54(r0c) 60
+              66:    6(float) Load 26(e2_11)
+              67:   61(fvec4) CompositeConstruct 66 66 66 66
+              69:     68(ptr) AccessChain 64(psout) 65
+                              Store 69 67
+              72:     68(ptr) AccessChain 64(psout) 65
+              73:   61(fvec4) Load 72
+                              Store 71(Color) 73
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.max.frag.out b/Test/baseResults/hlsl.max.frag.out
index aad4799..d396be8 100755
--- a/Test/baseResults/hlsl.max.frag.out
+++ b/Test/baseResults/hlsl.max.frag.out
@@ -2,16 +2,22 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(vf4;vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4;vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input1' (in 4-component vector of float)
-0:2      'input2' (in 4-component vector of float)
+0:2      'input1' (layout(location=0 ) in 4-component vector of float)
+0:2      'input2' (layout(location=1 ) in 4-component vector of float)
 0:?     Sequence
-0:3      Branch: Return with expression
-0:3        max (global 4-component vector of float)
-0:3          'input1' (in 4-component vector of float)
-0:3          'input2' (in 4-component vector of float)
+0:3      Sequence
+0:3        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:3          max (global 4-component vector of float)
+0:3            'input1' (layout(location=0 ) in 4-component vector of float)
+0:3            'input2' (layout(location=1 ) in 4-component vector of float)
+0:3        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input1' (layout(location=0 ) in 4-component vector of float)
+0:?     'input2' (layout(location=1 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -20,41 +26,53 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(vf4;vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4;vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input1' (in 4-component vector of float)
-0:2      'input2' (in 4-component vector of float)
+0:2      'input1' (layout(location=0 ) in 4-component vector of float)
+0:2      'input2' (layout(location=1 ) in 4-component vector of float)
 0:?     Sequence
-0:3      Branch: Return with expression
-0:3        max (global 4-component vector of float)
-0:3          'input1' (in 4-component vector of float)
-0:3          'input2' (in 4-component vector of float)
+0:3      Sequence
+0:3        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:3          max (global 4-component vector of float)
+0:3            'input1' (layout(location=0 ) in 4-component vector of float)
+0:3            'input2' (layout(location=1 ) in 4-component vector of float)
+0:3        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input1' (layout(location=0 ) in 4-component vector of float)
+0:?     'input2' (layout(location=1 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 15
+// Id's are bound by 17
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11 13
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 9  "input1"
-                              Name 11  "input2"
+                              Name 9  "@entryPointOutput"
+                              Name 11  "input1"
+                              Name 13  "input2"
+                              Decorate 9(@entryPointOutput) Location 0
+                              Decorate 11(input1) Location 0
+                              Decorate 13(input2) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypePointer Input 7(fvec4)
-       9(input1):      8(ptr) Variable Input
-      11(input2):      8(ptr) Variable Input
+               8:             TypePointer Output 7(fvec4)
+9(@entryPointOutput):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+      11(input1):     10(ptr) Variable Input
+      13(input2):     10(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-              10:    7(fvec4) Load 9(input1)
-              12:    7(fvec4) Load 11(input2)
-              13:    7(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 10 12
-                              ReturnValue 13
+              12:    7(fvec4) Load 11(input1)
+              14:    7(fvec4) Load 13(input2)
+              15:    7(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 12 14
+                              Store 9(@entryPointOutput) 15
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.multiEntry.vert.out b/Test/baseResults/hlsl.multiEntry.vert.out
new file mode 100755
index 0000000..35ecaf5
--- /dev/null
+++ b/Test/baseResults/hlsl.multiEntry.vert.out
@@ -0,0 +1,111 @@
+hlsl.multiEntry.vert
+Shader version: 450
+0:? Sequence
+0:4  Function Definition: FakeEntrypoint(u1; (global 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'Index' (in uint)
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        textureFetch (global 4-component vector of float)
+0:5          'Position' (uniform samplerBuffer)
+0:5          Convert uint to int (temp int)
+0:5            'Index' (in uint)
+0:9  Function Definition: RealEntrypoint(u1; (global 4-component vector of float Position)
+0:9    Function Parameters: 
+0:9      'Index' (in uint VertexIndex)
+0:?     Sequence
+0:10      Sequence
+0:10        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (out 4-component vector of float Position)
+0:10          Function Call: FakeEntrypoint(u1; (global 4-component vector of float)
+0:10            'Index' (in uint VertexIndex)
+0:10        Branch: Return
+0:?   Linker Objects
+0:?     'Position' (uniform samplerBuffer)
+0:?     '@entryPointOutput' (out 4-component vector of float Position)
+0:?     'Index' (in uint VertexIndex)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+0:? Sequence
+0:4  Function Definition: FakeEntrypoint(u1; (global 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'Index' (in uint)
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        textureFetch (global 4-component vector of float)
+0:5          'Position' (uniform samplerBuffer)
+0:5          Convert uint to int (temp int)
+0:5            'Index' (in uint)
+0:9  Function Definition: RealEntrypoint(u1; (global 4-component vector of float Position)
+0:9    Function Parameters: 
+0:9      'Index' (in uint VertexIndex)
+0:?     Sequence
+0:10      Sequence
+0:10        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (out 4-component vector of float Position)
+0:10          Function Call: FakeEntrypoint(u1; (global 4-component vector of float)
+0:10            'Index' (in uint VertexIndex)
+0:10        Branch: Return
+0:?   Linker Objects
+0:?     'Position' (uniform samplerBuffer)
+0:?     '@entryPointOutput' (out 4-component vector of float Position)
+0:?     'Index' (in uint VertexIndex)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 34
+
+                              Capability Shader
+                              Capability SampledBuffer
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "RealEntrypoint" 27 29
+                              Name 4  "RealEntrypoint"
+                              Name 12  "FakeEntrypoint(u1;"
+                              Name 11  "Index"
+                              Name 17  "Position"
+                              Name 27  "@entryPointOutput"
+                              Name 29  "Index"
+                              Name 30  "param"
+                              Decorate 17(Position) DescriptorSet 0
+                              Decorate 27(@entryPointOutput) BuiltIn Position
+                              Decorate 29(Index) BuiltIn VertexIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeVector 8(float) 4
+              10:             TypeFunction 9(fvec4) 7(ptr)
+              14:             TypeImage 8(float) Buffer sampled format:Unknown
+              15:             TypeSampledImage 14
+              16:             TypePointer UniformConstant 15
+    17(Position):     16(ptr) Variable UniformConstant
+              20:             TypeInt 32 1
+              26:             TypePointer Output 9(fvec4)
+27(@entryPointOutput):     26(ptr) Variable Output
+              28:             TypePointer Input 6(int)
+       29(Index):     28(ptr) Variable Input
+4(RealEntrypoint):           2 Function None 3
+               5:             Label
+       30(param):      7(ptr) Variable Function
+              31:      6(int) Load 29(Index)
+                              Store 30(param) 31
+              32:    9(fvec4) FunctionCall 12(FakeEntrypoint(u1;) 30(param)
+                              Store 27(@entryPointOutput) 32
+                              Return
+                              FunctionEnd
+12(FakeEntrypoint(u1;):    9(fvec4) Function None 10
+       11(Index):      7(ptr) FunctionParameter
+              13:             Label
+              18:          15 Load 17(Position)
+              19:      6(int) Load 11(Index)
+              21:     20(int) Bitcast 19
+              22:          14 Image 18
+              23:    9(fvec4) ImageFetch 22 21
+                              ReturnValue 23
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.numericsuffixes.frag.out b/Test/baseResults/hlsl.numericsuffixes.frag.out
index 5ba5831..168065b 100644
--- a/Test/baseResults/hlsl.numericsuffixes.frag.out
+++ b/Test/baseResults/hlsl.numericsuffixes.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:21  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:5  Function Definition: main( (global structure{temp 4-component vector of float color})
 0:5    Function Parameters: 
 0:?     Sequence
 0:7      Sequence
@@ -58,9 +58,17 @@
 0:18        Construct vec4 (temp 4-component vector of float)
 0:18          Convert int to float (temp float)
 0:18            'r07' (temp int)
-0:19      Branch: Return with expression
-0:19        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?       Sequence
+0:?         Sequence
+0:19          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:19            color: direct index for structure (temp 4-component vector of float)
+0:19              'ps_output' (temp structure{temp 4-component vector of float color})
+0:19              Constant:
+0:19                0 (const int)
+0:19        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -69,7 +77,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:21  Function Definition: main( (global structure{temp 4-component vector of float color})
+0:5  Function Definition: main( (global structure{temp 4-component vector of float color})
 0:5    Function Parameters: 
 0:?     Sequence
 0:7      Sequence
@@ -125,20 +133,27 @@
 0:18        Construct vec4 (temp 4-component vector of float)
 0:18          Convert int to float (temp float)
 0:18            'r07' (temp int)
-0:19      Branch: Return with expression
-0:19        'ps_output' (temp structure{temp 4-component vector of float color})
+0:?       Sequence
+0:?         Sequence
+0:19          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:19            color: direct index for structure (temp 4-component vector of float)
+0:19              'ps_output' (temp structure{temp 4-component vector of float color})
+0:19              Constant:
+0:19                0 (const int)
+0:19        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 41
+// Id's are bound by 44
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 40
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r00"
                               Name 12  "r01"
@@ -152,6 +167,8 @@
                               Name 30  "PS_OUTPUT"
                               MemberName 30(PS_OUTPUT) 0  "color"
                               Name 32  "ps_output"
+                              Name 40  "color"
+                              Decorate 40(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -173,6 +190,8 @@
               31:             TypePointer Function 30(PS_OUTPUT)
               33:     19(int) Constant 0
               37:             TypePointer Function 29(fvec4)
+              39:             TypePointer Output 29(fvec4)
+       40(color):     39(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
           8(r00):      7(ptr) Variable Function
@@ -199,6 +218,8 @@
               36:   29(fvec4) CompositeConstruct 35 35 35 35
               38:     37(ptr) AccessChain 32(ps_output) 33
                               Store 38 36
-              39:30(PS_OUTPUT) Load 32(ps_output)
-                              ReturnValue 39
+              41:     37(ptr) AccessChain 32(ps_output) 33
+              42:   29(fvec4) Load 41
+                              Store 40(color) 42
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.overload.frag.out b/Test/baseResults/hlsl.overload.frag.out
new file mode 100755
index 0000000..0e0f470
--- /dev/null
+++ b/Test/baseResults/hlsl.overload.frag.out
@@ -0,0 +1,1592 @@
+hlsl.overload.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: foo1(d1;b1; (global void)
+0:2    Function Parameters: 
+0:2      'a' (in double)
+0:2      'b' (in bool)
+0:3  Function Definition: foo1(d1;u1; (global void)
+0:3    Function Parameters: 
+0:3      'a' (in double)
+0:3      'b' (in uint)
+0:4  Function Definition: foo1(d1;i1; (global void)
+0:4    Function Parameters: 
+0:4      'a' (in double)
+0:4      'b' (in int)
+0:5  Function Definition: foo1(d1;f1; (global void)
+0:5    Function Parameters: 
+0:5      'a' (in double)
+0:5      'b' (in float)
+0:6  Function Definition: foo1(d1;d1; (global void)
+0:6    Function Parameters: 
+0:6      'a' (in double)
+0:6      'b' (in double)
+0:9  Function Definition: foo2(i1;b1; (global void)
+0:9    Function Parameters: 
+0:9      'a' (in int)
+0:9      'b' (in bool)
+0:10  Function Definition: foo2(i1;u1; (global void)
+0:10    Function Parameters: 
+0:10      'a' (in int)
+0:10      'b' (in uint)
+0:11  Function Definition: foo2(i1;i1; (global void)
+0:11    Function Parameters: 
+0:11      'a' (in int)
+0:11      'b' (in int)
+0:12  Function Definition: foo2(i1;f1; (global void)
+0:12    Function Parameters: 
+0:12      'a' (in int)
+0:12      'b' (in float)
+0:13  Function Definition: foo2(i1;d1; (global void)
+0:13    Function Parameters: 
+0:13      'a' (in int)
+0:13      'b' (in double)
+0:16  Function Definition: foo3(b1; (global void)
+0:16    Function Parameters: 
+0:16      'b' (in bool)
+0:17  Function Definition: foo4(u1; (global void)
+0:17    Function Parameters: 
+0:17      'b' (in uint)
+0:18  Function Definition: foo5(i1; (global void)
+0:18    Function Parameters: 
+0:18      'b' (in int)
+0:19  Function Definition: foo6(f1; (global void)
+0:19    Function Parameters: 
+0:19      'b' (in float)
+0:20  Function Definition: foo7(d1; (global void)
+0:20    Function Parameters: 
+0:20      'b' (in double)
+0:23  Function Definition: foo8(f1; (global void)
+0:23    Function Parameters: 
+0:23      '' (in float)
+0:24  Function Definition: foo8(d1; (global void)
+0:24    Function Parameters: 
+0:24      '' (in double)
+0:25  Function Definition: foo9(i1; (global void)
+0:25    Function Parameters: 
+0:25      '' (in int)
+0:26  Function Definition: foo9(u1; (global void)
+0:26    Function Parameters: 
+0:26      '' (in uint)
+0:27  Function Definition: foo10(b1; (global void)
+0:27    Function Parameters: 
+0:27      '' (in bool)
+0:28  Function Definition: foo10(i1; (global void)
+0:28    Function Parameters: 
+0:28      '' (in int)
+0:31  Function Definition: foo11(vf3; (global void)
+0:31    Function Parameters: 
+0:31      '' (in 3-component vector of float)
+0:32  Function Definition: foo11(d1; (global void)
+0:32    Function Parameters: 
+0:32      '' (in double)
+0:33  Function Definition: foo11(vi3; (global void)
+0:33    Function Parameters: 
+0:33      '' (in 3-component vector of int)
+0:34  Function Definition: foo11(u1; (global void)
+0:34    Function Parameters: 
+0:34      '' (in uint)
+0:35  Function Definition: foo12(vf1; (global void)
+0:35    Function Parameters: 
+0:35      '' (in 1-component vector of float)
+0:36  Function Definition: foo12(vd3; (global void)
+0:36    Function Parameters: 
+0:36      '' (in 3-component vector of double)
+0:37  Function Definition: foo16(u1; (global void)
+0:37    Function Parameters: 
+0:37      '' (in uint)
+0:38  Function Definition: foo16(vu2; (global void)
+0:38    Function Parameters: 
+0:38      '' (in 2-component vector of uint)
+0:41  Function Definition: foo13(vf3; (global void)
+0:41    Function Parameters: 
+0:41      '' (in 3-component vector of float)
+0:42  Function Definition: foo14(vi1; (global void)
+0:42    Function Parameters: 
+0:42      '' (in 1-component vector of int)
+0:43  Function Definition: foo15(vb1; (global void)
+0:43    Function Parameters: 
+0:43      '' (in 1-component vector of bool)
+0:46  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:46    Function Parameters: 
+0:46      'input' (layout(location=0 ) in 4-component vector of float)
+0:?     Sequence
+0:53      Function Call: foo1(d1;b1; (global void)
+0:53        'd' (temp double)
+0:53        'b' (temp bool)
+0:54      Function Call: foo1(d1;d1; (global void)
+0:54        'd' (temp double)
+0:54        'd' (temp double)
+0:55      Function Call: foo1(d1;u1; (global void)
+0:55        'd' (temp double)
+0:55        'u' (temp uint)
+0:56      Function Call: foo1(d1;i1; (global void)
+0:56        'd' (temp double)
+0:56        'i' (temp int)
+0:57      Function Call: foo1(d1;f1; (global void)
+0:57        'd' (temp double)
+0:57        'f' (temp float)
+0:59      Function Call: foo1(d1;b1; (global void)
+0:59        Convert float to double (temp double)
+0:59          'f' (temp float)
+0:59        'b' (temp bool)
+0:60      Function Call: foo1(d1;d1; (global void)
+0:60        Convert float to double (temp double)
+0:60          'f' (temp float)
+0:60        'd' (temp double)
+0:61      Function Call: foo1(d1;u1; (global void)
+0:61        Convert float to double (temp double)
+0:61          'f' (temp float)
+0:61        'u' (temp uint)
+0:62      Function Call: foo1(d1;i1; (global void)
+0:62        Convert float to double (temp double)
+0:62          'f' (temp float)
+0:62        'i' (temp int)
+0:63      Function Call: foo1(d1;f1; (global void)
+0:63        Convert float to double (temp double)
+0:63          'f' (temp float)
+0:63        'f' (temp float)
+0:65      Function Call: foo1(d1;b1; (global void)
+0:65        Convert uint to double (temp double)
+0:65          'u' (temp uint)
+0:65        'b' (temp bool)
+0:66      Function Call: foo1(d1;d1; (global void)
+0:66        Convert uint to double (temp double)
+0:66          'u' (temp uint)
+0:66        'd' (temp double)
+0:67      Function Call: foo1(d1;u1; (global void)
+0:67        Convert uint to double (temp double)
+0:67          'u' (temp uint)
+0:67        'u' (temp uint)
+0:68      Function Call: foo1(d1;i1; (global void)
+0:68        Convert uint to double (temp double)
+0:68          'u' (temp uint)
+0:68        'i' (temp int)
+0:69      Function Call: foo1(d1;f1; (global void)
+0:69        Convert uint to double (temp double)
+0:69          'u' (temp uint)
+0:69        'f' (temp float)
+0:71      Function Call: foo1(d1;b1; (global void)
+0:71        Convert int to double (temp double)
+0:71          'i' (temp int)
+0:71        'b' (temp bool)
+0:72      Function Call: foo1(d1;d1; (global void)
+0:72        Convert int to double (temp double)
+0:72          'i' (temp int)
+0:72        'd' (temp double)
+0:73      Function Call: foo1(d1;u1; (global void)
+0:73        Convert int to double (temp double)
+0:73          'i' (temp int)
+0:73        'u' (temp uint)
+0:74      Function Call: foo1(d1;i1; (global void)
+0:74        Convert int to double (temp double)
+0:74          'i' (temp int)
+0:74        'i' (temp int)
+0:75      Function Call: foo1(d1;f1; (global void)
+0:75        Convert int to double (temp double)
+0:75          'i' (temp int)
+0:75        'f' (temp float)
+0:77      Function Call: foo2(i1;b1; (global void)
+0:77        Convert uint to int (temp int)
+0:77          'u' (temp uint)
+0:77        'b' (temp bool)
+0:78      Function Call: foo2(i1;d1; (global void)
+0:78        Convert uint to int (temp int)
+0:78          'u' (temp uint)
+0:78        'd' (temp double)
+0:79      Function Call: foo2(i1;u1; (global void)
+0:79        Convert uint to int (temp int)
+0:79          'u' (temp uint)
+0:79        'u' (temp uint)
+0:80      Function Call: foo2(i1;i1; (global void)
+0:80        Convert uint to int (temp int)
+0:80          'u' (temp uint)
+0:80        'i' (temp int)
+0:81      Function Call: foo2(i1;f1; (global void)
+0:81        Convert uint to int (temp int)
+0:81          'u' (temp uint)
+0:81        'f' (temp float)
+0:83      Function Call: foo2(i1;b1; (global void)
+0:83        'i' (temp int)
+0:83        'b' (temp bool)
+0:84      Function Call: foo2(i1;d1; (global void)
+0:84        'i' (temp int)
+0:84        'd' (temp double)
+0:85      Function Call: foo2(i1;u1; (global void)
+0:85        'i' (temp int)
+0:85        'u' (temp uint)
+0:86      Function Call: foo2(i1;i1; (global void)
+0:86        'i' (temp int)
+0:86        'i' (temp int)
+0:87      Function Call: foo2(i1;f1; (global void)
+0:87        'i' (temp int)
+0:87        'f' (temp float)
+0:89      Function Call: foo3(b1; (global void)
+0:89        'b' (temp bool)
+0:90      Function Call: foo3(b1; (global void)
+0:90        Convert double to bool (temp bool)
+0:90          'd' (temp double)
+0:91      Function Call: foo3(b1; (global void)
+0:91        Convert uint to bool (temp bool)
+0:91          'u' (temp uint)
+0:92      Function Call: foo3(b1; (global void)
+0:92        Convert int to bool (temp bool)
+0:92          'i' (temp int)
+0:93      Function Call: foo3(b1; (global void)
+0:93        Convert float to bool (temp bool)
+0:93          'f' (temp float)
+0:95      Function Call: foo4(u1; (global void)
+0:95        Convert bool to uint (temp uint)
+0:95          'b' (temp bool)
+0:96      Function Call: foo4(u1; (global void)
+0:96        Convert double to uint (temp uint)
+0:96          'd' (temp double)
+0:97      Function Call: foo4(u1; (global void)
+0:97        'u' (temp uint)
+0:98      Function Call: foo4(u1; (global void)
+0:98        Convert int to uint (temp uint)
+0:98          'i' (temp int)
+0:99      Function Call: foo4(u1; (global void)
+0:99        Convert float to uint (temp uint)
+0:99          'f' (temp float)
+0:101      Function Call: foo5(i1; (global void)
+0:101        Convert bool to int (temp int)
+0:101          'b' (temp bool)
+0:102      Function Call: foo5(i1; (global void)
+0:102        Convert double to int (temp int)
+0:102          'd' (temp double)
+0:103      Function Call: foo5(i1; (global void)
+0:103        Convert uint to int (temp int)
+0:103          'u' (temp uint)
+0:104      Function Call: foo5(i1; (global void)
+0:104        'i' (temp int)
+0:105      Function Call: foo5(i1; (global void)
+0:105        Convert float to int (temp int)
+0:105          'f' (temp float)
+0:107      Function Call: foo6(f1; (global void)
+0:107        Convert bool to float (temp float)
+0:107          'b' (temp bool)
+0:108      Function Call: foo6(f1; (global void)
+0:108        Convert double to float (temp float)
+0:108          'd' (temp double)
+0:109      Function Call: foo6(f1; (global void)
+0:109        Convert uint to float (temp float)
+0:109          'u' (temp uint)
+0:110      Function Call: foo6(f1; (global void)
+0:110        Convert int to float (temp float)
+0:110          'i' (temp int)
+0:111      Function Call: foo6(f1; (global void)
+0:111        'f' (temp float)
+0:113      Function Call: foo7(d1; (global void)
+0:113        Convert bool to double (temp double)
+0:113          'b' (temp bool)
+0:114      Function Call: foo7(d1; (global void)
+0:114        'd' (temp double)
+0:115      Function Call: foo7(d1; (global void)
+0:115        Convert uint to double (temp double)
+0:115          'u' (temp uint)
+0:116      Function Call: foo7(d1; (global void)
+0:116        Convert int to double (temp double)
+0:116          'i' (temp int)
+0:117      Function Call: foo7(d1; (global void)
+0:117        Convert float to double (temp double)
+0:117          'f' (temp float)
+0:119      Function Call: foo8(f1; (global void)
+0:119        Convert bool to float (temp float)
+0:119          'b' (temp bool)
+0:120      Function Call: foo8(f1; (global void)
+0:120        Convert uint to float (temp float)
+0:120          'u' (temp uint)
+0:121      Function Call: foo8(f1; (global void)
+0:121        Convert int to float (temp float)
+0:121          'i' (temp int)
+0:123      Function Call: foo9(i1; (global void)
+0:123        Convert bool to int (temp int)
+0:123          'b' (temp bool)
+0:124      Function Call: foo9(u1; (global void)
+0:124        Convert float to uint (temp uint)
+0:124          'f' (temp float)
+0:125      Function Call: foo9(u1; (global void)
+0:125        Convert double to uint (temp uint)
+0:125          'd' (temp double)
+0:127      Function Call: foo10(i1; (global void)
+0:127        Convert uint to int (temp int)
+0:127          'u' (temp uint)
+0:128      Function Call: foo10(i1; (global void)
+0:128        Convert float to int (temp int)
+0:128          'f' (temp float)
+0:129      Function Call: foo10(i1; (global void)
+0:129        Convert double to int (temp int)
+0:129          'd' (temp double)
+0:131      Function Call: foo11(u1; (global void)
+0:131        Convert bool to uint (temp uint)
+0:131          'b' (temp bool)
+0:132      Function Call: foo11(d1; (global void)
+0:132        Convert float to double (temp double)
+0:132          'f' (temp float)
+0:133      Function Call: foo12(vd3; (global void)
+0:133        Convert float to double (temp 3-component vector of double)
+0:133          Construct vec3 (temp 3-component vector of float)
+0:133            'f' (temp float)
+0:134      Function Call: foo16(vu2; (global void)
+0:?         Convert int to uint (temp 2-component vector of uint)
+0:?           Construct ivec2 (temp 2-component vector of int)
+0:134            'i' (temp int)
+0:134            'i' (temp int)
+0:136      Function Call: foo13(vf3; (global void)
+0:136        Construct vec3 (in 3-component vector of float)
+0:136          'f' (temp float)
+0:137      Function Call: foo14(vi1; (global void)
+0:137        Construct int (in 1-component vector of int)
+0:137          Construct ivec4 (temp 4-component vector of int)
+0:137            'i' (temp int)
+0:138      Function Call: foo15(vb1; (global void)
+0:138        Construct bool (in 1-component vector of bool)
+0:138          'b' (temp bool)
+0:139      Function Call: foo15(vb1; (global void)
+0:139        Construct bool (in 1-component vector of bool)
+0:139          Construct bvec3 (temp 3-component vector of bool)
+0:139            'b' (temp bool)
+0:141      Sequence
+0:141        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:141          'input' (layout(location=0 ) in 4-component vector of float)
+0:141        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: foo1(d1;b1; (global void)
+0:2    Function Parameters: 
+0:2      'a' (in double)
+0:2      'b' (in bool)
+0:3  Function Definition: foo1(d1;u1; (global void)
+0:3    Function Parameters: 
+0:3      'a' (in double)
+0:3      'b' (in uint)
+0:4  Function Definition: foo1(d1;i1; (global void)
+0:4    Function Parameters: 
+0:4      'a' (in double)
+0:4      'b' (in int)
+0:5  Function Definition: foo1(d1;f1; (global void)
+0:5    Function Parameters: 
+0:5      'a' (in double)
+0:5      'b' (in float)
+0:6  Function Definition: foo1(d1;d1; (global void)
+0:6    Function Parameters: 
+0:6      'a' (in double)
+0:6      'b' (in double)
+0:9  Function Definition: foo2(i1;b1; (global void)
+0:9    Function Parameters: 
+0:9      'a' (in int)
+0:9      'b' (in bool)
+0:10  Function Definition: foo2(i1;u1; (global void)
+0:10    Function Parameters: 
+0:10      'a' (in int)
+0:10      'b' (in uint)
+0:11  Function Definition: foo2(i1;i1; (global void)
+0:11    Function Parameters: 
+0:11      'a' (in int)
+0:11      'b' (in int)
+0:12  Function Definition: foo2(i1;f1; (global void)
+0:12    Function Parameters: 
+0:12      'a' (in int)
+0:12      'b' (in float)
+0:13  Function Definition: foo2(i1;d1; (global void)
+0:13    Function Parameters: 
+0:13      'a' (in int)
+0:13      'b' (in double)
+0:16  Function Definition: foo3(b1; (global void)
+0:16    Function Parameters: 
+0:16      'b' (in bool)
+0:17  Function Definition: foo4(u1; (global void)
+0:17    Function Parameters: 
+0:17      'b' (in uint)
+0:18  Function Definition: foo5(i1; (global void)
+0:18    Function Parameters: 
+0:18      'b' (in int)
+0:19  Function Definition: foo6(f1; (global void)
+0:19    Function Parameters: 
+0:19      'b' (in float)
+0:20  Function Definition: foo7(d1; (global void)
+0:20    Function Parameters: 
+0:20      'b' (in double)
+0:23  Function Definition: foo8(f1; (global void)
+0:23    Function Parameters: 
+0:23      '' (in float)
+0:24  Function Definition: foo8(d1; (global void)
+0:24    Function Parameters: 
+0:24      '' (in double)
+0:25  Function Definition: foo9(i1; (global void)
+0:25    Function Parameters: 
+0:25      '' (in int)
+0:26  Function Definition: foo9(u1; (global void)
+0:26    Function Parameters: 
+0:26      '' (in uint)
+0:27  Function Definition: foo10(b1; (global void)
+0:27    Function Parameters: 
+0:27      '' (in bool)
+0:28  Function Definition: foo10(i1; (global void)
+0:28    Function Parameters: 
+0:28      '' (in int)
+0:31  Function Definition: foo11(vf3; (global void)
+0:31    Function Parameters: 
+0:31      '' (in 3-component vector of float)
+0:32  Function Definition: foo11(d1; (global void)
+0:32    Function Parameters: 
+0:32      '' (in double)
+0:33  Function Definition: foo11(vi3; (global void)
+0:33    Function Parameters: 
+0:33      '' (in 3-component vector of int)
+0:34  Function Definition: foo11(u1; (global void)
+0:34    Function Parameters: 
+0:34      '' (in uint)
+0:35  Function Definition: foo12(vf1; (global void)
+0:35    Function Parameters: 
+0:35      '' (in 1-component vector of float)
+0:36  Function Definition: foo12(vd3; (global void)
+0:36    Function Parameters: 
+0:36      '' (in 3-component vector of double)
+0:37  Function Definition: foo16(u1; (global void)
+0:37    Function Parameters: 
+0:37      '' (in uint)
+0:38  Function Definition: foo16(vu2; (global void)
+0:38    Function Parameters: 
+0:38      '' (in 2-component vector of uint)
+0:41  Function Definition: foo13(vf3; (global void)
+0:41    Function Parameters: 
+0:41      '' (in 3-component vector of float)
+0:42  Function Definition: foo14(vi1; (global void)
+0:42    Function Parameters: 
+0:42      '' (in 1-component vector of int)
+0:43  Function Definition: foo15(vb1; (global void)
+0:43    Function Parameters: 
+0:43      '' (in 1-component vector of bool)
+0:46  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:46    Function Parameters: 
+0:46      'input' (layout(location=0 ) in 4-component vector of float)
+0:?     Sequence
+0:53      Function Call: foo1(d1;b1; (global void)
+0:53        'd' (temp double)
+0:53        'b' (temp bool)
+0:54      Function Call: foo1(d1;d1; (global void)
+0:54        'd' (temp double)
+0:54        'd' (temp double)
+0:55      Function Call: foo1(d1;u1; (global void)
+0:55        'd' (temp double)
+0:55        'u' (temp uint)
+0:56      Function Call: foo1(d1;i1; (global void)
+0:56        'd' (temp double)
+0:56        'i' (temp int)
+0:57      Function Call: foo1(d1;f1; (global void)
+0:57        'd' (temp double)
+0:57        'f' (temp float)
+0:59      Function Call: foo1(d1;b1; (global void)
+0:59        Convert float to double (temp double)
+0:59          'f' (temp float)
+0:59        'b' (temp bool)
+0:60      Function Call: foo1(d1;d1; (global void)
+0:60        Convert float to double (temp double)
+0:60          'f' (temp float)
+0:60        'd' (temp double)
+0:61      Function Call: foo1(d1;u1; (global void)
+0:61        Convert float to double (temp double)
+0:61          'f' (temp float)
+0:61        'u' (temp uint)
+0:62      Function Call: foo1(d1;i1; (global void)
+0:62        Convert float to double (temp double)
+0:62          'f' (temp float)
+0:62        'i' (temp int)
+0:63      Function Call: foo1(d1;f1; (global void)
+0:63        Convert float to double (temp double)
+0:63          'f' (temp float)
+0:63        'f' (temp float)
+0:65      Function Call: foo1(d1;b1; (global void)
+0:65        Convert uint to double (temp double)
+0:65          'u' (temp uint)
+0:65        'b' (temp bool)
+0:66      Function Call: foo1(d1;d1; (global void)
+0:66        Convert uint to double (temp double)
+0:66          'u' (temp uint)
+0:66        'd' (temp double)
+0:67      Function Call: foo1(d1;u1; (global void)
+0:67        Convert uint to double (temp double)
+0:67          'u' (temp uint)
+0:67        'u' (temp uint)
+0:68      Function Call: foo1(d1;i1; (global void)
+0:68        Convert uint to double (temp double)
+0:68          'u' (temp uint)
+0:68        'i' (temp int)
+0:69      Function Call: foo1(d1;f1; (global void)
+0:69        Convert uint to double (temp double)
+0:69          'u' (temp uint)
+0:69        'f' (temp float)
+0:71      Function Call: foo1(d1;b1; (global void)
+0:71        Convert int to double (temp double)
+0:71          'i' (temp int)
+0:71        'b' (temp bool)
+0:72      Function Call: foo1(d1;d1; (global void)
+0:72        Convert int to double (temp double)
+0:72          'i' (temp int)
+0:72        'd' (temp double)
+0:73      Function Call: foo1(d1;u1; (global void)
+0:73        Convert int to double (temp double)
+0:73          'i' (temp int)
+0:73        'u' (temp uint)
+0:74      Function Call: foo1(d1;i1; (global void)
+0:74        Convert int to double (temp double)
+0:74          'i' (temp int)
+0:74        'i' (temp int)
+0:75      Function Call: foo1(d1;f1; (global void)
+0:75        Convert int to double (temp double)
+0:75          'i' (temp int)
+0:75        'f' (temp float)
+0:77      Function Call: foo2(i1;b1; (global void)
+0:77        Convert uint to int (temp int)
+0:77          'u' (temp uint)
+0:77        'b' (temp bool)
+0:78      Function Call: foo2(i1;d1; (global void)
+0:78        Convert uint to int (temp int)
+0:78          'u' (temp uint)
+0:78        'd' (temp double)
+0:79      Function Call: foo2(i1;u1; (global void)
+0:79        Convert uint to int (temp int)
+0:79          'u' (temp uint)
+0:79        'u' (temp uint)
+0:80      Function Call: foo2(i1;i1; (global void)
+0:80        Convert uint to int (temp int)
+0:80          'u' (temp uint)
+0:80        'i' (temp int)
+0:81      Function Call: foo2(i1;f1; (global void)
+0:81        Convert uint to int (temp int)
+0:81          'u' (temp uint)
+0:81        'f' (temp float)
+0:83      Function Call: foo2(i1;b1; (global void)
+0:83        'i' (temp int)
+0:83        'b' (temp bool)
+0:84      Function Call: foo2(i1;d1; (global void)
+0:84        'i' (temp int)
+0:84        'd' (temp double)
+0:85      Function Call: foo2(i1;u1; (global void)
+0:85        'i' (temp int)
+0:85        'u' (temp uint)
+0:86      Function Call: foo2(i1;i1; (global void)
+0:86        'i' (temp int)
+0:86        'i' (temp int)
+0:87      Function Call: foo2(i1;f1; (global void)
+0:87        'i' (temp int)
+0:87        'f' (temp float)
+0:89      Function Call: foo3(b1; (global void)
+0:89        'b' (temp bool)
+0:90      Function Call: foo3(b1; (global void)
+0:90        Convert double to bool (temp bool)
+0:90          'd' (temp double)
+0:91      Function Call: foo3(b1; (global void)
+0:91        Convert uint to bool (temp bool)
+0:91          'u' (temp uint)
+0:92      Function Call: foo3(b1; (global void)
+0:92        Convert int to bool (temp bool)
+0:92          'i' (temp int)
+0:93      Function Call: foo3(b1; (global void)
+0:93        Convert float to bool (temp bool)
+0:93          'f' (temp float)
+0:95      Function Call: foo4(u1; (global void)
+0:95        Convert bool to uint (temp uint)
+0:95          'b' (temp bool)
+0:96      Function Call: foo4(u1; (global void)
+0:96        Convert double to uint (temp uint)
+0:96          'd' (temp double)
+0:97      Function Call: foo4(u1; (global void)
+0:97        'u' (temp uint)
+0:98      Function Call: foo4(u1; (global void)
+0:98        Convert int to uint (temp uint)
+0:98          'i' (temp int)
+0:99      Function Call: foo4(u1; (global void)
+0:99        Convert float to uint (temp uint)
+0:99          'f' (temp float)
+0:101      Function Call: foo5(i1; (global void)
+0:101        Convert bool to int (temp int)
+0:101          'b' (temp bool)
+0:102      Function Call: foo5(i1; (global void)
+0:102        Convert double to int (temp int)
+0:102          'd' (temp double)
+0:103      Function Call: foo5(i1; (global void)
+0:103        Convert uint to int (temp int)
+0:103          'u' (temp uint)
+0:104      Function Call: foo5(i1; (global void)
+0:104        'i' (temp int)
+0:105      Function Call: foo5(i1; (global void)
+0:105        Convert float to int (temp int)
+0:105          'f' (temp float)
+0:107      Function Call: foo6(f1; (global void)
+0:107        Convert bool to float (temp float)
+0:107          'b' (temp bool)
+0:108      Function Call: foo6(f1; (global void)
+0:108        Convert double to float (temp float)
+0:108          'd' (temp double)
+0:109      Function Call: foo6(f1; (global void)
+0:109        Convert uint to float (temp float)
+0:109          'u' (temp uint)
+0:110      Function Call: foo6(f1; (global void)
+0:110        Convert int to float (temp float)
+0:110          'i' (temp int)
+0:111      Function Call: foo6(f1; (global void)
+0:111        'f' (temp float)
+0:113      Function Call: foo7(d1; (global void)
+0:113        Convert bool to double (temp double)
+0:113          'b' (temp bool)
+0:114      Function Call: foo7(d1; (global void)
+0:114        'd' (temp double)
+0:115      Function Call: foo7(d1; (global void)
+0:115        Convert uint to double (temp double)
+0:115          'u' (temp uint)
+0:116      Function Call: foo7(d1; (global void)
+0:116        Convert int to double (temp double)
+0:116          'i' (temp int)
+0:117      Function Call: foo7(d1; (global void)
+0:117        Convert float to double (temp double)
+0:117          'f' (temp float)
+0:119      Function Call: foo8(f1; (global void)
+0:119        Convert bool to float (temp float)
+0:119          'b' (temp bool)
+0:120      Function Call: foo8(f1; (global void)
+0:120        Convert uint to float (temp float)
+0:120          'u' (temp uint)
+0:121      Function Call: foo8(f1; (global void)
+0:121        Convert int to float (temp float)
+0:121          'i' (temp int)
+0:123      Function Call: foo9(i1; (global void)
+0:123        Convert bool to int (temp int)
+0:123          'b' (temp bool)
+0:124      Function Call: foo9(u1; (global void)
+0:124        Convert float to uint (temp uint)
+0:124          'f' (temp float)
+0:125      Function Call: foo9(u1; (global void)
+0:125        Convert double to uint (temp uint)
+0:125          'd' (temp double)
+0:127      Function Call: foo10(i1; (global void)
+0:127        Convert uint to int (temp int)
+0:127          'u' (temp uint)
+0:128      Function Call: foo10(i1; (global void)
+0:128        Convert float to int (temp int)
+0:128          'f' (temp float)
+0:129      Function Call: foo10(i1; (global void)
+0:129        Convert double to int (temp int)
+0:129          'd' (temp double)
+0:131      Function Call: foo11(u1; (global void)
+0:131        Convert bool to uint (temp uint)
+0:131          'b' (temp bool)
+0:132      Function Call: foo11(d1; (global void)
+0:132        Convert float to double (temp double)
+0:132          'f' (temp float)
+0:133      Function Call: foo12(vd3; (global void)
+0:133        Convert float to double (temp 3-component vector of double)
+0:133          Construct vec3 (temp 3-component vector of float)
+0:133            'f' (temp float)
+0:134      Function Call: foo16(vu2; (global void)
+0:?         Convert int to uint (temp 2-component vector of uint)
+0:?           Construct ivec2 (temp 2-component vector of int)
+0:134            'i' (temp int)
+0:134            'i' (temp int)
+0:136      Function Call: foo13(vf3; (global void)
+0:136        Construct vec3 (in 3-component vector of float)
+0:136          'f' (temp float)
+0:137      Function Call: foo14(vi1; (global void)
+0:137        Construct int (in 1-component vector of int)
+0:137          Construct ivec4 (temp 4-component vector of int)
+0:137            'i' (temp int)
+0:138      Function Call: foo15(vb1; (global void)
+0:138        Construct bool (in 1-component vector of bool)
+0:138          'b' (temp bool)
+0:139      Function Call: foo15(vb1; (global void)
+0:139        Construct bool (in 1-component vector of bool)
+0:139          Construct bvec3 (temp 3-component vector of bool)
+0:139            'b' (temp bool)
+0:141      Sequence
+0:141        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:141          'input' (layout(location=0 ) in 4-component vector of float)
+0:141        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 509
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction" 504 506
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "PixelShaderFunction"
+                              Name 13  "foo1(d1;b1;"
+                              Name 11  "a"
+                              Name 12  "b"
+                              Name 20  "foo1(d1;u1;"
+                              Name 18  "a"
+                              Name 19  "b"
+                              Name 27  "foo1(d1;i1;"
+                              Name 25  "a"
+                              Name 26  "b"
+                              Name 34  "foo1(d1;f1;"
+                              Name 32  "a"
+                              Name 33  "b"
+                              Name 39  "foo1(d1;d1;"
+                              Name 37  "a"
+                              Name 38  "b"
+                              Name 44  "foo2(i1;b1;"
+                              Name 42  "a"
+                              Name 43  "b"
+                              Name 49  "foo2(i1;u1;"
+                              Name 47  "a"
+                              Name 48  "b"
+                              Name 54  "foo2(i1;i1;"
+                              Name 52  "a"
+                              Name 53  "b"
+                              Name 59  "foo2(i1;f1;"
+                              Name 57  "a"
+                              Name 58  "b"
+                              Name 64  "foo2(i1;d1;"
+                              Name 62  "a"
+                              Name 63  "b"
+                              Name 68  "foo3(b1;"
+                              Name 67  "b"
+                              Name 72  "foo4(u1;"
+                              Name 71  "b"
+                              Name 76  "foo5(i1;"
+                              Name 75  "b"
+                              Name 80  "foo6(f1;"
+                              Name 79  "b"
+                              Name 84  "foo7(d1;"
+                              Name 83  "b"
+                              Name 87  "foo8(f1;"
+                              Name 86  ""
+                              Name 90  "foo8(d1;"
+                              Name 89  ""
+                              Name 93  "foo9(i1;"
+                              Name 92  ""
+                              Name 96  "foo9(u1;"
+                              Name 95  ""
+                              Name 99  "foo10(b1;"
+                              Name 98  ""
+                              Name 102  "foo10(i1;"
+                              Name 101  ""
+                              Name 108  "foo11(vf3;"
+                              Name 107  ""
+                              Name 111  "foo11(d1;"
+                              Name 110  ""
+                              Name 117  "foo11(vi3;"
+                              Name 116  ""
+                              Name 120  "foo11(u1;"
+                              Name 119  ""
+                              Name 123  "foo12(vf1;"
+                              Name 122  ""
+                              Name 129  "foo12(vd3;"
+                              Name 128  ""
+                              Name 132  "foo16(u1;"
+                              Name 131  ""
+                              Name 138  "foo16(vu2;"
+                              Name 137  ""
+                              Name 141  "foo13(vf3;"
+                              Name 140  ""
+                              Name 144  "foo14(vi1;"
+                              Name 143  ""
+                              Name 147  "foo15(vb1;"
+                              Name 146  ""
+                              Name 149  "d"
+                              Name 150  "b"
+                              Name 151  "param"
+                              Name 153  "param"
+                              Name 156  "param"
+                              Name 158  "param"
+                              Name 161  "u"
+                              Name 162  "param"
+                              Name 164  "param"
+                              Name 167  "i"
+                              Name 168  "param"
+                              Name 170  "param"
+                              Name 173  "f"
+                              Name 174  "param"
+                              Name 176  "param"
+                              Name 181  "param"
+                              Name 182  "param"
+                              Name 187  "param"
+                              Name 188  "param"
+                              Name 193  "param"
+                              Name 194  "param"
+                              Name 199  "param"
+                              Name 200  "param"
+                              Name 205  "param"
+                              Name 206  "param"
+                              Name 211  "param"
+                              Name 212  "param"
+                              Name 217  "param"
+                              Name 218  "param"
+                              Name 223  "param"
+                              Name 224  "param"
+                              Name 229  "param"
+                              Name 230  "param"
+                              Name 235  "param"
+                              Name 236  "param"
+                              Name 241  "param"
+                              Name 242  "param"
+                              Name 247  "param"
+                              Name 248  "param"
+                              Name 253  "param"
+                              Name 254  "param"
+                              Name 259  "param"
+                              Name 260  "param"
+                              Name 265  "param"
+                              Name 266  "param"
+                              Name 271  "param"
+                              Name 272  "param"
+                              Name 277  "param"
+                              Name 278  "param"
+                              Name 283  "param"
+                              Name 284  "param"
+                              Name 289  "param"
+                              Name 290  "param"
+                              Name 295  "param"
+                              Name 296  "param"
+                              Name 299  "param"
+                              Name 301  "param"
+                              Name 304  "param"
+                              Name 306  "param"
+                              Name 309  "param"
+                              Name 311  "param"
+                              Name 314  "param"
+                              Name 316  "param"
+                              Name 319  "param"
+                              Name 321  "param"
+                              Name 324  "param"
+                              Name 330  "param"
+                              Name 335  "param"
+                              Name 339  "param"
+                              Name 344  "param"
+                              Name 349  "param"
+                              Name 353  "param"
+                              Name 355  "param"
+                              Name 360  "param"
+                              Name 364  "param"
+                              Name 370  "param"
+                              Name 374  "param"
+                              Name 378  "param"
+                              Name 380  "param"
+                              Name 385  "param"
+                              Name 390  "param"
+                              Name 394  "param"
+                              Name 398  "param"
+                              Name 402  "param"
+                              Name 404  "param"
+                              Name 410  "param"
+                              Name 412  "param"
+                              Name 417  "param"
+                              Name 421  "param"
+                              Name 425  "param"
+                              Name 429  "param"
+                              Name 433  "param"
+                              Name 437  "param"
+                              Name 441  "param"
+                              Name 445  "param"
+                              Name 449  "param"
+                              Name 453  "param"
+                              Name 457  "param"
+                              Name 461  "param"
+                              Name 465  "param"
+                              Name 469  "param"
+                              Name 474  "param"
+                              Name 481  "param"
+                              Name 485  "param"
+                              Name 491  "param"
+                              Name 494  "param"
+                              Name 500  "param"
+                              Name 504  "@entryPointOutput"
+                              Name 506  "input"
+                              Decorate 504(@entryPointOutput) Location 0
+                              Decorate 506(input) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 64
+               7:             TypePointer Function 6(float)
+               8:             TypeBool
+               9:             TypePointer Function 8(bool)
+              10:             TypeFunction 2 7(ptr) 9(ptr)
+              15:             TypeInt 32 0
+              16:             TypePointer Function 15(int)
+              17:             TypeFunction 2 7(ptr) 16(ptr)
+              22:             TypeInt 32 1
+              23:             TypePointer Function 22(int)
+              24:             TypeFunction 2 7(ptr) 23(ptr)
+              29:             TypeFloat 32
+              30:             TypePointer Function 29(float)
+              31:             TypeFunction 2 7(ptr) 30(ptr)
+              36:             TypeFunction 2 7(ptr) 7(ptr)
+              41:             TypeFunction 2 23(ptr) 9(ptr)
+              46:             TypeFunction 2 23(ptr) 16(ptr)
+              51:             TypeFunction 2 23(ptr) 23(ptr)
+              56:             TypeFunction 2 23(ptr) 30(ptr)
+              61:             TypeFunction 2 23(ptr) 7(ptr)
+              66:             TypeFunction 2 9(ptr)
+              70:             TypeFunction 2 16(ptr)
+              74:             TypeFunction 2 23(ptr)
+              78:             TypeFunction 2 30(ptr)
+              82:             TypeFunction 2 7(ptr)
+             104:             TypeVector 29(float) 3
+             105:             TypePointer Function 104(fvec3)
+             106:             TypeFunction 2 105(ptr)
+             113:             TypeVector 22(int) 3
+             114:             TypePointer Function 113(ivec3)
+             115:             TypeFunction 2 114(ptr)
+             125:             TypeVector 6(float) 3
+             126:             TypePointer Function 125(fvec3)
+             127:             TypeFunction 2 126(ptr)
+             134:             TypeVector 15(int) 2
+             135:             TypePointer Function 134(ivec2)
+             136:             TypeFunction 2 135(ptr)
+             328:    6(float) Constant 0 0
+             333:     15(int) Constant 0
+             342:   29(float) Constant 0
+             347:     15(int) Constant 1
+             367:     22(int) Constant 0
+             368:     22(int) Constant 1
+             388:   29(float) Constant 1065353216
+             408:    6(float) Constant 0 1072693248
+             478:             TypeVector 22(int) 2
+             488:             TypeVector 22(int) 4
+             497:             TypeVector 8(bool) 3
+             502:             TypeVector 29(float) 4
+             503:             TypePointer Output 502(fvec4)
+504(@entryPointOutput):    503(ptr) Variable Output
+             505:             TypePointer Input 502(fvec4)
+      506(input):    505(ptr) Variable Input
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+          149(d):      7(ptr) Variable Function
+          150(b):      9(ptr) Variable Function
+      151(param):      7(ptr) Variable Function
+      153(param):      9(ptr) Variable Function
+      156(param):      7(ptr) Variable Function
+      158(param):      7(ptr) Variable Function
+          161(u):     16(ptr) Variable Function
+      162(param):      7(ptr) Variable Function
+      164(param):     16(ptr) Variable Function
+          167(i):     23(ptr) Variable Function
+      168(param):      7(ptr) Variable Function
+      170(param):     23(ptr) Variable Function
+          173(f):     30(ptr) Variable Function
+      174(param):      7(ptr) Variable Function
+      176(param):     30(ptr) Variable Function
+      181(param):      7(ptr) Variable Function
+      182(param):      9(ptr) Variable Function
+      187(param):      7(ptr) Variable Function
+      188(param):      7(ptr) Variable Function
+      193(param):      7(ptr) Variable Function
+      194(param):     16(ptr) Variable Function
+      199(param):      7(ptr) Variable Function
+      200(param):     23(ptr) Variable Function
+      205(param):      7(ptr) Variable Function
+      206(param):     30(ptr) Variable Function
+      211(param):      7(ptr) Variable Function
+      212(param):      9(ptr) Variable Function
+      217(param):      7(ptr) Variable Function
+      218(param):      7(ptr) Variable Function
+      223(param):      7(ptr) Variable Function
+      224(param):     16(ptr) Variable Function
+      229(param):      7(ptr) Variable Function
+      230(param):     23(ptr) Variable Function
+      235(param):      7(ptr) Variable Function
+      236(param):     30(ptr) Variable Function
+      241(param):      7(ptr) Variable Function
+      242(param):      9(ptr) Variable Function
+      247(param):      7(ptr) Variable Function
+      248(param):      7(ptr) Variable Function
+      253(param):      7(ptr) Variable Function
+      254(param):     16(ptr) Variable Function
+      259(param):      7(ptr) Variable Function
+      260(param):     23(ptr) Variable Function
+      265(param):      7(ptr) Variable Function
+      266(param):     30(ptr) Variable Function
+      271(param):     23(ptr) Variable Function
+      272(param):      9(ptr) Variable Function
+      277(param):     23(ptr) Variable Function
+      278(param):      7(ptr) Variable Function
+      283(param):     23(ptr) Variable Function
+      284(param):     16(ptr) Variable Function
+      289(param):     23(ptr) Variable Function
+      290(param):     23(ptr) Variable Function
+      295(param):     23(ptr) Variable Function
+      296(param):     30(ptr) Variable Function
+      299(param):     23(ptr) Variable Function
+      301(param):      9(ptr) Variable Function
+      304(param):     23(ptr) Variable Function
+      306(param):      7(ptr) Variable Function
+      309(param):     23(ptr) Variable Function
+      311(param):     16(ptr) Variable Function
+      314(param):     23(ptr) Variable Function
+      316(param):     23(ptr) Variable Function
+      319(param):     23(ptr) Variable Function
+      321(param):     30(ptr) Variable Function
+      324(param):      9(ptr) Variable Function
+      330(param):      9(ptr) Variable Function
+      335(param):      9(ptr) Variable Function
+      339(param):      9(ptr) Variable Function
+      344(param):      9(ptr) Variable Function
+      349(param):     16(ptr) Variable Function
+      353(param):     16(ptr) Variable Function
+      355(param):     16(ptr) Variable Function
+      360(param):     16(ptr) Variable Function
+      364(param):     16(ptr) Variable Function
+      370(param):     23(ptr) Variable Function
+      374(param):     23(ptr) Variable Function
+      378(param):     23(ptr) Variable Function
+      380(param):     23(ptr) Variable Function
+      385(param):     23(ptr) Variable Function
+      390(param):     30(ptr) Variable Function
+      394(param):     30(ptr) Variable Function
+      398(param):     30(ptr) Variable Function
+      402(param):     30(ptr) Variable Function
+      404(param):     30(ptr) Variable Function
+      410(param):      7(ptr) Variable Function
+      412(param):      7(ptr) Variable Function
+      417(param):      7(ptr) Variable Function
+      421(param):      7(ptr) Variable Function
+      425(param):      7(ptr) Variable Function
+      429(param):     30(ptr) Variable Function
+      433(param):     30(ptr) Variable Function
+      437(param):     30(ptr) Variable Function
+      441(param):     23(ptr) Variable Function
+      445(param):     16(ptr) Variable Function
+      449(param):     16(ptr) Variable Function
+      453(param):     23(ptr) Variable Function
+      457(param):     23(ptr) Variable Function
+      461(param):     23(ptr) Variable Function
+      465(param):     16(ptr) Variable Function
+      469(param):      7(ptr) Variable Function
+      474(param):    126(ptr) Variable Function
+      481(param):    135(ptr) Variable Function
+      485(param):    105(ptr) Variable Function
+      491(param):     23(ptr) Variable Function
+      494(param):      9(ptr) Variable Function
+      500(param):      9(ptr) Variable Function
+             152:    6(float) Load 149(d)
+                              Store 151(param) 152
+             154:     8(bool) Load 150(b)
+                              Store 153(param) 154
+             155:           2 FunctionCall 13(foo1(d1;b1;) 151(param) 153(param)
+             157:    6(float) Load 149(d)
+                              Store 156(param) 157
+             159:    6(float) Load 149(d)
+                              Store 158(param) 159
+             160:           2 FunctionCall 39(foo1(d1;d1;) 156(param) 158(param)
+             163:    6(float) Load 149(d)
+                              Store 162(param) 163
+             165:     15(int) Load 161(u)
+                              Store 164(param) 165
+             166:           2 FunctionCall 20(foo1(d1;u1;) 162(param) 164(param)
+             169:    6(float) Load 149(d)
+                              Store 168(param) 169
+             171:     22(int) Load 167(i)
+                              Store 170(param) 171
+             172:           2 FunctionCall 27(foo1(d1;i1;) 168(param) 170(param)
+             175:    6(float) Load 149(d)
+                              Store 174(param) 175
+             177:   29(float) Load 173(f)
+                              Store 176(param) 177
+             178:           2 FunctionCall 34(foo1(d1;f1;) 174(param) 176(param)
+             179:   29(float) Load 173(f)
+             180:    6(float) FConvert 179
+                              Store 181(param) 180
+             183:     8(bool) Load 150(b)
+                              Store 182(param) 183
+             184:           2 FunctionCall 13(foo1(d1;b1;) 181(param) 182(param)
+             185:   29(float) Load 173(f)
+             186:    6(float) FConvert 185
+                              Store 187(param) 186
+             189:    6(float) Load 149(d)
+                              Store 188(param) 189
+             190:           2 FunctionCall 39(foo1(d1;d1;) 187(param) 188(param)
+             191:   29(float) Load 173(f)
+             192:    6(float) FConvert 191
+                              Store 193(param) 192
+             195:     15(int) Load 161(u)
+                              Store 194(param) 195
+             196:           2 FunctionCall 20(foo1(d1;u1;) 193(param) 194(param)
+             197:   29(float) Load 173(f)
+             198:    6(float) FConvert 197
+                              Store 199(param) 198
+             201:     22(int) Load 167(i)
+                              Store 200(param) 201
+             202:           2 FunctionCall 27(foo1(d1;i1;) 199(param) 200(param)
+             203:   29(float) Load 173(f)
+             204:    6(float) FConvert 203
+                              Store 205(param) 204
+             207:   29(float) Load 173(f)
+                              Store 206(param) 207
+             208:           2 FunctionCall 34(foo1(d1;f1;) 205(param) 206(param)
+             209:     15(int) Load 161(u)
+             210:    6(float) ConvertUToF 209
+                              Store 211(param) 210
+             213:     8(bool) Load 150(b)
+                              Store 212(param) 213
+             214:           2 FunctionCall 13(foo1(d1;b1;) 211(param) 212(param)
+             215:     15(int) Load 161(u)
+             216:    6(float) ConvertUToF 215
+                              Store 217(param) 216
+             219:    6(float) Load 149(d)
+                              Store 218(param) 219
+             220:           2 FunctionCall 39(foo1(d1;d1;) 217(param) 218(param)
+             221:     15(int) Load 161(u)
+             222:    6(float) ConvertUToF 221
+                              Store 223(param) 222
+             225:     15(int) Load 161(u)
+                              Store 224(param) 225
+             226:           2 FunctionCall 20(foo1(d1;u1;) 223(param) 224(param)
+             227:     15(int) Load 161(u)
+             228:    6(float) ConvertUToF 227
+                              Store 229(param) 228
+             231:     22(int) Load 167(i)
+                              Store 230(param) 231
+             232:           2 FunctionCall 27(foo1(d1;i1;) 229(param) 230(param)
+             233:     15(int) Load 161(u)
+             234:    6(float) ConvertUToF 233
+                              Store 235(param) 234
+             237:   29(float) Load 173(f)
+                              Store 236(param) 237
+             238:           2 FunctionCall 34(foo1(d1;f1;) 235(param) 236(param)
+             239:     22(int) Load 167(i)
+             240:    6(float) ConvertSToF 239
+                              Store 241(param) 240
+             243:     8(bool) Load 150(b)
+                              Store 242(param) 243
+             244:           2 FunctionCall 13(foo1(d1;b1;) 241(param) 242(param)
+             245:     22(int) Load 167(i)
+             246:    6(float) ConvertSToF 245
+                              Store 247(param) 246
+             249:    6(float) Load 149(d)
+                              Store 248(param) 249
+             250:           2 FunctionCall 39(foo1(d1;d1;) 247(param) 248(param)
+             251:     22(int) Load 167(i)
+             252:    6(float) ConvertSToF 251
+                              Store 253(param) 252
+             255:     15(int) Load 161(u)
+                              Store 254(param) 255
+             256:           2 FunctionCall 20(foo1(d1;u1;) 253(param) 254(param)
+             257:     22(int) Load 167(i)
+             258:    6(float) ConvertSToF 257
+                              Store 259(param) 258
+             261:     22(int) Load 167(i)
+                              Store 260(param) 261
+             262:           2 FunctionCall 27(foo1(d1;i1;) 259(param) 260(param)
+             263:     22(int) Load 167(i)
+             264:    6(float) ConvertSToF 263
+                              Store 265(param) 264
+             267:   29(float) Load 173(f)
+                              Store 266(param) 267
+             268:           2 FunctionCall 34(foo1(d1;f1;) 265(param) 266(param)
+             269:     15(int) Load 161(u)
+             270:     22(int) Bitcast 269
+                              Store 271(param) 270
+             273:     8(bool) Load 150(b)
+                              Store 272(param) 273
+             274:           2 FunctionCall 44(foo2(i1;b1;) 271(param) 272(param)
+             275:     15(int) Load 161(u)
+             276:     22(int) Bitcast 275
+                              Store 277(param) 276
+             279:    6(float) Load 149(d)
+                              Store 278(param) 279
+             280:           2 FunctionCall 64(foo2(i1;d1;) 277(param) 278(param)
+             281:     15(int) Load 161(u)
+             282:     22(int) Bitcast 281
+                              Store 283(param) 282
+             285:     15(int) Load 161(u)
+                              Store 284(param) 285
+             286:           2 FunctionCall 49(foo2(i1;u1;) 283(param) 284(param)
+             287:     15(int) Load 161(u)
+             288:     22(int) Bitcast 287
+                              Store 289(param) 288
+             291:     22(int) Load 167(i)
+                              Store 290(param) 291
+             292:           2 FunctionCall 54(foo2(i1;i1;) 289(param) 290(param)
+             293:     15(int) Load 161(u)
+             294:     22(int) Bitcast 293
+                              Store 295(param) 294
+             297:   29(float) Load 173(f)
+                              Store 296(param) 297
+             298:           2 FunctionCall 59(foo2(i1;f1;) 295(param) 296(param)
+             300:     22(int) Load 167(i)
+                              Store 299(param) 300
+             302:     8(bool) Load 150(b)
+                              Store 301(param) 302
+             303:           2 FunctionCall 44(foo2(i1;b1;) 299(param) 301(param)
+             305:     22(int) Load 167(i)
+                              Store 304(param) 305
+             307:    6(float) Load 149(d)
+                              Store 306(param) 307
+             308:           2 FunctionCall 64(foo2(i1;d1;) 304(param) 306(param)
+             310:     22(int) Load 167(i)
+                              Store 309(param) 310
+             312:     15(int) Load 161(u)
+                              Store 311(param) 312
+             313:           2 FunctionCall 49(foo2(i1;u1;) 309(param) 311(param)
+             315:     22(int) Load 167(i)
+                              Store 314(param) 315
+             317:     22(int) Load 167(i)
+                              Store 316(param) 317
+             318:           2 FunctionCall 54(foo2(i1;i1;) 314(param) 316(param)
+             320:     22(int) Load 167(i)
+                              Store 319(param) 320
+             322:   29(float) Load 173(f)
+                              Store 321(param) 322
+             323:           2 FunctionCall 59(foo2(i1;f1;) 319(param) 321(param)
+             325:     8(bool) Load 150(b)
+                              Store 324(param) 325
+             326:           2 FunctionCall 68(foo3(b1;) 324(param)
+             327:    6(float) Load 149(d)
+             329:     8(bool) FOrdNotEqual 327 328
+                              Store 330(param) 329
+             331:           2 FunctionCall 68(foo3(b1;) 330(param)
+             332:     15(int) Load 161(u)
+             334:     8(bool) INotEqual 332 333
+                              Store 335(param) 334
+             336:           2 FunctionCall 68(foo3(b1;) 335(param)
+             337:     22(int) Load 167(i)
+             338:     8(bool) INotEqual 337 333
+                              Store 339(param) 338
+             340:           2 FunctionCall 68(foo3(b1;) 339(param)
+             341:   29(float) Load 173(f)
+             343:     8(bool) FOrdNotEqual 341 342
+                              Store 344(param) 343
+             345:           2 FunctionCall 68(foo3(b1;) 344(param)
+             346:     8(bool) Load 150(b)
+             348:     15(int) Select 346 347 333
+                              Store 349(param) 348
+             350:           2 FunctionCall 72(foo4(u1;) 349(param)
+             351:    6(float) Load 149(d)
+             352:     15(int) ConvertFToU 351
+                              Store 353(param) 352
+             354:           2 FunctionCall 72(foo4(u1;) 353(param)
+             356:     15(int) Load 161(u)
+                              Store 355(param) 356
+             357:           2 FunctionCall 72(foo4(u1;) 355(param)
+             358:     22(int) Load 167(i)
+             359:     15(int) Bitcast 358
+                              Store 360(param) 359
+             361:           2 FunctionCall 72(foo4(u1;) 360(param)
+             362:   29(float) Load 173(f)
+             363:     15(int) ConvertFToU 362
+                              Store 364(param) 363
+             365:           2 FunctionCall 72(foo4(u1;) 364(param)
+             366:     8(bool) Load 150(b)
+             369:     22(int) Select 366 368 367
+                              Store 370(param) 369
+             371:           2 FunctionCall 76(foo5(i1;) 370(param)
+             372:    6(float) Load 149(d)
+             373:     22(int) ConvertFToS 372
+                              Store 374(param) 373
+             375:           2 FunctionCall 76(foo5(i1;) 374(param)
+             376:     15(int) Load 161(u)
+             377:     22(int) Bitcast 376
+                              Store 378(param) 377
+             379:           2 FunctionCall 76(foo5(i1;) 378(param)
+             381:     22(int) Load 167(i)
+                              Store 380(param) 381
+             382:           2 FunctionCall 76(foo5(i1;) 380(param)
+             383:   29(float) Load 173(f)
+             384:     22(int) ConvertFToS 383
+                              Store 385(param) 384
+             386:           2 FunctionCall 76(foo5(i1;) 385(param)
+             387:     8(bool) Load 150(b)
+             389:   29(float) Select 387 388 342
+                              Store 390(param) 389
+             391:           2 FunctionCall 80(foo6(f1;) 390(param)
+             392:    6(float) Load 149(d)
+             393:   29(float) FConvert 392
+                              Store 394(param) 393
+             395:           2 FunctionCall 80(foo6(f1;) 394(param)
+             396:     15(int) Load 161(u)
+             397:   29(float) ConvertUToF 396
+                              Store 398(param) 397
+             399:           2 FunctionCall 80(foo6(f1;) 398(param)
+             400:     22(int) Load 167(i)
+             401:   29(float) ConvertSToF 400
+                              Store 402(param) 401
+             403:           2 FunctionCall 80(foo6(f1;) 402(param)
+             405:   29(float) Load 173(f)
+                              Store 404(param) 405
+             406:           2 FunctionCall 80(foo6(f1;) 404(param)
+             407:     8(bool) Load 150(b)
+             409:    6(float) Select 407 408 328
+                              Store 410(param) 409
+             411:           2 FunctionCall 84(foo7(d1;) 410(param)
+             413:    6(float) Load 149(d)
+                              Store 412(param) 413
+             414:           2 FunctionCall 84(foo7(d1;) 412(param)
+             415:     15(int) Load 161(u)
+             416:    6(float) ConvertUToF 415
+                              Store 417(param) 416
+             418:           2 FunctionCall 84(foo7(d1;) 417(param)
+             419:     22(int) Load 167(i)
+             420:    6(float) ConvertSToF 419
+                              Store 421(param) 420
+             422:           2 FunctionCall 84(foo7(d1;) 421(param)
+             423:   29(float) Load 173(f)
+             424:    6(float) FConvert 423
+                              Store 425(param) 424
+             426:           2 FunctionCall 84(foo7(d1;) 425(param)
+             427:     8(bool) Load 150(b)
+             428:   29(float) Select 427 388 342
+                              Store 429(param) 428
+             430:           2 FunctionCall 87(foo8(f1;) 429(param)
+             431:     15(int) Load 161(u)
+             432:   29(float) ConvertUToF 431
+                              Store 433(param) 432
+             434:           2 FunctionCall 87(foo8(f1;) 433(param)
+             435:     22(int) Load 167(i)
+             436:   29(float) ConvertSToF 435
+                              Store 437(param) 436
+             438:           2 FunctionCall 87(foo8(f1;) 437(param)
+             439:     8(bool) Load 150(b)
+             440:     22(int) Select 439 368 367
+                              Store 441(param) 440
+             442:           2 FunctionCall 93(foo9(i1;) 441(param)
+             443:   29(float) Load 173(f)
+             444:     15(int) ConvertFToU 443
+                              Store 445(param) 444
+             446:           2 FunctionCall 96(foo9(u1;) 445(param)
+             447:    6(float) Load 149(d)
+             448:     15(int) ConvertFToU 447
+                              Store 449(param) 448
+             450:           2 FunctionCall 96(foo9(u1;) 449(param)
+             451:     15(int) Load 161(u)
+             452:     22(int) Bitcast 451
+                              Store 453(param) 452
+             454:           2 FunctionCall 102(foo10(i1;) 453(param)
+             455:   29(float) Load 173(f)
+             456:     22(int) ConvertFToS 455
+                              Store 457(param) 456
+             458:           2 FunctionCall 102(foo10(i1;) 457(param)
+             459:    6(float) Load 149(d)
+             460:     22(int) ConvertFToS 459
+                              Store 461(param) 460
+             462:           2 FunctionCall 102(foo10(i1;) 461(param)
+             463:     8(bool) Load 150(b)
+             464:     15(int) Select 463 347 333
+                              Store 465(param) 464
+             466:           2 FunctionCall 120(foo11(u1;) 465(param)
+             467:   29(float) Load 173(f)
+             468:    6(float) FConvert 467
+                              Store 469(param) 468
+             470:           2 FunctionCall 111(foo11(d1;) 469(param)
+             471:   29(float) Load 173(f)
+             472:  104(fvec3) CompositeConstruct 471 471 471
+             473:  125(fvec3) FConvert 472
+                              Store 474(param) 473
+             475:           2 FunctionCall 129(foo12(vd3;) 474(param)
+             476:     22(int) Load 167(i)
+             477:     22(int) Load 167(i)
+             479:  478(ivec2) CompositeConstruct 476 477
+             480:  134(ivec2) Bitcast 479
+                              Store 481(param) 480
+             482:           2 FunctionCall 138(foo16(vu2;) 481(param)
+             483:   29(float) Load 173(f)
+             484:  104(fvec3) CompositeConstruct 483 483 483
+                              Store 485(param) 484
+             486:           2 FunctionCall 141(foo13(vf3;) 485(param)
+             487:     22(int) Load 167(i)
+             489:  488(ivec4) CompositeConstruct 487 487 487 487
+             490:     22(int) CompositeExtract 489 0
+                              Store 491(param) 490
+             492:           2 FunctionCall 144(foo14(vi1;) 491(param)
+             493:     8(bool) Load 150(b)
+                              Store 494(param) 493
+             495:           2 FunctionCall 147(foo15(vb1;) 494(param)
+             496:     8(bool) Load 150(b)
+             498:  497(bvec3) CompositeConstruct 496 496 496
+             499:     8(bool) CompositeExtract 498 0
+                              Store 500(param) 499
+             501:           2 FunctionCall 147(foo15(vb1;) 500(param)
+             507:  502(fvec4) Load 506(input)
+                              Store 504(@entryPointOutput) 507
+                              Return
+                              FunctionEnd
+ 13(foo1(d1;b1;):           2 Function None 10
+           11(a):      7(ptr) FunctionParameter
+           12(b):      9(ptr) FunctionParameter
+              14:             Label
+                              Return
+                              FunctionEnd
+ 20(foo1(d1;u1;):           2 Function None 17
+           18(a):      7(ptr) FunctionParameter
+           19(b):     16(ptr) FunctionParameter
+              21:             Label
+                              Return
+                              FunctionEnd
+ 27(foo1(d1;i1;):           2 Function None 24
+           25(a):      7(ptr) FunctionParameter
+           26(b):     23(ptr) FunctionParameter
+              28:             Label
+                              Return
+                              FunctionEnd
+ 34(foo1(d1;f1;):           2 Function None 31
+           32(a):      7(ptr) FunctionParameter
+           33(b):     30(ptr) FunctionParameter
+              35:             Label
+                              Return
+                              FunctionEnd
+ 39(foo1(d1;d1;):           2 Function None 36
+           37(a):      7(ptr) FunctionParameter
+           38(b):      7(ptr) FunctionParameter
+              40:             Label
+                              Return
+                              FunctionEnd
+ 44(foo2(i1;b1;):           2 Function None 41
+           42(a):     23(ptr) FunctionParameter
+           43(b):      9(ptr) FunctionParameter
+              45:             Label
+                              Return
+                              FunctionEnd
+ 49(foo2(i1;u1;):           2 Function None 46
+           47(a):     23(ptr) FunctionParameter
+           48(b):     16(ptr) FunctionParameter
+              50:             Label
+                              Return
+                              FunctionEnd
+ 54(foo2(i1;i1;):           2 Function None 51
+           52(a):     23(ptr) FunctionParameter
+           53(b):     23(ptr) FunctionParameter
+              55:             Label
+                              Return
+                              FunctionEnd
+ 59(foo2(i1;f1;):           2 Function None 56
+           57(a):     23(ptr) FunctionParameter
+           58(b):     30(ptr) FunctionParameter
+              60:             Label
+                              Return
+                              FunctionEnd
+ 64(foo2(i1;d1;):           2 Function None 61
+           62(a):     23(ptr) FunctionParameter
+           63(b):      7(ptr) FunctionParameter
+              65:             Label
+                              Return
+                              FunctionEnd
+    68(foo3(b1;):           2 Function None 66
+           67(b):      9(ptr) FunctionParameter
+              69:             Label
+                              Return
+                              FunctionEnd
+    72(foo4(u1;):           2 Function None 70
+           71(b):     16(ptr) FunctionParameter
+              73:             Label
+                              Return
+                              FunctionEnd
+    76(foo5(i1;):           2 Function None 74
+           75(b):     23(ptr) FunctionParameter
+              77:             Label
+                              Return
+                              FunctionEnd
+    80(foo6(f1;):           2 Function None 78
+           79(b):     30(ptr) FunctionParameter
+              81:             Label
+                              Return
+                              FunctionEnd
+    84(foo7(d1;):           2 Function None 82
+           83(b):      7(ptr) FunctionParameter
+              85:             Label
+                              Return
+                              FunctionEnd
+    87(foo8(f1;):           2 Function None 78
+              86:     30(ptr) FunctionParameter
+              88:             Label
+                              Return
+                              FunctionEnd
+    90(foo8(d1;):           2 Function None 82
+              89:      7(ptr) FunctionParameter
+              91:             Label
+                              Return
+                              FunctionEnd
+    93(foo9(i1;):           2 Function None 74
+              92:     23(ptr) FunctionParameter
+              94:             Label
+                              Return
+                              FunctionEnd
+    96(foo9(u1;):           2 Function None 70
+              95:     16(ptr) FunctionParameter
+              97:             Label
+                              Return
+                              FunctionEnd
+   99(foo10(b1;):           2 Function None 66
+              98:      9(ptr) FunctionParameter
+             100:             Label
+                              Return
+                              FunctionEnd
+  102(foo10(i1;):           2 Function None 74
+             101:     23(ptr) FunctionParameter
+             103:             Label
+                              Return
+                              FunctionEnd
+ 108(foo11(vf3;):           2 Function None 106
+             107:    105(ptr) FunctionParameter
+             109:             Label
+                              Return
+                              FunctionEnd
+  111(foo11(d1;):           2 Function None 82
+             110:      7(ptr) FunctionParameter
+             112:             Label
+                              Return
+                              FunctionEnd
+ 117(foo11(vi3;):           2 Function None 115
+             116:    114(ptr) FunctionParameter
+             118:             Label
+                              Return
+                              FunctionEnd
+  120(foo11(u1;):           2 Function None 70
+             119:     16(ptr) FunctionParameter
+             121:             Label
+                              Return
+                              FunctionEnd
+ 123(foo12(vf1;):           2 Function None 78
+             122:     30(ptr) FunctionParameter
+             124:             Label
+                              Return
+                              FunctionEnd
+ 129(foo12(vd3;):           2 Function None 127
+             128:    126(ptr) FunctionParameter
+             130:             Label
+                              Return
+                              FunctionEnd
+  132(foo16(u1;):           2 Function None 70
+             131:     16(ptr) FunctionParameter
+             133:             Label
+                              Return
+                              FunctionEnd
+ 138(foo16(vu2;):           2 Function None 136
+             137:    135(ptr) FunctionParameter
+             139:             Label
+                              Return
+                              FunctionEnd
+ 141(foo13(vf3;):           2 Function None 106
+             140:    105(ptr) FunctionParameter
+             142:             Label
+                              Return
+                              FunctionEnd
+ 144(foo14(vi1;):           2 Function None 74
+             143:     23(ptr) FunctionParameter
+             145:             Label
+                              Return
+                              FunctionEnd
+ 147(foo15(vb1;):           2 Function None 66
+             146:      9(ptr) FunctionParameter
+             148:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.pp.line.frag.out b/Test/baseResults/hlsl.pp.line.frag.out
index 6484eb0..95a2f25 100644
--- a/Test/baseResults/hlsl.pp.line.frag.out
+++ b/Test/baseResults/hlsl.pp.line.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:131  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:4  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:4    Function Parameters: 
 0:?     Sequence
 0:124      Sequence
@@ -12,7 +12,7 @@
 0:124            124 (const int)
 0:126      move second child to first child (temp 4-component vector of float)
 0:126        Color: direct index for structure (temp 4-component vector of float)
-0:126          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:126          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:126          Constant:
 0:126            0 (const int)
 0:?         Construct vec4 (temp 4-component vector of float)
@@ -25,15 +25,30 @@
 0:126          Constant:
 0:126            1.000000
 0:127      move second child to first child (temp float)
-0:127        Depth: direct index for structure (temp float FragDepth)
-0:127          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:127        Depth: direct index for structure (temp float)
+0:127          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:127          Constant:
 0:127            1 (const int)
 0:127        Constant:
 0:127          1.000000
-0:129      Branch: Return with expression
-0:129        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:129          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:129            Color: direct index for structure (temp 4-component vector of float)
+0:129              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:129              Constant:
+0:129                0 (const int)
+0:129          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:129            Depth: direct index for structure (temp float)
+0:129              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:129              Constant:
+0:129                1 (const int)
+0:129        Branch: Return
 0:?   Linker Objects
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -42,7 +57,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:131  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:4  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:4    Function Parameters: 
 0:?     Sequence
 0:124      Sequence
@@ -52,7 +67,7 @@
 0:124            124 (const int)
 0:126      move second child to first child (temp 4-component vector of float)
 0:126        Color: direct index for structure (temp 4-component vector of float)
-0:126          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:126          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:126          Constant:
 0:126            0 (const int)
 0:?         Construct vec4 (temp 4-component vector of float)
@@ -65,33 +80,50 @@
 0:126          Constant:
 0:126            1.000000
 0:127      move second child to first child (temp float)
-0:127        Depth: direct index for structure (temp float FragDepth)
-0:127          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:127        Depth: direct index for structure (temp float)
+0:127          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:127          Constant:
 0:127            1 (const int)
 0:127        Constant:
 0:127          1.000000
-0:129      Branch: Return with expression
-0:129        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:129          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:129            Color: direct index for structure (temp 4-component vector of float)
+0:129              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:129              Constant:
+0:129                0 (const int)
+0:129          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:129            Depth: direct index for structure (temp float)
+0:129              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:129              Constant:
+0:129                1 (const int)
+0:129        Branch: Return
 0:?   Linker Objects
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 28
+// Id's are bound by 35
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 27 31
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "thisLineIs"
                               Name 12  "PS_OUTPUT"
                               MemberName 12(PS_OUTPUT) 0  "Color"
                               MemberName 12(PS_OUTPUT) 1  "Depth"
                               Name 14  "psout"
-                              MemberDecorate 12(PS_OUTPUT) 1 BuiltIn FragDepth
+                              Name 27  "Color"
+                              Name 31  "Depth"
+                              Decorate 27(Color) Location 0
+                              Decorate 31(Depth) BuiltIn FragDepth
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -107,6 +139,10 @@
               21:             TypePointer Function 11(fvec4)
               23:      6(int) Constant 1
               24:             TypePointer Function 10(float)
+              26:             TypePointer Output 11(fvec4)
+       27(Color):     26(ptr) Variable Output
+              30:             TypePointer Output 10(float)
+       31(Depth):     30(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
    8(thisLineIs):      7(ptr) Variable Function
@@ -119,6 +155,11 @@
                               Store 22 20
               25:     24(ptr) AccessChain 14(psout) 23
                               Store 25 19
-              26:12(PS_OUTPUT) Load 14(psout)
-                              ReturnValue 26
+              28:     21(ptr) AccessChain 14(psout) 15
+              29:   11(fvec4) Load 28
+                              Store 27(Color) 29
+              32:     24(ptr) AccessChain 14(psout) 23
+              33:   10(float) Load 32
+                              Store 31(Depth) 33
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.precedence.frag.out b/Test/baseResults/hlsl.precedence.frag.out
index 2ad5ab5..e633847 100755
--- a/Test/baseResults/hlsl.precedence.frag.out
+++ b/Test/baseResults/hlsl.precedence.frag.out
@@ -2,47 +2,55 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:10  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4; (global 4-component vector of float)
+0:7  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4; (global 4-component vector of float)
 0:7    Function Parameters: 
-0:7      'a1' (in 4-component vector of float)
-0:7      'a2' (in 4-component vector of float)
-0:7      'a3' (in 4-component vector of float)
-0:7      'a4' (in 4-component vector of float)
+0:7      'a1' (layout(location=0 ) in 4-component vector of float)
+0:7      'a2' (layout(location=1 ) in 4-component vector of float)
+0:7      'a3' (layout(location=2 ) in 4-component vector of float)
+0:7      'a4' (layout(location=3 ) in 4-component vector of float)
 0:?     Sequence
-0:8      Branch: Return with expression
-0:8        add (temp 4-component vector of float)
+0:8      Sequence
+0:8        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:8          add (temp 4-component vector of float)
 0:8            add (temp 4-component vector of float)
-0:8              'a1' (in 4-component vector of float)
-0:8              component-wise multiply (temp 4-component vector of float)
-0:8                'a2' (in 4-component vector of float)
-0:8                'a3' (in 4-component vector of float)
-0:8            'a4' (in 4-component vector of float)
-0:?           Construct vec4 (temp 4-component vector of float)
-0:8            component-wise multiply (temp 3-component vector of float)
-0:8              vector swizzle (temp 3-component vector of float)
-0:8                'a1' (in 4-component vector of float)
-0:8                Sequence
-0:8                  Constant:
-0:8                    0 (const int)
-0:8                  Constant:
-0:8                    1 (const int)
-0:8                  Constant:
-0:8                    2 (const int)
-0:8              vector swizzle (temp 3-component vector of float)
-0:8                'a2' (in 4-component vector of float)
-0:8                Sequence
-0:8                  Constant:
-0:8                    0 (const int)
-0:8                  Constant:
-0:8                    1 (const int)
-0:8                  Constant:
-0:8                    2 (const int)
-0:8            direct index (temp float)
-0:8              'a3' (in 4-component vector of float)
-0:8              Constant:
-0:8                3 (const int)
+0:8              add (temp 4-component vector of float)
+0:8                'a1' (layout(location=0 ) in 4-component vector of float)
+0:8                component-wise multiply (temp 4-component vector of float)
+0:8                  'a2' (layout(location=1 ) in 4-component vector of float)
+0:8                  'a3' (layout(location=2 ) in 4-component vector of float)
+0:8              'a4' (layout(location=3 ) in 4-component vector of float)
+0:?             Construct vec4 (temp 4-component vector of float)
+0:8              component-wise multiply (temp 3-component vector of float)
+0:8                vector swizzle (temp 3-component vector of float)
+0:8                  'a1' (layout(location=0 ) in 4-component vector of float)
+0:8                  Sequence
+0:8                    Constant:
+0:8                      0 (const int)
+0:8                    Constant:
+0:8                      1 (const int)
+0:8                    Constant:
+0:8                      2 (const int)
+0:8                vector swizzle (temp 3-component vector of float)
+0:8                  'a2' (layout(location=1 ) in 4-component vector of float)
+0:8                  Sequence
+0:8                    Constant:
+0:8                      0 (const int)
+0:8                    Constant:
+0:8                      1 (const int)
+0:8                    Constant:
+0:8                      2 (const int)
+0:8              direct index (temp float)
+0:8                'a3' (layout(location=2 ) in 4-component vector of float)
+0:8                Constant:
+0:8                  3 (const int)
+0:8        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'a1' (layout(location=0 ) in 4-component vector of float)
+0:?     'a2' (layout(location=1 ) in 4-component vector of float)
+0:?     'a3' (layout(location=2 ) in 4-component vector of float)
+0:?     'a4' (layout(location=3 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -51,96 +59,112 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:10  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4; (global 4-component vector of float)
+0:7  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vf4; (global 4-component vector of float)
 0:7    Function Parameters: 
-0:7      'a1' (in 4-component vector of float)
-0:7      'a2' (in 4-component vector of float)
-0:7      'a3' (in 4-component vector of float)
-0:7      'a4' (in 4-component vector of float)
+0:7      'a1' (layout(location=0 ) in 4-component vector of float)
+0:7      'a2' (layout(location=1 ) in 4-component vector of float)
+0:7      'a3' (layout(location=2 ) in 4-component vector of float)
+0:7      'a4' (layout(location=3 ) in 4-component vector of float)
 0:?     Sequence
-0:8      Branch: Return with expression
-0:8        add (temp 4-component vector of float)
+0:8      Sequence
+0:8        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:8          add (temp 4-component vector of float)
 0:8            add (temp 4-component vector of float)
-0:8              'a1' (in 4-component vector of float)
-0:8              component-wise multiply (temp 4-component vector of float)
-0:8                'a2' (in 4-component vector of float)
-0:8                'a3' (in 4-component vector of float)
-0:8            'a4' (in 4-component vector of float)
-0:?           Construct vec4 (temp 4-component vector of float)
-0:8            component-wise multiply (temp 3-component vector of float)
-0:8              vector swizzle (temp 3-component vector of float)
-0:8                'a1' (in 4-component vector of float)
-0:8                Sequence
-0:8                  Constant:
-0:8                    0 (const int)
-0:8                  Constant:
-0:8                    1 (const int)
-0:8                  Constant:
-0:8                    2 (const int)
-0:8              vector swizzle (temp 3-component vector of float)
-0:8                'a2' (in 4-component vector of float)
-0:8                Sequence
-0:8                  Constant:
-0:8                    0 (const int)
-0:8                  Constant:
-0:8                    1 (const int)
-0:8                  Constant:
-0:8                    2 (const int)
-0:8            direct index (temp float)
-0:8              'a3' (in 4-component vector of float)
-0:8              Constant:
-0:8                3 (const int)
+0:8              add (temp 4-component vector of float)
+0:8                'a1' (layout(location=0 ) in 4-component vector of float)
+0:8                component-wise multiply (temp 4-component vector of float)
+0:8                  'a2' (layout(location=1 ) in 4-component vector of float)
+0:8                  'a3' (layout(location=2 ) in 4-component vector of float)
+0:8              'a4' (layout(location=3 ) in 4-component vector of float)
+0:?             Construct vec4 (temp 4-component vector of float)
+0:8              component-wise multiply (temp 3-component vector of float)
+0:8                vector swizzle (temp 3-component vector of float)
+0:8                  'a1' (layout(location=0 ) in 4-component vector of float)
+0:8                  Sequence
+0:8                    Constant:
+0:8                      0 (const int)
+0:8                    Constant:
+0:8                      1 (const int)
+0:8                    Constant:
+0:8                      2 (const int)
+0:8                vector swizzle (temp 3-component vector of float)
+0:8                  'a2' (layout(location=1 ) in 4-component vector of float)
+0:8                  Sequence
+0:8                    Constant:
+0:8                      0 (const int)
+0:8                    Constant:
+0:8                      1 (const int)
+0:8                    Constant:
+0:8                      2 (const int)
+0:8              direct index (temp float)
+0:8                'a3' (layout(location=2 ) in 4-component vector of float)
+0:8                Constant:
+0:8                  3 (const int)
+0:8        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'a1' (layout(location=0 ) in 4-component vector of float)
+0:?     'a2' (layout(location=1 ) in 4-component vector of float)
+0:?     'a3' (layout(location=2 ) in 4-component vector of float)
+0:?     'a4' (layout(location=3 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 37
+// Id's are bound by 39
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11 13 17
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11 13 15 19
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 9  "a1"
-                              Name 11  "a2"
-                              Name 13  "a3"
-                              Name 17  "a4"
+                              Name 9  "@entryPointOutput"
+                              Name 11  "a1"
+                              Name 13  "a2"
+                              Name 15  "a3"
+                              Name 19  "a4"
+                              Decorate 9(@entryPointOutput) Location 0
+                              Decorate 11(a1) Location 0
+                              Decorate 13(a2) Location 1
+                              Decorate 15(a3) Location 2
+                              Decorate 19(a4) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypePointer Input 7(fvec4)
-           9(a1):      8(ptr) Variable Input
-          11(a2):      8(ptr) Variable Input
-          13(a3):      8(ptr) Variable Input
-          17(a4):      8(ptr) Variable Input
-              20:             TypeVector 6(float) 3
-              26:             TypeInt 32 0
-              27:     26(int) Constant 3
-              28:             TypePointer Input 6(float)
+               8:             TypePointer Output 7(fvec4)
+9(@entryPointOutput):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+          11(a1):     10(ptr) Variable Input
+          13(a2):     10(ptr) Variable Input
+          15(a3):     10(ptr) Variable Input
+          19(a4):     10(ptr) Variable Input
+              22:             TypeVector 6(float) 3
+              28:             TypeInt 32 0
+              29:     28(int) Constant 3
+              30:             TypePointer Input 6(float)
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-              10:    7(fvec4) Load 9(a1)
-              12:    7(fvec4) Load 11(a2)
-              14:    7(fvec4) Load 13(a3)
-              15:    7(fvec4) FMul 12 14
-              16:    7(fvec4) FAdd 10 15
-              18:    7(fvec4) Load 17(a4)
-              19:    7(fvec4) FAdd 16 18
-              21:    7(fvec4) Load 9(a1)
-              22:   20(fvec3) VectorShuffle 21 21 0 1 2
-              23:    7(fvec4) Load 11(a2)
-              24:   20(fvec3) VectorShuffle 23 23 0 1 2
-              25:   20(fvec3) FMul 22 24
-              29:     28(ptr) AccessChain 13(a3) 27
-              30:    6(float) Load 29
-              31:    6(float) CompositeExtract 25 0
-              32:    6(float) CompositeExtract 25 1
-              33:    6(float) CompositeExtract 25 2
-              34:    7(fvec4) CompositeConstruct 31 32 33 30
-              35:    7(fvec4) FAdd 19 34
-                              ReturnValue 35
+              12:    7(fvec4) Load 11(a1)
+              14:    7(fvec4) Load 13(a2)
+              16:    7(fvec4) Load 15(a3)
+              17:    7(fvec4) FMul 14 16
+              18:    7(fvec4) FAdd 12 17
+              20:    7(fvec4) Load 19(a4)
+              21:    7(fvec4) FAdd 18 20
+              23:    7(fvec4) Load 11(a1)
+              24:   22(fvec3) VectorShuffle 23 23 0 1 2
+              25:    7(fvec4) Load 13(a2)
+              26:   22(fvec3) VectorShuffle 25 25 0 1 2
+              27:   22(fvec3) FMul 24 26
+              31:     30(ptr) AccessChain 15(a3) 29
+              32:    6(float) Load 31
+              33:    6(float) CompositeExtract 27 0
+              34:    6(float) CompositeExtract 27 1
+              35:    6(float) CompositeExtract 27 2
+              36:    7(fvec4) CompositeConstruct 33 34 35 32
+              37:    7(fvec4) FAdd 21 36
+                              Store 9(@entryPointOutput) 37
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.precedence2.frag.out b/Test/baseResults/hlsl.precedence2.frag.out
index bfe2643..7021837 100755
--- a/Test/baseResults/hlsl.precedence2.frag.out
+++ b/Test/baseResults/hlsl.precedence2.frag.out
@@ -2,30 +2,38 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:10  Function Definition: PixelShaderFunction(i1;i1;i1;i1; (global int)
+0:7  Function Definition: PixelShaderFunction(i1;i1;i1;i1; (global int)
 0:7    Function Parameters: 
-0:7      'a1' (in int)
-0:7      'a2' (in int)
-0:7      'a3' (in int)
-0:7      'a4' (in int)
+0:7      'a1' (layout(location=0 ) in int)
+0:7      'a2' (layout(location=1 ) in int)
+0:7      'a3' (layout(location=2 ) in int)
+0:7      'a4' (layout(location=3 ) in int)
 0:?     Sequence
-0:8      Branch: Return with expression
-0:8        add (temp int)
-0:8          left-shift (temp int)
-0:8            add (temp int)
-0:8              component-wise multiply (temp int)
-0:8                'a1' (in int)
-0:8                'a2' (in int)
-0:8              'a3' (in int)
-0:8            'a4' (in int)
-0:8          left-shift (temp int)
-0:8            'a1' (in int)
-0:8            add (temp int)
-0:8              'a2' (in int)
-0:8              component-wise multiply (temp int)
-0:8                'a3' (in int)
-0:8                'a4' (in int)
+0:8      Sequence
+0:8        move second child to first child (temp int)
+0:?           '@entryPointOutput' (layout(location=0 ) out int)
+0:8          add (temp int)
+0:8            left-shift (temp int)
+0:8              add (temp int)
+0:8                component-wise multiply (temp int)
+0:8                  'a1' (layout(location=0 ) in int)
+0:8                  'a2' (layout(location=1 ) in int)
+0:8                'a3' (layout(location=2 ) in int)
+0:8              'a4' (layout(location=3 ) in int)
+0:8            left-shift (temp int)
+0:8              'a1' (layout(location=0 ) in int)
+0:8              add (temp int)
+0:8                'a2' (layout(location=1 ) in int)
+0:8                component-wise multiply (temp int)
+0:8                  'a3' (layout(location=2 ) in int)
+0:8                  'a4' (layout(location=3 ) in int)
+0:8        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out int)
+0:?     'a1' (layout(location=0 ) in int)
+0:?     'a2' (layout(location=1 ) in int)
+0:?     'a3' (layout(location=2 ) in int)
+0:?     'a4' (layout(location=3 ) in int)
 
 
 Linked fragment stage:
@@ -34,70 +42,86 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:10  Function Definition: PixelShaderFunction(i1;i1;i1;i1; (global int)
+0:7  Function Definition: PixelShaderFunction(i1;i1;i1;i1; (global int)
 0:7    Function Parameters: 
-0:7      'a1' (in int)
-0:7      'a2' (in int)
-0:7      'a3' (in int)
-0:7      'a4' (in int)
+0:7      'a1' (layout(location=0 ) in int)
+0:7      'a2' (layout(location=1 ) in int)
+0:7      'a3' (layout(location=2 ) in int)
+0:7      'a4' (layout(location=3 ) in int)
 0:?     Sequence
-0:8      Branch: Return with expression
-0:8        add (temp int)
-0:8          left-shift (temp int)
-0:8            add (temp int)
-0:8              component-wise multiply (temp int)
-0:8                'a1' (in int)
-0:8                'a2' (in int)
-0:8              'a3' (in int)
-0:8            'a4' (in int)
-0:8          left-shift (temp int)
-0:8            'a1' (in int)
-0:8            add (temp int)
-0:8              'a2' (in int)
-0:8              component-wise multiply (temp int)
-0:8                'a3' (in int)
-0:8                'a4' (in int)
+0:8      Sequence
+0:8        move second child to first child (temp int)
+0:?           '@entryPointOutput' (layout(location=0 ) out int)
+0:8          add (temp int)
+0:8            left-shift (temp int)
+0:8              add (temp int)
+0:8                component-wise multiply (temp int)
+0:8                  'a1' (layout(location=0 ) in int)
+0:8                  'a2' (layout(location=1 ) in int)
+0:8                'a3' (layout(location=2 ) in int)
+0:8              'a4' (layout(location=3 ) in int)
+0:8            left-shift (temp int)
+0:8              'a1' (layout(location=0 ) in int)
+0:8              add (temp int)
+0:8                'a2' (layout(location=1 ) in int)
+0:8                component-wise multiply (temp int)
+0:8                  'a3' (layout(location=2 ) in int)
+0:8                  'a4' (layout(location=3 ) in int)
+0:8        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out int)
+0:?     'a1' (layout(location=0 ) in int)
+0:?     'a2' (layout(location=1 ) in int)
+0:?     'a3' (layout(location=2 ) in int)
+0:?     'a4' (layout(location=3 ) in int)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 28
+// Id's are bound by 30
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 8 10 13 16
+                              EntryPoint Fragment 4  "PixelShaderFunction" 8 10 12 15 18
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 8  "a1"
-                              Name 10  "a2"
-                              Name 13  "a3"
-                              Name 16  "a4"
+                              Name 8  "@entryPointOutput"
+                              Name 10  "a1"
+                              Name 12  "a2"
+                              Name 15  "a3"
+                              Name 18  "a4"
+                              Decorate 8(@entryPointOutput) Location 0
+                              Decorate 10(a1) Location 0
+                              Decorate 12(a2) Location 1
+                              Decorate 15(a3) Location 2
+                              Decorate 18(a4) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
-               7:             TypePointer Input 6(int)
-           8(a1):      7(ptr) Variable Input
-          10(a2):      7(ptr) Variable Input
-          13(a3):      7(ptr) Variable Input
-          16(a4):      7(ptr) Variable Input
+               7:             TypePointer Output 6(int)
+8(@entryPointOutput):      7(ptr) Variable Output
+               9:             TypePointer Input 6(int)
+          10(a1):      9(ptr) Variable Input
+          12(a2):      9(ptr) Variable Input
+          15(a3):      9(ptr) Variable Input
+          18(a4):      9(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-               9:      6(int) Load 8(a1)
-              11:      6(int) Load 10(a2)
-              12:      6(int) IMul 9 11
-              14:      6(int) Load 13(a3)
-              15:      6(int) IAdd 12 14
-              17:      6(int) Load 16(a4)
-              18:      6(int) ShiftLeftLogical 15 17
-              19:      6(int) Load 8(a1)
-              20:      6(int) Load 10(a2)
-              21:      6(int) Load 13(a3)
-              22:      6(int) Load 16(a4)
-              23:      6(int) IMul 21 22
-              24:      6(int) IAdd 20 23
-              25:      6(int) ShiftLeftLogical 19 24
-              26:      6(int) IAdd 18 25
-                              ReturnValue 26
+              11:      6(int) Load 10(a1)
+              13:      6(int) Load 12(a2)
+              14:      6(int) IMul 11 13
+              16:      6(int) Load 15(a3)
+              17:      6(int) IAdd 14 16
+              19:      6(int) Load 18(a4)
+              20:      6(int) ShiftLeftLogical 17 19
+              21:      6(int) Load 10(a1)
+              22:      6(int) Load 12(a2)
+              23:      6(int) Load 15(a3)
+              24:      6(int) Load 18(a4)
+              25:      6(int) IMul 23 24
+              26:      6(int) IAdd 22 25
+              27:      6(int) ShiftLeftLogical 21 26
+              28:      6(int) IAdd 20 27
+                              Store 8(@entryPointOutput) 28
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.precise.frag.out b/Test/baseResults/hlsl.precise.frag.out
new file mode 100644
index 0000000..d76dc3f
--- /dev/null
+++ b/Test/baseResults/hlsl.precise.frag.out
@@ -0,0 +1,125 @@
+hlsl.precise.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: MyFunction(f1;vf3; (global void)
+0:6    Function Parameters: 
+0:6      'myfloat' (noContraction in float)
+0:6      'myfloat3' (noContraction out 3-component vector of float)
+0:9  Function Definition: main( (global structure{noContraction temp 4-component vector of float color})
+0:9    Function Parameters: 
+0:?     Sequence
+0:11      move second child to first child (noContraction temp 4-component vector of float)
+0:11        color: direct index for structure (noContraction temp 4-component vector of float)
+0:11          'ps_output' (temp structure{noContraction temp 4-component vector of float color})
+0:11          Constant:
+0:11            0 (const int)
+0:11        Constant:
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:?       Sequence
+0:?         Sequence
+0:12          move second child to first child (noContraction temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) noContraction out 4-component vector of float)
+0:12            color: direct index for structure (noContraction temp 4-component vector of float)
+0:12              'ps_output' (temp structure{noContraction temp 4-component vector of float color})
+0:12              Constant:
+0:12                0 (const int)
+0:12        Branch: Return
+0:?   Linker Objects
+0:?     'precisefloat' (noContraction global float)
+0:?     'color' (layout(location=0 ) noContraction out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: MyFunction(f1;vf3; (global void)
+0:6    Function Parameters: 
+0:6      'myfloat' (noContraction in float)
+0:6      'myfloat3' (noContraction out 3-component vector of float)
+0:9  Function Definition: main( (global structure{noContraction temp 4-component vector of float color})
+0:9    Function Parameters: 
+0:?     Sequence
+0:11      move second child to first child (noContraction temp 4-component vector of float)
+0:11        color: direct index for structure (noContraction temp 4-component vector of float)
+0:11          'ps_output' (temp structure{noContraction temp 4-component vector of float color})
+0:11          Constant:
+0:11            0 (const int)
+0:11        Constant:
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:11          1.000000
+0:?       Sequence
+0:?         Sequence
+0:12          move second child to first child (noContraction temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) noContraction out 4-component vector of float)
+0:12            color: direct index for structure (noContraction temp 4-component vector of float)
+0:12              'ps_output' (temp structure{noContraction temp 4-component vector of float color})
+0:12              Constant:
+0:12                0 (const int)
+0:12        Branch: Return
+0:?   Linker Objects
+0:?     'precisefloat' (noContraction global float)
+0:?     'color' (layout(location=0 ) noContraction out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 32
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 26
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 13  "MyFunction(f1;vf3;"
+                              Name 11  "myfloat"
+                              Name 12  "myfloat3"
+                              Name 16  "PS_OUTPUT"
+                              MemberName 16(PS_OUTPUT) 0  "color"
+                              Name 18  "ps_output"
+                              Name 26  "color"
+                              Name 31  "precisefloat"
+                              Decorate 26(color) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               8:             TypeVector 6(float) 3
+               9:             TypePointer Function 8(fvec3)
+              10:             TypeFunction 2 7(ptr) 9(ptr)
+              15:             TypeVector 6(float) 4
+   16(PS_OUTPUT):             TypeStruct 15(fvec4)
+              17:             TypePointer Function 16(PS_OUTPUT)
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              21:    6(float) Constant 1065353216
+              22:   15(fvec4) ConstantComposite 21 21 21 21
+              23:             TypePointer Function 15(fvec4)
+              25:             TypePointer Output 15(fvec4)
+       26(color):     25(ptr) Variable Output
+              30:             TypePointer Private 6(float)
+31(precisefloat):     30(ptr) Variable Private
+         4(main):           2 Function None 3
+               5:             Label
+   18(ps_output):     17(ptr) Variable Function
+              24:     23(ptr) AccessChain 18(ps_output) 20
+                              Store 24 22
+              27:     23(ptr) AccessChain 18(ps_output) 20
+              28:   15(fvec4) Load 27
+                              Store 26(color) 28
+                              Return
+                              FunctionEnd
+13(MyFunction(f1;vf3;):           2 Function None 10
+     11(myfloat):      7(ptr) FunctionParameter
+    12(myfloat3):      9(ptr) FunctionParameter
+              14:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.promotions.frag.out b/Test/baseResults/hlsl.promotions.frag.out
new file mode 100644
index 0000000..3f1c788
--- /dev/null
+++ b/Test/baseResults/hlsl.promotions.frag.out
@@ -0,0 +1,1709 @@
+hlsl.promotions.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:19  Function Definition: Fn_F3(vf3; (global void)
+0:19    Function Parameters: 
+0:19      'x' (in 3-component vector of float)
+0:20  Function Definition: Fn_I3(vi3; (global void)
+0:20    Function Parameters: 
+0:20      'x' (in 3-component vector of int)
+0:21  Function Definition: Fn_U3(vu3; (global void)
+0:21    Function Parameters: 
+0:21      'x' (in 3-component vector of uint)
+0:22  Function Definition: Fn_B3(vb3; (global void)
+0:22    Function Parameters: 
+0:22      'x' (in 3-component vector of bool)
+0:23  Function Definition: Fn_D3(vd3; (global void)
+0:23    Function Parameters: 
+0:23      'x' (in 3-component vector of double)
+0:26  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:27  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:28  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:29  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:31  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:32  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:33  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:34  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:36  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:37  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:38  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:39  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:41  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:42  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:43  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:44  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:46  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:47  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:48  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:49  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:52  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:?       Sequence
+0:?         Sequence
+0:200          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:200            Color: direct index for structure (temp 4-component vector of float)
+0:200              'psout' (temp structure{temp 4-component vector of float Color})
+0:200              Constant:
+0:200                0 (const int)
+0:200        Branch: Return
+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)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:19  Function Definition: Fn_F3(vf3; (global void)
+0:19    Function Parameters: 
+0:19      'x' (in 3-component vector of float)
+0:20  Function Definition: Fn_I3(vi3; (global void)
+0:20    Function Parameters: 
+0:20      'x' (in 3-component vector of int)
+0:21  Function Definition: Fn_U3(vu3; (global void)
+0:21    Function Parameters: 
+0:21      'x' (in 3-component vector of uint)
+0:22  Function Definition: Fn_B3(vb3; (global void)
+0:22    Function Parameters: 
+0:22      'x' (in 3-component vector of bool)
+0:23  Function Definition: Fn_D3(vd3; (global void)
+0:23    Function Parameters: 
+0:23      'x' (in 3-component vector of double)
+0:26  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:27  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:28  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:29  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:31  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:32  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:33  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:34  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:36  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:37  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:38  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:39  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:41  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:42  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:43  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:44  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:46  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:47  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:48  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:49  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:52  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:?       Sequence
+0:?         Sequence
+0:200          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:200            Color: direct index for structure (temp 4-component vector of float)
+0:200              'psout' (temp structure{temp 4-component vector of float Color})
+0:200              Constant:
+0:200                0 (const int)
+0:200        Branch: Return
+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)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 481
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 477
+                              ExecutionMode 4 OriginUpperLeft
+                              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"
+                              Name 477  "Color"
+                              Decorate 477(Color) Location 0
+               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)
+             476:             TypePointer Output 462(fvec4)
+      477(Color):    476(ptr) Variable 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
+             478:    463(ptr) AccessChain 473(psout) 149
+             479:  462(fvec4) Load 478
+                              Store 477(Color) 479
+                              Return
+                              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.reflection.vert.out b/Test/baseResults/hlsl.reflection.vert.out
new file mode 100644
index 0000000..b97de15
--- /dev/null
+++ b/Test/baseResults/hlsl.reflection.vert.out
@@ -0,0 +1,84 @@
+hlsl.reflection.vert
+
+Linked vertex stage:
+
+
+Uniform reflection:
+anonMember3: offset 96, type 8b52, size 1, index 0
+s.a: offset -1, type 1404, size 1, index -1
+scalar: offset 12, type 1404, size 1, index 0
+m23: offset 16, type 8b67, size 1, index 0
+scalarAfterm23: offset 64, type 1404, size 1, index 0
+c_m23: offset 16, type 8b67, size 1, index 0
+c_scalarAfterm23: offset 64, type 1404, size 1, index 0
+scalarBeforeArray: offset 112, type 1404, size 1, index 0
+floatArray: offset 128, type 1406, size 5, index 0
+scalarAfterArray: offset 208, type 1404, size 1, index 0
+memfloat2: offset 48, type 8b50, size 1, index 0
+memf1: offset 56, type 1406, size 1, index 0
+memf2: offset 60, type 8b56, size 1, index 0
+memf3: offset 64, type 1404, size 1, index 0
+memfloat2a: offset 72, type 8b50, size 1, index 0
+m22: offset 80, type 8b5a, size 7, index 0
+dm22: offset -1, type 8b5a, size 4, index -1
+foo.n1.a: offset 0, type 1406, size 1, index 0
+foo.n2.b: offset 16, type 1406, size 1, index 0
+foo.n2.c: offset 20, type 1406, size 1, index 0
+foo.n2.d: offset 24, type 1406, size 1, index 0
+deepA[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1
+deepA[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1
+deepB[1].d2.d1[0].va: offset -1, type 8b50, size 2, index -1
+deepB[1].d2.d1[1].va: offset -1, type 8b50, size 2, index -1
+deepB[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1
+deepB[1].d2.d1[3].va: offset -1, type 8b50, size 2, index -1
+deepB[0].d2.d1[0].va: offset -1, type 8b50, size 2, index -1
+deepB[0].d2.d1[1].va: offset -1, type 8b50, size 2, index -1
+deepB[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1
+deepB[0].d2.d1[3].va: offset -1, type 8b50, size 2, index -1
+deepC[1].iv4: offset -1, type 8b52, size 1, index -1
+deepC[1].d2.i: offset -1, type 1404, size 1, index -1
+deepC[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1
+deepC[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1
+deepC[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1
+deepC[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1
+deepC[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1
+deepC[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1
+deepC[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1
+deepC[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1
+deepC[1].v3: offset -1, type 8b54, size 1, index -1
+deepD[0].iv4: offset -1, type 8b52, size 1, index -1
+deepD[0].d2.i: offset -1, type 1404, size 1, index -1
+deepD[0].d2.d1[0].va: offset -1, type 8b50, size 3, index -1
+deepD[0].d2.d1[0].b: offset -1, type 8b56, size 1, index -1
+deepD[0].d2.d1[1].va: offset -1, type 8b50, size 3, index -1
+deepD[0].d2.d1[1].b: offset -1, type 8b56, size 1, index -1
+deepD[0].d2.d1[2].va: offset -1, type 8b50, size 3, index -1
+deepD[0].d2.d1[2].b: offset -1, type 8b56, size 1, index -1
+deepD[0].d2.d1[3].va: offset -1, type 8b50, size 3, index -1
+deepD[0].d2.d1[3].b: offset -1, type 8b56, size 1, index -1
+deepD[0].v3: offset -1, type 8b54, size 1, index -1
+deepD[1].iv4: offset -1, type 8b52, size 1, index -1
+deepD[1].d2.i: offset -1, type 1404, size 1, index -1
+deepD[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1
+deepD[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1
+deepD[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1
+deepD[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1
+deepD[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1
+deepD[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1
+deepD[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1
+deepD[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1
+deepD[1].v3: offset -1, type 8b54, size 1, index -1
+foo: offset 0, type 1406, size 1, index 0
+anonMember1: offset 0, type 8b51, size 1, index 0
+uf1: offset -1, type 1406, size 1, index -1
+
+Uniform block reflection:
+: offset -1, type ffffffff, size 512, index -1
+
+Vertex attribute reflection:
+attributeFloat: offset 0, type 1406, size 0, index 0
+attributeFloat2: offset 0, type 8b50, size 0, index 0
+attributeFloat3: offset 0, type 8b51, size 0, index 0
+attributeFloat4: offset 0, type 8b52, size 0, index 0
+attributeMat4: offset 0, type 8b5c, size 0, index 0
+
diff --git a/Test/baseResults/hlsl.sample.array.dx10.frag.out b/Test/baseResults/hlsl.sample.array.dx10.frag.out
index 6336cfa..54c3553 100644
--- a/Test/baseResults/hlsl.sample.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.array.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -106,7 +106,7 @@
 0:?               1.000000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -115,14 +115,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -135,6 +148,8 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -143,7 +158,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -247,7 +262,7 @@
 0:?               1.000000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -256,14 +271,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -276,19 +304,20 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 132
+// Id's are bound by 139
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 130 134
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -313,7 +342,9 @@
                               MemberName 120(PS_OUTPUT) 0  "Color"
                               MemberName 120(PS_OUTPUT) 1  "Depth"
                               Name 122  "psout"
-                              Name 131  "g_tTex1df4a"
+                              Name 130  "Color"
+                              Name 134  "Depth"
+                              Name 138  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -326,9 +357,10 @@
                               Decorate 90(g_tTexcdf4) DescriptorSet 0
                               Decorate 100(g_tTexcdi4) DescriptorSet 0
                               Decorate 110(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 120(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 131(g_tTex1df4a) DescriptorSet 0
-                              Decorate 131(g_tTex1df4a) Binding 1
+                              Decorate 130(Color) Location 0
+                              Decorate 134(Depth) BuiltIn FragDepth
+                              Decorate 138(g_tTex1df4a) DescriptorSet 0
+                              Decorate 138(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -406,7 +438,11 @@
              124:    7(fvec4) ConstantComposite 117 117 117 117
              126:     25(int) Constant 1
              127:             TypePointer Function 6(float)
-131(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             129:             TypePointer Output 7(fvec4)
+      130(Color):    129(ptr) Variable Output
+             133:             TypePointer Output 6(float)
+      134(Depth):    133(ptr) Variable Output
+138(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -468,6 +504,11 @@
                               Store 125 124
              128:    127(ptr) AccessChain 122(psout) 126
                               Store 128 117
-             129:120(PS_OUTPUT) Load 122(psout)
-                              ReturnValue 129
+             131:      8(ptr) AccessChain 122(psout) 123
+             132:    7(fvec4) Load 131
+                              Store 130(Color) 132
+             135:    127(ptr) AccessChain 122(psout) 126
+             136:    6(float) Load 135
+                              Store 134(Depth) 136
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.sample.basic.dx10.frag.out b/Test/baseResults/hlsl.sample.basic.dx10.frag.out
index feb6461..dca7f77 100644
--- a/Test/baseResults/hlsl.sample.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.basic.dx10.frag.out
@@ -4,7 +4,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:91  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:53  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:53    Function Parameters: 
 0:?     Sequence
 0:57      move second child to first child (temp int)
@@ -216,7 +216,7 @@
 0:?               0.900000
 0:86      move second child to first child (temp 4-component vector of float)
 0:86        Color: direct index for structure (temp 4-component vector of float)
-0:86          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:86          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:86          Constant:
 0:86            0 (const int)
 0:86        Constant:
@@ -225,14 +225,27 @@
 0:86          1.000000
 0:86          1.000000
 0:87      move second child to first child (temp float)
-0:87        Depth: direct index for structure (temp float FragDepth)
-0:87          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:87        Depth: direct index for structure (temp float)
+0:87          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:87          Constant:
 0:87            1 (const int)
 0:87        Constant:
 0:87          1.000000
-0:89      Branch: Return with expression
-0:89        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:89          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:89            Color: direct index for structure (temp 4-component vector of float)
+0:89              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:89              Constant:
+0:89                0 (const int)
+0:89          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:89            Depth: direct index for structure (temp float)
+0:89              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:89              Constant:
+0:89                1 (const int)
+0:89        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -250,6 +263,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -258,7 +273,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:91  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:53  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:53    Function Parameters: 
 0:?     Sequence
 0:57      move second child to first child (temp int)
@@ -470,7 +485,7 @@
 0:?               0.900000
 0:86      move second child to first child (temp 4-component vector of float)
 0:86        Color: direct index for structure (temp 4-component vector of float)
-0:86          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:86          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:86          Constant:
 0:86            0 (const int)
 0:86        Constant:
@@ -479,14 +494,27 @@
 0:86          1.000000
 0:86          1.000000
 0:87      move second child to first child (temp float)
-0:87        Depth: direct index for structure (temp float FragDepth)
-0:87          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:87        Depth: direct index for structure (temp float)
+0:87          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:87          Constant:
 0:87            1 (const int)
 0:87        Constant:
 0:87          1.000000
-0:89      Branch: Return with expression
-0:89        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:89          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:89            Color: direct index for structure (temp 4-component vector of float)
+0:89              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:89              Constant:
+0:89                0 (const int)
+0:89          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:89            Depth: direct index for structure (temp float)
+0:89              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:89              Constant:
+0:89                1 (const int)
+0:89        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -504,18 +532,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 184
+// Id's are bound by 191
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 180 184
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 7  "MemberTest"
                               MemberName 7(MemberTest) 0  "Sample"
@@ -560,9 +589,11 @@
                               MemberName 171(PS_OUTPUT) 0  "Color"
                               MemberName 171(PS_OUTPUT) 1  "Depth"
                               Name 173  "psout"
-                              Name 181  "g_sSamp2d"
-                              Name 182  "g_sSamp2D_b"
-                              Name 183  "g_tTex1df4a"
+                              Name 180  "Color"
+                              Name 184  "Depth"
+                              Name 188  "g_sSamp2d"
+                              Name 189  "g_sSamp2D_b"
+                              Name 190  "g_tTex1df4a"
                               Decorate 41(g_tTex1df4) DescriptorSet 0
                               Decorate 41(g_tTex1df4) Binding 0
                               Decorate 45(g_sSamp) DescriptorSet 0
@@ -578,11 +609,12 @@
                               Decorate 147(g_tTexcdf4) DescriptorSet 0
                               Decorate 156(g_tTexcdi4) DescriptorSet 0
                               Decorate 165(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 171(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 181(g_sSamp2d) DescriptorSet 0
-                              Decorate 182(g_sSamp2D_b) DescriptorSet 0
-                              Decorate 183(g_tTex1df4a) DescriptorSet 0
-                              Decorate 183(g_tTex1df4a) Binding 1
+                              Decorate 180(Color) Location 0
+                              Decorate 184(Depth) BuiltIn FragDepth
+                              Decorate 188(g_sSamp2d) DescriptorSet 0
+                              Decorate 189(g_sSamp2D_b) DescriptorSet 0
+                              Decorate 190(g_tTex1df4a) DescriptorSet 0
+                              Decorate 190(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -682,9 +714,13 @@
              174:   35(float) Constant 1065353216
              175:   36(fvec4) ConstantComposite 174 174 174 174
              177:             TypePointer Function 35(float)
-  181(g_sSamp2d):     44(ptr) Variable UniformConstant
-182(g_sSamp2D_b):     44(ptr) Variable UniformConstant
-183(g_tTex1df4a):     40(ptr) Variable UniformConstant
+             179:             TypePointer Output 36(fvec4)
+      180(Color):    179(ptr) Variable Output
+             183:             TypePointer Output 35(float)
+      184(Depth):    183(ptr) Variable Output
+  188(g_sSamp2d):     44(ptr) Variable UniformConstant
+189(g_sSamp2D_b):     44(ptr) Variable UniformConstant
+190(g_tTex1df4a):     40(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
         9(mtest):      8(ptr) Variable Function
@@ -789,6 +825,11 @@
                               Store 176 175
              178:    177(ptr) AccessChain 173(psout) 10
                               Store 178 174
-             179:171(PS_OUTPUT) Load 173(psout)
-                              ReturnValue 179
+             181:     37(ptr) AccessChain 173(psout) 23
+             182:   36(fvec4) Load 181
+                              Store 180(Color) 182
+             185:    177(ptr) AccessChain 173(psout) 10
+             186:   35(float) Load 185
+                              Store 184(Depth) 186
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.sample.offset.dx10.frag.out b/Test/baseResults/hlsl.sample.offset.dx10.frag.out
index ce20777..b8c7d5c 100644
--- a/Test/baseResults/hlsl.sample.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -124,7 +124,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -133,14 +133,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -156,6 +169,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -164,7 +179,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -286,7 +301,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -295,14 +310,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -318,18 +346,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 147
+// Id's are bound by 154
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 136 140
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -354,10 +383,12 @@
                               MemberName 127(PS_OUTPUT) 0  "Color"
                               MemberName 127(PS_OUTPUT) 1  "Depth"
                               Name 129  "psout"
-                              Name 137  "g_tTex1df4a"
-                              Name 140  "g_tTexcdf4"
-                              Name 143  "g_tTexcdi4"
-                              Name 146  "g_tTexcdu4"
+                              Name 136  "Color"
+                              Name 140  "Depth"
+                              Name 144  "g_tTex1df4a"
+                              Name 147  "g_tTexcdf4"
+                              Name 150  "g_tTexcdi4"
+                              Name 153  "g_tTexcdu4"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -370,12 +401,13 @@
                               Decorate 92(g_tTex3df4) DescriptorSet 0
                               Decorate 105(g_tTex3di4) DescriptorSet 0
                               Decorate 116(g_tTex3du4) DescriptorSet 0
-                              MemberDecorate 127(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 137(g_tTex1df4a) DescriptorSet 0
-                              Decorate 137(g_tTex1df4a) Binding 1
-                              Decorate 140(g_tTexcdf4) DescriptorSet 0
-                              Decorate 143(g_tTexcdi4) DescriptorSet 0
-                              Decorate 146(g_tTexcdu4) DescriptorSet 0
+                              Decorate 136(Color) Location 0
+                              Decorate 140(Depth) BuiltIn FragDepth
+                              Decorate 144(g_tTex1df4a) DescriptorSet 0
+                              Decorate 144(g_tTex1df4a) Binding 1
+                              Decorate 147(g_tTexcdf4) DescriptorSet 0
+                              Decorate 150(g_tTexcdi4) DescriptorSet 0
+                              Decorate 153(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -459,16 +491,20 @@
              130:    6(float) Constant 1065353216
              131:    7(fvec4) ConstantComposite 130 130 130 130
              133:             TypePointer Function 6(float)
-137(g_tTex1df4a):     11(ptr) Variable UniformConstant
-             138:             TypeImage 6(float) Cube sampled format:Unknown
-             139:             TypePointer UniformConstant 138
- 140(g_tTexcdf4):    139(ptr) Variable UniformConstant
-             141:             TypeImage 21(int) Cube sampled format:Unknown
-             142:             TypePointer UniformConstant 141
- 143(g_tTexcdi4):    142(ptr) Variable UniformConstant
-             144:             TypeImage 36(int) Cube sampled format:Unknown
-             145:             TypePointer UniformConstant 144
- 146(g_tTexcdu4):    145(ptr) Variable UniformConstant
+             135:             TypePointer Output 7(fvec4)
+      136(Color):    135(ptr) Variable Output
+             139:             TypePointer Output 6(float)
+      140(Depth):    139(ptr) Variable Output
+144(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             145:             TypeImage 6(float) Cube sampled format:Unknown
+             146:             TypePointer UniformConstant 145
+ 147(g_tTexcdf4):    146(ptr) Variable UniformConstant
+             148:             TypeImage 21(int) Cube sampled format:Unknown
+             149:             TypePointer UniformConstant 148
+ 150(g_tTexcdi4):    149(ptr) Variable UniformConstant
+             151:             TypeImage 36(int) Cube sampled format:Unknown
+             152:             TypePointer UniformConstant 151
+ 153(g_tTexcdu4):    152(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -530,6 +566,11 @@
                               Store 132 131
              134:    133(ptr) AccessChain 129(psout) 22
                               Store 134 130
-             135:127(PS_OUTPUT) Load 129(psout)
-                              ReturnValue 135
+             137:      8(ptr) AccessChain 129(psout) 60
+             138:    7(fvec4) Load 137
+                              Store 136(Color) 138
+             141:    133(ptr) AccessChain 129(psout) 22
+             142:    6(float) Load 141
+                              Store 140(Depth) 142
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
index 008ba94..b30a4e2 100644
--- a/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:23      Sequence
@@ -85,7 +85,7 @@
 0:?               1 (const int)
 0:33      move second child to first child (temp 4-component vector of float)
 0:33        Color: direct index for structure (temp 4-component vector of float)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            0 (const int)
 0:33        Constant:
@@ -94,14 +94,27 @@
 0:33          1.000000
 0:33          1.000000
 0:34      move second child to first child (temp float)
-0:34        Depth: direct index for structure (temp float FragDepth)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34        Depth: direct index for structure (temp float)
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            1 (const int)
 0:34        Constant:
 0:34          1.000000
-0:36      Branch: Return with expression
-0:36        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:36          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:36            Color: direct index for structure (temp 4-component vector of float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                0 (const int)
+0:36          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:36            Depth: direct index for structure (temp float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                1 (const int)
+0:36        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -111,6 +124,8 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -119,7 +134,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:23      Sequence
@@ -202,7 +217,7 @@
 0:?               1 (const int)
 0:33      move second child to first child (temp 4-component vector of float)
 0:33        Color: direct index for structure (temp 4-component vector of float)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            0 (const int)
 0:33        Constant:
@@ -211,14 +226,27 @@
 0:33          1.000000
 0:33          1.000000
 0:34      move second child to first child (temp float)
-0:34        Depth: direct index for structure (temp float FragDepth)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34        Depth: direct index for structure (temp float)
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            1 (const int)
 0:34        Constant:
 0:34          1.000000
-0:36      Branch: Return with expression
-0:36        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:36          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:36            Color: direct index for structure (temp 4-component vector of float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                0 (const int)
+0:36          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:36            Depth: direct index for structure (temp float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                1 (const int)
+0:36        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -228,18 +256,19 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 104
+// Id's are bound by 111
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 102 106
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -258,7 +287,9 @@
                               MemberName 93(PS_OUTPUT) 0  "Color"
                               MemberName 93(PS_OUTPUT) 1  "Depth"
                               Name 95  "psout"
-                              Name 103  "g_tTex1df4a"
+                              Name 102  "Color"
+                              Name 106  "Depth"
+                              Name 110  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -268,9 +299,10 @@
                               Decorate 59(g_tTex2df4) DescriptorSet 0
                               Decorate 72(g_tTex2di4) DescriptorSet 0
                               Decorate 83(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 93(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 103(g_tTex1df4a) DescriptorSet 0
-                              Decorate 103(g_tTex1df4a) Binding 1
+                              Decorate 102(Color) Location 0
+                              Decorate 106(Depth) BuiltIn FragDepth
+                              Decorate 110(g_tTex1df4a) DescriptorSet 0
+                              Decorate 110(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -335,7 +367,11 @@
               96:    6(float) Constant 1065353216
               97:    7(fvec4) ConstantComposite 96 96 96 96
               99:             TypePointer Function 6(float)
-103(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             101:             TypePointer Output 7(fvec4)
+      102(Color):    101(ptr) Variable Output
+             105:             TypePointer Output 6(float)
+      106(Depth):    105(ptr) Variable Output
+110(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -379,6 +415,11 @@
                               Store 98 97
              100:     99(ptr) AccessChain 95(psout) 39
                               Store 100 96
-             101:93(PS_OUTPUT) Load 95(psout)
-                              ReturnValue 101
+             103:      8(ptr) AccessChain 95(psout) 25
+             104:    7(fvec4) Load 103
+                              Store 102(Color) 104
+             107:     99(ptr) AccessChain 95(psout) 39
+             108:    6(float) Load 107
+                              Store 106(Depth) 108
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplebias.array.dx10.frag.out b/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
index b672544..66f4629 100644
--- a/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -124,7 +124,7 @@
 0:37              0.500000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -133,14 +133,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -153,6 +166,8 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -161,7 +176,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -283,7 +298,7 @@
 0:37              0.500000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -292,14 +307,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -312,19 +340,20 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 132
+// Id's are bound by 139
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 130 134
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -349,7 +378,9 @@
                               MemberName 120(PS_OUTPUT) 0  "Color"
                               MemberName 120(PS_OUTPUT) 1  "Depth"
                               Name 122  "psout"
-                              Name 131  "g_tTex1df4a"
+                              Name 130  "Color"
+                              Name 134  "Depth"
+                              Name 138  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -362,9 +393,10 @@
                               Decorate 90(g_tTexcdf4) DescriptorSet 0
                               Decorate 100(g_tTexcdi4) DescriptorSet 0
                               Decorate 110(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 120(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 131(g_tTex1df4a) DescriptorSet 0
-                              Decorate 131(g_tTex1df4a) Binding 1
+                              Decorate 130(Color) Location 0
+                              Decorate 134(Depth) BuiltIn FragDepth
+                              Decorate 138(g_tTex1df4a) DescriptorSet 0
+                              Decorate 138(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -442,7 +474,11 @@
              124:    7(fvec4) ConstantComposite 117 117 117 117
              126:     26(int) Constant 1
              127:             TypePointer Function 6(float)
-131(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             129:             TypePointer Output 7(fvec4)
+      130(Color):    129(ptr) Variable Output
+             133:             TypePointer Output 6(float)
+      134(Depth):    133(ptr) Variable Output
+138(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -504,6 +540,11 @@
                               Store 125 124
              128:    127(ptr) AccessChain 122(psout) 126
                               Store 128 117
-             129:120(PS_OUTPUT) Load 122(psout)
-                              ReturnValue 129
+             131:      8(ptr) AccessChain 122(psout) 123
+             132:    7(fvec4) Load 131
+                              Store 130(Color) 132
+             135:    127(ptr) AccessChain 122(psout) 126
+             136:    6(float) Load 135
+                              Store 134(Depth) 136
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out b/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
index 8161a59..faba4be 100644
--- a/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:52  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -154,7 +154,7 @@
 0:45              0.500000
 0:47      move second child to first child (temp 4-component vector of float)
 0:47        Color: direct index for structure (temp 4-component vector of float)
-0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:47          Constant:
 0:47            0 (const int)
 0:47        Constant:
@@ -163,14 +163,27 @@
 0:47          1.000000
 0:47          1.000000
 0:48      move second child to first child (temp float)
-0:48        Depth: direct index for structure (temp float FragDepth)
-0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48        Depth: direct index for structure (temp float)
+0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:48          Constant:
 0:48            1 (const int)
 0:48        Constant:
 0:48          1.000000
-0:50      Branch: Return with expression
-0:50        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:50          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:50            Color: direct index for structure (temp 4-component vector of float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                0 (const int)
+0:50          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:50            Depth: direct index for structure (temp float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                1 (const int)
+0:50        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -186,6 +199,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -194,7 +209,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:52  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -346,7 +361,7 @@
 0:45              0.500000
 0:47      move second child to first child (temp 4-component vector of float)
 0:47        Color: direct index for structure (temp 4-component vector of float)
-0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:47          Constant:
 0:47            0 (const int)
 0:47        Constant:
@@ -355,14 +370,27 @@
 0:47          1.000000
 0:47          1.000000
 0:48      move second child to first child (temp float)
-0:48        Depth: direct index for structure (temp float FragDepth)
-0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48        Depth: direct index for structure (temp float)
+0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:48          Constant:
 0:48            1 (const int)
 0:48        Constant:
 0:48          1.000000
-0:50      Branch: Return with expression
-0:50        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:50          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:50            Color: direct index for structure (temp 4-component vector of float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                0 (const int)
+0:50          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:50            Depth: direct index for structure (temp float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                1 (const int)
+0:50        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -378,18 +406,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 156
+// Id's are bound by 163
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 154 158
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -420,7 +449,9 @@
                               MemberName 143(PS_OUTPUT) 0  "Color"
                               MemberName 143(PS_OUTPUT) 1  "Depth"
                               Name 145  "psout"
-                              Name 155  "g_tTex1df4a"
+                              Name 154  "Color"
+                              Name 158  "Depth"
+                              Name 162  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -436,9 +467,10 @@
                               Decorate 119(g_tTexcdf4) DescriptorSet 0
                               Decorate 128(g_tTexcdi4) DescriptorSet 0
                               Decorate 137(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 143(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 155(g_tTex1df4a) DescriptorSet 0
-                              Decorate 155(g_tTex1df4a) Binding 1
+                              Decorate 154(Color) Location 0
+                              Decorate 158(Depth) BuiltIn FragDepth
+                              Decorate 162(g_tTex1df4a) DescriptorSet 0
+                              Decorate 162(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -525,7 +557,11 @@
              148:    7(fvec4) ConstantComposite 147 147 147 147
              150:     23(int) Constant 1
              151:             TypePointer Function 6(float)
-155(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             153:             TypePointer Output 7(fvec4)
+      154(Color):    153(ptr) Variable Output
+             157:             TypePointer Output 6(float)
+      158(Depth):    157(ptr) Variable Output
+162(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -605,6 +641,11 @@
                               Store 149 148
              152:    151(ptr) AccessChain 145(psout) 150
                               Store 152 147
-             153:143(PS_OUTPUT) Load 145(psout)
-                              ReturnValue 153
+             155:      8(ptr) AccessChain 145(psout) 146
+             156:    7(fvec4) Load 155
+                              Store 154(Color) 156
+             159:    151(ptr) AccessChain 145(psout) 150
+             160:    6(float) Load 159
+                              Store 158(Depth) 160
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out b/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
index 8c5726c..e83058b 100644
--- a/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -142,7 +142,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -151,14 +151,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -174,6 +187,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -182,7 +197,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -322,7 +337,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -331,14 +346,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -354,18 +382,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 147
+// Id's are bound by 154
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 136 140
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -390,10 +419,12 @@
                               MemberName 127(PS_OUTPUT) 0  "Color"
                               MemberName 127(PS_OUTPUT) 1  "Depth"
                               Name 129  "psout"
-                              Name 137  "g_tTex1df4a"
-                              Name 140  "g_tTexcdf4"
-                              Name 143  "g_tTexcdi4"
-                              Name 146  "g_tTexcdu4"
+                              Name 136  "Color"
+                              Name 140  "Depth"
+                              Name 144  "g_tTex1df4a"
+                              Name 147  "g_tTexcdf4"
+                              Name 150  "g_tTexcdi4"
+                              Name 153  "g_tTexcdu4"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -406,12 +437,13 @@
                               Decorate 92(g_tTex3df4) DescriptorSet 0
                               Decorate 105(g_tTex3di4) DescriptorSet 0
                               Decorate 116(g_tTex3du4) DescriptorSet 0
-                              MemberDecorate 127(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 137(g_tTex1df4a) DescriptorSet 0
-                              Decorate 137(g_tTex1df4a) Binding 1
-                              Decorate 140(g_tTexcdf4) DescriptorSet 0
-                              Decorate 143(g_tTexcdi4) DescriptorSet 0
-                              Decorate 146(g_tTexcdu4) DescriptorSet 0
+                              Decorate 136(Color) Location 0
+                              Decorate 140(Depth) BuiltIn FragDepth
+                              Decorate 144(g_tTex1df4a) DescriptorSet 0
+                              Decorate 144(g_tTex1df4a) Binding 1
+                              Decorate 147(g_tTexcdf4) DescriptorSet 0
+                              Decorate 150(g_tTexcdi4) DescriptorSet 0
+                              Decorate 153(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -495,16 +527,20 @@
              130:    6(float) Constant 1065353216
              131:    7(fvec4) ConstantComposite 130 130 130 130
              133:             TypePointer Function 6(float)
-137(g_tTex1df4a):     11(ptr) Variable UniformConstant
-             138:             TypeImage 6(float) Cube sampled format:Unknown
-             139:             TypePointer UniformConstant 138
- 140(g_tTexcdf4):    139(ptr) Variable UniformConstant
-             141:             TypeImage 22(int) Cube sampled format:Unknown
-             142:             TypePointer UniformConstant 141
- 143(g_tTexcdi4):    142(ptr) Variable UniformConstant
-             144:             TypeImage 37(int) Cube sampled format:Unknown
-             145:             TypePointer UniformConstant 144
- 146(g_tTexcdu4):    145(ptr) Variable UniformConstant
+             135:             TypePointer Output 7(fvec4)
+      136(Color):    135(ptr) Variable Output
+             139:             TypePointer Output 6(float)
+      140(Depth):    139(ptr) Variable Output
+144(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             145:             TypeImage 6(float) Cube sampled format:Unknown
+             146:             TypePointer UniformConstant 145
+ 147(g_tTexcdf4):    146(ptr) Variable UniformConstant
+             148:             TypeImage 22(int) Cube sampled format:Unknown
+             149:             TypePointer UniformConstant 148
+ 150(g_tTexcdi4):    149(ptr) Variable UniformConstant
+             151:             TypeImage 37(int) Cube sampled format:Unknown
+             152:             TypePointer UniformConstant 151
+ 153(g_tTexcdu4):    152(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -566,6 +602,11 @@
                               Store 132 131
              134:    133(ptr) AccessChain 129(psout) 23
                               Store 134 130
-             135:127(PS_OUTPUT) Load 129(psout)
-                              ReturnValue 135
+             137:      8(ptr) AccessChain 129(psout) 61
+             138:    7(fvec4) Load 137
+                              Store 136(Color) 138
+             141:    133(ptr) AccessChain 129(psout) 23
+             142:    6(float) Load 141
+                              Store 140(Depth) 142
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
index 0933594..a9e4404 100644
--- a/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:23      Sequence
@@ -97,7 +97,7 @@
 0:?               1 (const int)
 0:33      move second child to first child (temp 4-component vector of float)
 0:33        Color: direct index for structure (temp 4-component vector of float)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            0 (const int)
 0:33        Constant:
@@ -106,14 +106,27 @@
 0:33          1.000000
 0:33          1.000000
 0:34      move second child to first child (temp float)
-0:34        Depth: direct index for structure (temp float FragDepth)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34        Depth: direct index for structure (temp float)
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            1 (const int)
 0:34        Constant:
 0:34          1.000000
-0:36      Branch: Return with expression
-0:36        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:36          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:36            Color: direct index for structure (temp 4-component vector of float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                0 (const int)
+0:36          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:36            Depth: direct index for structure (temp float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                1 (const int)
+0:36        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -123,6 +136,8 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -131,7 +146,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:23      Sequence
@@ -226,7 +241,7 @@
 0:?               1 (const int)
 0:33      move second child to first child (temp 4-component vector of float)
 0:33        Color: direct index for structure (temp 4-component vector of float)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            0 (const int)
 0:33        Constant:
@@ -235,14 +250,27 @@
 0:33          1.000000
 0:33          1.000000
 0:34      move second child to first child (temp float)
-0:34        Depth: direct index for structure (temp float FragDepth)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34        Depth: direct index for structure (temp float)
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            1 (const int)
 0:34        Constant:
 0:34          1.000000
-0:36      Branch: Return with expression
-0:36        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:36          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:36            Color: direct index for structure (temp 4-component vector of float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                0 (const int)
+0:36          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:36            Depth: direct index for structure (temp float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                1 (const int)
+0:36        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -252,18 +280,19 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 104
+// Id's are bound by 111
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 102 106
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -282,7 +311,9 @@
                               MemberName 93(PS_OUTPUT) 0  "Color"
                               MemberName 93(PS_OUTPUT) 1  "Depth"
                               Name 95  "psout"
-                              Name 103  "g_tTex1df4a"
+                              Name 102  "Color"
+                              Name 106  "Depth"
+                              Name 110  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -292,9 +323,10 @@
                               Decorate 60(g_tTex2df4) DescriptorSet 0
                               Decorate 73(g_tTex2di4) DescriptorSet 0
                               Decorate 83(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 93(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 103(g_tTex1df4a) DescriptorSet 0
-                              Decorate 103(g_tTex1df4a) Binding 1
+                              Decorate 102(Color) Location 0
+                              Decorate 106(Depth) BuiltIn FragDepth
+                              Decorate 110(g_tTex1df4a) DescriptorSet 0
+                              Decorate 110(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -359,7 +391,11 @@
               96:    6(float) Constant 1065353216
               97:    7(fvec4) ConstantComposite 96 96 96 96
               99:             TypePointer Function 6(float)
-103(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             101:             TypePointer Output 7(fvec4)
+      102(Color):    101(ptr) Variable Output
+             105:             TypePointer Output 6(float)
+      106(Depth):    105(ptr) Variable Output
+110(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -403,6 +439,11 @@
                               Store 98 97
              100:     99(ptr) AccessChain 95(psout) 40
                               Store 100 96
-             101:93(PS_OUTPUT) Load 95(psout)
-                              ReturnValue 101
+             103:      8(ptr) AccessChain 95(psout) 26
+             104:    7(fvec4) Load 103
+                              Store 102(Color) 104
+             107:     99(ptr) AccessChain 95(psout) 40
+             108:    6(float) Load 107
+                              Store 106(Depth) 108
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
index 1b2d27f..660db5b 100644
--- a/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:61  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -133,7 +133,7 @@
 0:54              0.750000
 0:56      move second child to first child (temp 4-component vector of float)
 0:56        Color: direct index for structure (temp 4-component vector of float)
-0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:56          Constant:
 0:56            0 (const int)
 0:56        Constant:
@@ -142,14 +142,27 @@
 0:56          1.000000
 0:56          1.000000
 0:57      move second child to first child (temp float)
-0:57        Depth: direct index for structure (temp float FragDepth)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57        Depth: direct index for structure (temp float)
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            1 (const int)
 0:57        Constant:
 0:57          1.000000
-0:59      Branch: Return with expression
-0:59        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:59          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:59            Color: direct index for structure (temp 4-component vector of float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                0 (const int)
+0:59          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:59            Depth: direct index for structure (temp float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                1 (const int)
+0:59        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -173,6 +186,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -181,7 +196,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:61  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -312,7 +327,7 @@
 0:54              0.750000
 0:56      move second child to first child (temp 4-component vector of float)
 0:56        Color: direct index for structure (temp 4-component vector of float)
-0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:56          Constant:
 0:56            0 (const int)
 0:56        Constant:
@@ -321,14 +336,27 @@
 0:56          1.000000
 0:56          1.000000
 0:57      move second child to first child (temp float)
-0:57        Depth: direct index for structure (temp float FragDepth)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57        Depth: direct index for structure (temp float)
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            1 (const int)
 0:57        Constant:
 0:57          1.000000
-0:59      Branch: Return with expression
-0:59        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:59          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:59            Color: direct index for structure (temp 4-component vector of float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                0 (const int)
+0:59          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:59            Depth: direct index for structure (temp float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                1 (const int)
+0:59        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -352,19 +380,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 177
+// Id's are bound by 184
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 140 144
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r10"
                               Name 11  "g_tTex1df4a"
@@ -389,18 +418,20 @@
                               MemberName 129(PS_OUTPUT) 0  "Color"
                               MemberName 129(PS_OUTPUT) 1  "Depth"
                               Name 131  "psout"
-                              Name 143  "g_tTex1df4"
-                              Name 146  "g_tTex1di4"
-                              Name 149  "g_tTex1du4"
-                              Name 152  "g_tTex2df4"
-                              Name 155  "g_tTex2di4"
-                              Name 158  "g_tTex2du4"
-                              Name 161  "g_tTex3df4"
-                              Name 164  "g_tTex3di4"
-                              Name 167  "g_tTex3du4"
-                              Name 170  "g_tTexcdf4"
-                              Name 173  "g_tTexcdi4"
-                              Name 176  "g_tTexcdu4"
+                              Name 140  "Color"
+                              Name 144  "Depth"
+                              Name 150  "g_tTex1df4"
+                              Name 153  "g_tTex1di4"
+                              Name 156  "g_tTex1du4"
+                              Name 159  "g_tTex2df4"
+                              Name 162  "g_tTex2di4"
+                              Name 165  "g_tTex2du4"
+                              Name 168  "g_tTex3df4"
+                              Name 171  "g_tTex3di4"
+                              Name 174  "g_tTex3du4"
+                              Name 177  "g_tTexcdf4"
+                              Name 180  "g_tTexcdi4"
+                              Name 183  "g_tTexcdu4"
                               Decorate 11(g_tTex1df4a) DescriptorSet 0
                               Decorate 15(g_sSamp) DescriptorSet 0
                               Decorate 15(g_sSamp) Binding 0
@@ -412,20 +443,21 @@
                               Decorate 96(g_tTexcdf4a) DescriptorSet 0
                               Decorate 110(g_tTexcdi4a) DescriptorSet 0
                               Decorate 121(g_tTexcdu4a) DescriptorSet 0
-                              MemberDecorate 129(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 143(g_tTex1df4) DescriptorSet 0
-                              Decorate 143(g_tTex1df4) Binding 0
-                              Decorate 146(g_tTex1di4) DescriptorSet 0
-                              Decorate 149(g_tTex1du4) DescriptorSet 0
-                              Decorate 152(g_tTex2df4) DescriptorSet 0
-                              Decorate 155(g_tTex2di4) DescriptorSet 0
-                              Decorate 158(g_tTex2du4) DescriptorSet 0
-                              Decorate 161(g_tTex3df4) DescriptorSet 0
-                              Decorate 164(g_tTex3di4) DescriptorSet 0
-                              Decorate 167(g_tTex3du4) DescriptorSet 0
-                              Decorate 170(g_tTexcdf4) DescriptorSet 0
-                              Decorate 173(g_tTexcdi4) DescriptorSet 0
-                              Decorate 176(g_tTexcdu4) DescriptorSet 0
+                              Decorate 140(Color) Location 0
+                              Decorate 144(Depth) BuiltIn FragDepth
+                              Decorate 150(g_tTex1df4) DescriptorSet 0
+                              Decorate 150(g_tTex1df4) Binding 0
+                              Decorate 153(g_tTex1di4) DescriptorSet 0
+                              Decorate 156(g_tTex1du4) DescriptorSet 0
+                              Decorate 159(g_tTex2df4) DescriptorSet 0
+                              Decorate 162(g_tTex2di4) DescriptorSet 0
+                              Decorate 165(g_tTex2du4) DescriptorSet 0
+                              Decorate 168(g_tTex3df4) DescriptorSet 0
+                              Decorate 171(g_tTex3di4) DescriptorSet 0
+                              Decorate 174(g_tTex3du4) DescriptorSet 0
+                              Decorate 177(g_tTexcdf4) DescriptorSet 0
+                              Decorate 180(g_tTexcdi4) DescriptorSet 0
+                              Decorate 183(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -498,42 +530,46 @@
              134:  102(fvec4) ConstantComposite 133 133 133 133
              135:             TypePointer Function 102(fvec4)
              137:     29(int) Constant 1
-             141:             TypeImage 6(float) 1D sampled format:Unknown
-             142:             TypePointer UniformConstant 141
- 143(g_tTex1df4):    142(ptr) Variable UniformConstant
-             144:             TypeImage 29(int) 1D sampled format:Unknown
-             145:             TypePointer UniformConstant 144
- 146(g_tTex1di4):    145(ptr) Variable UniformConstant
-             147:             TypeImage 42(int) 1D sampled format:Unknown
-             148:             TypePointer UniformConstant 147
- 149(g_tTex1du4):    148(ptr) Variable UniformConstant
-             150:             TypeImage 6(float) 2D sampled format:Unknown
-             151:             TypePointer UniformConstant 150
- 152(g_tTex2df4):    151(ptr) Variable UniformConstant
-             153:             TypeImage 29(int) 2D sampled format:Unknown
-             154:             TypePointer UniformConstant 153
- 155(g_tTex2di4):    154(ptr) Variable UniformConstant
-             156:             TypeImage 42(int) 2D sampled format:Unknown
-             157:             TypePointer UniformConstant 156
- 158(g_tTex2du4):    157(ptr) Variable UniformConstant
-             159:             TypeImage 6(float) 3D sampled format:Unknown
-             160:             TypePointer UniformConstant 159
- 161(g_tTex3df4):    160(ptr) Variable UniformConstant
-             162:             TypeImage 29(int) 3D sampled format:Unknown
-             163:             TypePointer UniformConstant 162
- 164(g_tTex3di4):    163(ptr) Variable UniformConstant
-             165:             TypeImage 42(int) 3D sampled format:Unknown
-             166:             TypePointer UniformConstant 165
- 167(g_tTex3du4):    166(ptr) Variable UniformConstant
-             168:             TypeImage 6(float) Cube sampled format:Unknown
-             169:             TypePointer UniformConstant 168
- 170(g_tTexcdf4):    169(ptr) Variable UniformConstant
-             171:             TypeImage 29(int) Cube sampled format:Unknown
-             172:             TypePointer UniformConstant 171
- 173(g_tTexcdi4):    172(ptr) Variable UniformConstant
-             174:             TypeImage 42(int) Cube sampled format:Unknown
-             175:             TypePointer UniformConstant 174
- 176(g_tTexcdu4):    175(ptr) Variable UniformConstant
+             139:             TypePointer Output 102(fvec4)
+      140(Color):    139(ptr) Variable Output
+             143:             TypePointer Output 6(float)
+      144(Depth):    143(ptr) Variable Output
+             148:             TypeImage 6(float) 1D sampled format:Unknown
+             149:             TypePointer UniformConstant 148
+ 150(g_tTex1df4):    149(ptr) Variable UniformConstant
+             151:             TypeImage 29(int) 1D sampled format:Unknown
+             152:             TypePointer UniformConstant 151
+ 153(g_tTex1di4):    152(ptr) Variable UniformConstant
+             154:             TypeImage 42(int) 1D sampled format:Unknown
+             155:             TypePointer UniformConstant 154
+ 156(g_tTex1du4):    155(ptr) Variable UniformConstant
+             157:             TypeImage 6(float) 2D sampled format:Unknown
+             158:             TypePointer UniformConstant 157
+ 159(g_tTex2df4):    158(ptr) Variable UniformConstant
+             160:             TypeImage 29(int) 2D sampled format:Unknown
+             161:             TypePointer UniformConstant 160
+ 162(g_tTex2di4):    161(ptr) Variable UniformConstant
+             163:             TypeImage 42(int) 2D sampled format:Unknown
+             164:             TypePointer UniformConstant 163
+ 165(g_tTex2du4):    164(ptr) Variable UniformConstant
+             166:             TypeImage 6(float) 3D sampled format:Unknown
+             167:             TypePointer UniformConstant 166
+ 168(g_tTex3df4):    167(ptr) Variable UniformConstant
+             169:             TypeImage 29(int) 3D sampled format:Unknown
+             170:             TypePointer UniformConstant 169
+ 171(g_tTex3di4):    170(ptr) Variable UniformConstant
+             172:             TypeImage 42(int) 3D sampled format:Unknown
+             173:             TypePointer UniformConstant 172
+ 174(g_tTex3du4):    173(ptr) Variable UniformConstant
+             175:             TypeImage 6(float) Cube sampled format:Unknown
+             176:             TypePointer UniformConstant 175
+ 177(g_tTexcdf4):    176(ptr) Variable UniformConstant
+             178:             TypeImage 29(int) Cube sampled format:Unknown
+             179:             TypePointer UniformConstant 178
+ 180(g_tTexcdi4):    179(ptr) Variable UniformConstant
+             181:             TypeImage 42(int) Cube sampled format:Unknown
+             182:             TypePointer UniformConstant 181
+ 183(g_tTexcdu4):    182(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r10):      7(ptr) Variable Function
@@ -610,6 +646,11 @@
                               Store 136 134
              138:      7(ptr) AccessChain 131(psout) 137
                               Store 138 133
-             139:129(PS_OUTPUT) Load 131(psout)
-                              ReturnValue 139
+             141:    135(ptr) AccessChain 131(psout) 132
+             142:  102(fvec4) Load 141
+                              Store 140(Color) 142
+             145:      7(ptr) AccessChain 131(psout) 137
+             146:    6(float) Load 145
+                              Store 144(Depth) 146
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
index 3068030..253a59e 100644
--- a/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:62  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -124,7 +124,7 @@
 0:55                0.750000
 0:57      move second child to first child (temp 4-component vector of float)
 0:57        Color: direct index for structure (temp 4-component vector of float)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            0 (const int)
 0:57        Constant:
@@ -133,14 +133,27 @@
 0:57          1.000000
 0:57          1.000000
 0:58      move second child to first child (temp float)
-0:58        Depth: direct index for structure (temp float FragDepth)
-0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:58        Depth: direct index for structure (temp float)
+0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:58          Constant:
 0:58            1 (const int)
 0:58        Constant:
 0:58          1.000000
-0:60      Branch: Return with expression
-0:60        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:60          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:60            Color: direct index for structure (temp 4-component vector of float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                0 (const int)
+0:60          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:60            Depth: direct index for structure (temp float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                1 (const int)
+0:60        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -164,6 +177,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -172,7 +187,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:62  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -294,7 +309,7 @@
 0:55                0.750000
 0:57      move second child to first child (temp 4-component vector of float)
 0:57        Color: direct index for structure (temp 4-component vector of float)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            0 (const int)
 0:57        Constant:
@@ -303,14 +318,27 @@
 0:57          1.000000
 0:57          1.000000
 0:58      move second child to first child (temp float)
-0:58        Depth: direct index for structure (temp float FragDepth)
-0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:58        Depth: direct index for structure (temp float)
+0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:58          Constant:
 0:58            1 (const int)
 0:58        Constant:
 0:58          1.000000
-0:60      Branch: Return with expression
-0:60        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:60          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:60            Color: direct index for structure (temp 4-component vector of float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                0 (const int)
+0:60          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:60            Depth: direct index for structure (temp float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                1 (const int)
+0:60        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -334,19 +362,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 175
+// Id's are bound by 182
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 138 142
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r00"
                               Name 11  "g_tTex1df4"
@@ -371,18 +400,20 @@
                               MemberName 127(PS_OUTPUT) 0  "Color"
                               MemberName 127(PS_OUTPUT) 1  "Depth"
                               Name 129  "psout"
-                              Name 141  "g_tTex3df4"
-                              Name 144  "g_tTex3di4"
-                              Name 147  "g_tTex3du4"
-                              Name 150  "g_tTex1df4a"
-                              Name 153  "g_tTex1di4a"
-                              Name 156  "g_tTex1du4a"
-                              Name 159  "g_tTex2df4a"
-                              Name 162  "g_tTex2di4a"
-                              Name 165  "g_tTex2du4a"
-                              Name 168  "g_tTexcdf4a"
-                              Name 171  "g_tTexcdi4a"
-                              Name 174  "g_tTexcdu4a"
+                              Name 138  "Color"
+                              Name 142  "Depth"
+                              Name 148  "g_tTex3df4"
+                              Name 151  "g_tTex3di4"
+                              Name 154  "g_tTex3du4"
+                              Name 157  "g_tTex1df4a"
+                              Name 160  "g_tTex1di4a"
+                              Name 163  "g_tTex1du4a"
+                              Name 166  "g_tTex2df4a"
+                              Name 169  "g_tTex2di4a"
+                              Name 172  "g_tTex2du4a"
+                              Name 175  "g_tTexcdf4a"
+                              Name 178  "g_tTexcdi4a"
+                              Name 181  "g_tTexcdu4a"
                               Decorate 11(g_tTex1df4) DescriptorSet 0
                               Decorate 11(g_tTex1df4) Binding 0
                               Decorate 15(g_sSamp) DescriptorSet 0
@@ -395,19 +426,20 @@
                               Decorate 90(g_tTexcdf4) DescriptorSet 0
                               Decorate 105(g_tTexcdi4) DescriptorSet 0
                               Decorate 117(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 127(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 141(g_tTex3df4) DescriptorSet 0
-                              Decorate 144(g_tTex3di4) DescriptorSet 0
-                              Decorate 147(g_tTex3du4) DescriptorSet 0
-                              Decorate 150(g_tTex1df4a) DescriptorSet 0
-                              Decorate 153(g_tTex1di4a) DescriptorSet 0
-                              Decorate 156(g_tTex1du4a) DescriptorSet 0
-                              Decorate 159(g_tTex2df4a) DescriptorSet 0
-                              Decorate 162(g_tTex2di4a) DescriptorSet 0
-                              Decorate 165(g_tTex2du4a) DescriptorSet 0
-                              Decorate 168(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 171(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 174(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 138(Color) Location 0
+                              Decorate 142(Depth) BuiltIn FragDepth
+                              Decorate 148(g_tTex3df4) DescriptorSet 0
+                              Decorate 151(g_tTex3di4) DescriptorSet 0
+                              Decorate 154(g_tTex3du4) DescriptorSet 0
+                              Decorate 157(g_tTex1df4a) DescriptorSet 0
+                              Decorate 160(g_tTex1di4a) DescriptorSet 0
+                              Decorate 163(g_tTex1du4a) DescriptorSet 0
+                              Decorate 166(g_tTex2df4a) DescriptorSet 0
+                              Decorate 169(g_tTex2di4a) DescriptorSet 0
+                              Decorate 172(g_tTex2du4a) DescriptorSet 0
+                              Decorate 175(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 178(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 181(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -478,42 +510,46 @@
              132:  126(fvec4) ConstantComposite 131 131 131 131
              133:             TypePointer Function 126(fvec4)
              135:     25(int) Constant 1
-             139:             TypeImage 6(float) 3D sampled format:Unknown
-             140:             TypePointer UniformConstant 139
- 141(g_tTex3df4):    140(ptr) Variable UniformConstant
-             142:             TypeImage 25(int) 3D sampled format:Unknown
-             143:             TypePointer UniformConstant 142
- 144(g_tTex3di4):    143(ptr) Variable UniformConstant
-             145:             TypeImage 37(int) 3D sampled format:Unknown
-             146:             TypePointer UniformConstant 145
- 147(g_tTex3du4):    146(ptr) Variable UniformConstant
-             148:             TypeImage 6(float) 1D array sampled format:Unknown
-             149:             TypePointer UniformConstant 148
-150(g_tTex1df4a):    149(ptr) Variable UniformConstant
-             151:             TypeImage 25(int) 1D array sampled format:Unknown
-             152:             TypePointer UniformConstant 151
-153(g_tTex1di4a):    152(ptr) Variable UniformConstant
-             154:             TypeImage 37(int) 1D array sampled format:Unknown
-             155:             TypePointer UniformConstant 154
-156(g_tTex1du4a):    155(ptr) Variable UniformConstant
-             157:             TypeImage 6(float) 2D array sampled format:Unknown
-             158:             TypePointer UniformConstant 157
-159(g_tTex2df4a):    158(ptr) Variable UniformConstant
-             160:             TypeImage 25(int) 2D array sampled format:Unknown
-             161:             TypePointer UniformConstant 160
-162(g_tTex2di4a):    161(ptr) Variable UniformConstant
-             163:             TypeImage 37(int) 2D array sampled format:Unknown
-             164:             TypePointer UniformConstant 163
-165(g_tTex2du4a):    164(ptr) Variable UniformConstant
-             166:             TypeImage 6(float) Cube array sampled format:Unknown
-             167:             TypePointer UniformConstant 166
-168(g_tTexcdf4a):    167(ptr) Variable UniformConstant
-             169:             TypeImage 25(int) Cube array sampled format:Unknown
-             170:             TypePointer UniformConstant 169
-171(g_tTexcdi4a):    170(ptr) Variable UniformConstant
-             172:             TypeImage 37(int) Cube array sampled format:Unknown
-             173:             TypePointer UniformConstant 172
-174(g_tTexcdu4a):    173(ptr) Variable UniformConstant
+             137:             TypePointer Output 126(fvec4)
+      138(Color):    137(ptr) Variable Output
+             141:             TypePointer Output 6(float)
+      142(Depth):    141(ptr) Variable Output
+             146:             TypeImage 6(float) 3D sampled format:Unknown
+             147:             TypePointer UniformConstant 146
+ 148(g_tTex3df4):    147(ptr) Variable UniformConstant
+             149:             TypeImage 25(int) 3D sampled format:Unknown
+             150:             TypePointer UniformConstant 149
+ 151(g_tTex3di4):    150(ptr) Variable UniformConstant
+             152:             TypeImage 37(int) 3D sampled format:Unknown
+             153:             TypePointer UniformConstant 152
+ 154(g_tTex3du4):    153(ptr) Variable UniformConstant
+             155:             TypeImage 6(float) 1D array sampled format:Unknown
+             156:             TypePointer UniformConstant 155
+157(g_tTex1df4a):    156(ptr) Variable UniformConstant
+             158:             TypeImage 25(int) 1D array sampled format:Unknown
+             159:             TypePointer UniformConstant 158
+160(g_tTex1di4a):    159(ptr) Variable UniformConstant
+             161:             TypeImage 37(int) 1D array sampled format:Unknown
+             162:             TypePointer UniformConstant 161
+163(g_tTex1du4a):    162(ptr) Variable UniformConstant
+             164:             TypeImage 6(float) 2D array sampled format:Unknown
+             165:             TypePointer UniformConstant 164
+166(g_tTex2df4a):    165(ptr) Variable UniformConstant
+             167:             TypeImage 25(int) 2D array sampled format:Unknown
+             168:             TypePointer UniformConstant 167
+169(g_tTex2di4a):    168(ptr) Variable UniformConstant
+             170:             TypeImage 37(int) 2D array sampled format:Unknown
+             171:             TypePointer UniformConstant 170
+172(g_tTex2du4a):    171(ptr) Variable UniformConstant
+             173:             TypeImage 6(float) Cube array sampled format:Unknown
+             174:             TypePointer UniformConstant 173
+175(g_tTexcdf4a):    174(ptr) Variable UniformConstant
+             176:             TypeImage 25(int) Cube array sampled format:Unknown
+             177:             TypePointer UniformConstant 176
+178(g_tTexcdi4a):    177(ptr) Variable UniformConstant
+             179:             TypeImage 37(int) Cube array sampled format:Unknown
+             180:             TypePointer UniformConstant 179
+181(g_tTexcdu4a):    180(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r00):      7(ptr) Variable Function
@@ -590,6 +626,11 @@
                               Store 134 132
              136:      7(ptr) AccessChain 129(psout) 135
                               Store 136 131
-             137:127(PS_OUTPUT) Load 129(psout)
-                              ReturnValue 137
+             139:    133(ptr) AccessChain 129(psout) 130
+             140:  126(fvec4) Load 139
+                              Store 138(Color) 140
+             143:      7(ptr) AccessChain 129(psout) 135
+             144:    6(float) Load 143
+                              Store 142(Depth) 144
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
index df298da..3d744bd 100644
--- a/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:67  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -97,7 +97,7 @@
 0:?               3 (const int)
 0:62      move second child to first child (temp 4-component vector of float)
 0:62        Color: direct index for structure (temp 4-component vector of float)
-0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:62          Constant:
 0:62            0 (const int)
 0:62        Constant:
@@ -106,14 +106,27 @@
 0:62          1.000000
 0:62          1.000000
 0:63      move second child to first child (temp float)
-0:63        Depth: direct index for structure (temp float FragDepth)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63        Depth: direct index for structure (temp float)
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            1 (const int)
 0:63        Constant:
 0:63          1.000000
-0:65      Branch: Return with expression
-0:65        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:65          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:65            Color: direct index for structure (temp 4-component vector of float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                0 (const int)
+0:65          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:65            Depth: direct index for structure (temp float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                1 (const int)
+0:65        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -137,6 +150,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -145,7 +160,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:67  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -240,7 +255,7 @@
 0:?               3 (const int)
 0:62      move second child to first child (temp 4-component vector of float)
 0:62        Color: direct index for structure (temp 4-component vector of float)
-0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:62          Constant:
 0:62            0 (const int)
 0:62        Constant:
@@ -249,14 +264,27 @@
 0:62          1.000000
 0:62          1.000000
 0:63      move second child to first child (temp float)
-0:63        Depth: direct index for structure (temp float FragDepth)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63        Depth: direct index for structure (temp float)
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            1 (const int)
 0:63        Constant:
 0:63          1.000000
-0:65      Branch: Return with expression
-0:65        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:65          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:65            Color: direct index for structure (temp 4-component vector of float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                0 (const int)
+0:65          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:65            Depth: direct index for structure (temp float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                1 (const int)
+0:65        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -280,19 +308,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 149
+// Id's are bound by 156
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 103 107
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r01"
                               Name 11  "g_tTex1df4"
@@ -311,21 +340,23 @@
                               MemberName 92(PS_OUTPUT) 0  "Color"
                               MemberName 92(PS_OUTPUT) 1  "Depth"
                               Name 94  "psout"
-                              Name 106  "g_tTex3df4"
-                              Name 109  "g_tTex3di4"
-                              Name 112  "g_tTex3du4"
-                              Name 115  "g_tTexcdf4"
-                              Name 118  "g_tTexcdi4"
-                              Name 121  "g_tTexcdu4"
-                              Name 124  "g_tTex1df4a"
-                              Name 127  "g_tTex1di4a"
-                              Name 130  "g_tTex1du4a"
-                              Name 133  "g_tTex2df4a"
-                              Name 136  "g_tTex2di4a"
-                              Name 139  "g_tTex2du4a"
-                              Name 142  "g_tTexcdf4a"
-                              Name 145  "g_tTexcdi4a"
-                              Name 148  "g_tTexcdu4a"
+                              Name 103  "Color"
+                              Name 107  "Depth"
+                              Name 113  "g_tTex3df4"
+                              Name 116  "g_tTex3di4"
+                              Name 119  "g_tTex3du4"
+                              Name 122  "g_tTexcdf4"
+                              Name 125  "g_tTexcdi4"
+                              Name 128  "g_tTexcdu4"
+                              Name 131  "g_tTex1df4a"
+                              Name 134  "g_tTex1di4a"
+                              Name 137  "g_tTex1du4a"
+                              Name 140  "g_tTex2df4a"
+                              Name 143  "g_tTex2di4a"
+                              Name 146  "g_tTex2du4a"
+                              Name 149  "g_tTexcdf4a"
+                              Name 152  "g_tTexcdi4a"
+                              Name 155  "g_tTexcdu4a"
                               Decorate 11(g_tTex1df4) DescriptorSet 0
                               Decorate 11(g_tTex1df4) Binding 0
                               Decorate 15(g_sSamp) DescriptorSet 0
@@ -335,22 +366,23 @@
                               Decorate 52(g_tTex2df4) DescriptorSet 0
                               Decorate 70(g_tTex2di4) DescriptorSet 0
                               Decorate 82(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 92(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 106(g_tTex3df4) DescriptorSet 0
-                              Decorate 109(g_tTex3di4) DescriptorSet 0
-                              Decorate 112(g_tTex3du4) DescriptorSet 0
-                              Decorate 115(g_tTexcdf4) DescriptorSet 0
-                              Decorate 118(g_tTexcdi4) DescriptorSet 0
-                              Decorate 121(g_tTexcdu4) DescriptorSet 0
-                              Decorate 124(g_tTex1df4a) DescriptorSet 0
-                              Decorate 127(g_tTex1di4a) DescriptorSet 0
-                              Decorate 130(g_tTex1du4a) DescriptorSet 0
-                              Decorate 133(g_tTex2df4a) DescriptorSet 0
-                              Decorate 136(g_tTex2di4a) DescriptorSet 0
-                              Decorate 139(g_tTex2du4a) DescriptorSet 0
-                              Decorate 142(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 145(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 148(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 103(Color) Location 0
+                              Decorate 107(Depth) BuiltIn FragDepth
+                              Decorate 113(g_tTex3df4) DescriptorSet 0
+                              Decorate 116(g_tTex3di4) DescriptorSet 0
+                              Decorate 119(g_tTex3du4) DescriptorSet 0
+                              Decorate 122(g_tTexcdf4) DescriptorSet 0
+                              Decorate 125(g_tTexcdi4) DescriptorSet 0
+                              Decorate 128(g_tTexcdu4) DescriptorSet 0
+                              Decorate 131(g_tTex1df4a) DescriptorSet 0
+                              Decorate 134(g_tTex1di4a) DescriptorSet 0
+                              Decorate 137(g_tTex1du4a) DescriptorSet 0
+                              Decorate 140(g_tTex2df4a) DescriptorSet 0
+                              Decorate 143(g_tTex2di4a) DescriptorSet 0
+                              Decorate 146(g_tTex2du4a) DescriptorSet 0
+                              Decorate 149(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 152(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 155(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -407,51 +439,55 @@
               97:   91(fvec4) ConstantComposite 96 96 96 96
               98:             TypePointer Function 91(fvec4)
              100:     22(int) Constant 1
-             104:             TypeImage 6(float) 3D sampled format:Unknown
-             105:             TypePointer UniformConstant 104
- 106(g_tTex3df4):    105(ptr) Variable UniformConstant
-             107:             TypeImage 22(int) 3D sampled format:Unknown
-             108:             TypePointer UniformConstant 107
- 109(g_tTex3di4):    108(ptr) Variable UniformConstant
-             110:             TypeImage 38(int) 3D sampled format:Unknown
-             111:             TypePointer UniformConstant 110
- 112(g_tTex3du4):    111(ptr) Variable UniformConstant
-             113:             TypeImage 6(float) Cube sampled format:Unknown
-             114:             TypePointer UniformConstant 113
- 115(g_tTexcdf4):    114(ptr) Variable UniformConstant
-             116:             TypeImage 22(int) Cube sampled format:Unknown
-             117:             TypePointer UniformConstant 116
- 118(g_tTexcdi4):    117(ptr) Variable UniformConstant
-             119:             TypeImage 38(int) Cube sampled format:Unknown
-             120:             TypePointer UniformConstant 119
- 121(g_tTexcdu4):    120(ptr) Variable UniformConstant
-             122:             TypeImage 6(float) 1D array sampled format:Unknown
-             123:             TypePointer UniformConstant 122
-124(g_tTex1df4a):    123(ptr) Variable UniformConstant
-             125:             TypeImage 22(int) 1D array sampled format:Unknown
-             126:             TypePointer UniformConstant 125
-127(g_tTex1di4a):    126(ptr) Variable UniformConstant
-             128:             TypeImage 38(int) 1D array sampled format:Unknown
-             129:             TypePointer UniformConstant 128
-130(g_tTex1du4a):    129(ptr) Variable UniformConstant
-             131:             TypeImage 6(float) 2D array sampled format:Unknown
-             132:             TypePointer UniformConstant 131
-133(g_tTex2df4a):    132(ptr) Variable UniformConstant
-             134:             TypeImage 22(int) 2D array sampled format:Unknown
-             135:             TypePointer UniformConstant 134
-136(g_tTex2di4a):    135(ptr) Variable UniformConstant
-             137:             TypeImage 38(int) 2D array sampled format:Unknown
-             138:             TypePointer UniformConstant 137
-139(g_tTex2du4a):    138(ptr) Variable UniformConstant
-             140:             TypeImage 6(float) Cube array sampled format:Unknown
-             141:             TypePointer UniformConstant 140
-142(g_tTexcdf4a):    141(ptr) Variable UniformConstant
-             143:             TypeImage 22(int) Cube array sampled format:Unknown
-             144:             TypePointer UniformConstant 143
-145(g_tTexcdi4a):    144(ptr) Variable UniformConstant
-             146:             TypeImage 38(int) Cube array sampled format:Unknown
-             147:             TypePointer UniformConstant 146
-148(g_tTexcdu4a):    147(ptr) Variable UniformConstant
+             102:             TypePointer Output 91(fvec4)
+      103(Color):    102(ptr) Variable Output
+             106:             TypePointer Output 6(float)
+      107(Depth):    106(ptr) Variable Output
+             111:             TypeImage 6(float) 3D sampled format:Unknown
+             112:             TypePointer UniformConstant 111
+ 113(g_tTex3df4):    112(ptr) Variable UniformConstant
+             114:             TypeImage 22(int) 3D sampled format:Unknown
+             115:             TypePointer UniformConstant 114
+ 116(g_tTex3di4):    115(ptr) Variable UniformConstant
+             117:             TypeImage 38(int) 3D sampled format:Unknown
+             118:             TypePointer UniformConstant 117
+ 119(g_tTex3du4):    118(ptr) Variable UniformConstant
+             120:             TypeImage 6(float) Cube sampled format:Unknown
+             121:             TypePointer UniformConstant 120
+ 122(g_tTexcdf4):    121(ptr) Variable UniformConstant
+             123:             TypeImage 22(int) Cube sampled format:Unknown
+             124:             TypePointer UniformConstant 123
+ 125(g_tTexcdi4):    124(ptr) Variable UniformConstant
+             126:             TypeImage 38(int) Cube sampled format:Unknown
+             127:             TypePointer UniformConstant 126
+ 128(g_tTexcdu4):    127(ptr) Variable UniformConstant
+             129:             TypeImage 6(float) 1D array sampled format:Unknown
+             130:             TypePointer UniformConstant 129
+131(g_tTex1df4a):    130(ptr) Variable UniformConstant
+             132:             TypeImage 22(int) 1D array sampled format:Unknown
+             133:             TypePointer UniformConstant 132
+134(g_tTex1di4a):    133(ptr) Variable UniformConstant
+             135:             TypeImage 38(int) 1D array sampled format:Unknown
+             136:             TypePointer UniformConstant 135
+137(g_tTex1du4a):    136(ptr) Variable UniformConstant
+             138:             TypeImage 6(float) 2D array sampled format:Unknown
+             139:             TypePointer UniformConstant 138
+140(g_tTex2df4a):    139(ptr) Variable UniformConstant
+             141:             TypeImage 22(int) 2D array sampled format:Unknown
+             142:             TypePointer UniformConstant 141
+143(g_tTex2di4a):    142(ptr) Variable UniformConstant
+             144:             TypeImage 38(int) 2D array sampled format:Unknown
+             145:             TypePointer UniformConstant 144
+146(g_tTex2du4a):    145(ptr) Variable UniformConstant
+             147:             TypeImage 6(float) Cube array sampled format:Unknown
+             148:             TypePointer UniformConstant 147
+149(g_tTexcdf4a):    148(ptr) Variable UniformConstant
+             150:             TypeImage 22(int) Cube array sampled format:Unknown
+             151:             TypePointer UniformConstant 150
+152(g_tTexcdi4a):    151(ptr) Variable UniformConstant
+             153:             TypeImage 38(int) Cube array sampled format:Unknown
+             154:             TypePointer UniformConstant 153
+155(g_tTexcdu4a):    154(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r01):      7(ptr) Variable Function
@@ -504,6 +540,11 @@
                               Store 99 97
              101:      7(ptr) AccessChain 94(psout) 100
                               Store 101 96
-             102:92(PS_OUTPUT) Load 94(psout)
-                              ReturnValue 102
+             104:     98(ptr) AccessChain 94(psout) 95
+             105:   91(fvec4) Load 104
+                              Store 103(Color) 105
+             108:      7(ptr) AccessChain 94(psout) 100
+             109:    6(float) Load 108
+                              Store 107(Depth) 109
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
index 5d42073..2eb302e 100644
--- a/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:68  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -103,7 +103,7 @@
 0:?               3 (const int)
 0:63      move second child to first child (temp 4-component vector of float)
 0:63        Color: direct index for structure (temp 4-component vector of float)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            0 (const int)
 0:63        Constant:
@@ -112,14 +112,27 @@
 0:63          1.000000
 0:63          1.000000
 0:64      move second child to first child (temp float)
-0:64        Depth: direct index for structure (temp float FragDepth)
-0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:64        Depth: direct index for structure (temp float)
+0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:64          Constant:
 0:64            1 (const int)
 0:64        Constant:
 0:64          1.000000
-0:66      Branch: Return with expression
-0:66        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:66          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:66            Color: direct index for structure (temp 4-component vector of float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                0 (const int)
+0:66          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:66            Depth: direct index for structure (temp float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                1 (const int)
+0:66        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -143,6 +156,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -151,7 +166,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:68  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -252,7 +267,7 @@
 0:?               3 (const int)
 0:63      move second child to first child (temp 4-component vector of float)
 0:63        Color: direct index for structure (temp 4-component vector of float)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            0 (const int)
 0:63        Constant:
@@ -261,14 +276,27 @@
 0:63          1.000000
 0:63          1.000000
 0:64      move second child to first child (temp float)
-0:64        Depth: direct index for structure (temp float FragDepth)
-0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:64        Depth: direct index for structure (temp float)
+0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:64          Constant:
 0:64            1 (const int)
 0:64        Constant:
 0:64          1.000000
-0:66      Branch: Return with expression
-0:66        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:66          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:66            Color: direct index for structure (temp 4-component vector of float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                0 (const int)
+0:66          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:66            Depth: direct index for structure (temp float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                1 (const int)
+0:66        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -292,19 +320,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 155
+// Id's are bound by 162
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 109 113
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r11"
                               Name 11  "g_tTex1df4a"
@@ -323,21 +352,23 @@
                               MemberName 98(PS_OUTPUT) 0  "Color"
                               MemberName 98(PS_OUTPUT) 1  "Depth"
                               Name 100  "psout"
-                              Name 112  "g_tTex1df4"
-                              Name 115  "g_tTex1di4"
-                              Name 118  "g_tTex1du4"
-                              Name 121  "g_tTex2df4"
-                              Name 124  "g_tTex2di4"
-                              Name 127  "g_tTex2du4"
-                              Name 130  "g_tTex3df4"
-                              Name 133  "g_tTex3di4"
-                              Name 136  "g_tTex3du4"
-                              Name 139  "g_tTexcdf4"
-                              Name 142  "g_tTexcdi4"
-                              Name 145  "g_tTexcdu4"
-                              Name 148  "g_tTexcdf4a"
-                              Name 151  "g_tTexcdi4a"
-                              Name 154  "g_tTexcdu4a"
+                              Name 109  "Color"
+                              Name 113  "Depth"
+                              Name 119  "g_tTex1df4"
+                              Name 122  "g_tTex1di4"
+                              Name 125  "g_tTex1du4"
+                              Name 128  "g_tTex2df4"
+                              Name 131  "g_tTex2di4"
+                              Name 134  "g_tTex2du4"
+                              Name 137  "g_tTex3df4"
+                              Name 140  "g_tTex3di4"
+                              Name 143  "g_tTex3du4"
+                              Name 146  "g_tTexcdf4"
+                              Name 149  "g_tTexcdi4"
+                              Name 152  "g_tTexcdu4"
+                              Name 155  "g_tTexcdf4a"
+                              Name 158  "g_tTexcdi4a"
+                              Name 161  "g_tTexcdu4a"
                               Decorate 11(g_tTex1df4a) DescriptorSet 0
                               Decorate 15(g_sSamp) DescriptorSet 0
                               Decorate 15(g_sSamp) Binding 0
@@ -346,23 +377,24 @@
                               Decorate 58(g_tTex2df4a) DescriptorSet 0
                               Decorate 76(g_tTex2di4a) DescriptorSet 0
                               Decorate 88(g_tTex2du4a) DescriptorSet 0
-                              MemberDecorate 98(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 112(g_tTex1df4) DescriptorSet 0
-                              Decorate 112(g_tTex1df4) Binding 0
-                              Decorate 115(g_tTex1di4) DescriptorSet 0
-                              Decorate 118(g_tTex1du4) DescriptorSet 0
-                              Decorate 121(g_tTex2df4) DescriptorSet 0
-                              Decorate 124(g_tTex2di4) DescriptorSet 0
-                              Decorate 127(g_tTex2du4) DescriptorSet 0
-                              Decorate 130(g_tTex3df4) DescriptorSet 0
-                              Decorate 133(g_tTex3di4) DescriptorSet 0
-                              Decorate 136(g_tTex3du4) DescriptorSet 0
-                              Decorate 139(g_tTexcdf4) DescriptorSet 0
-                              Decorate 142(g_tTexcdi4) DescriptorSet 0
-                              Decorate 145(g_tTexcdu4) DescriptorSet 0
-                              Decorate 148(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 151(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 154(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 109(Color) Location 0
+                              Decorate 113(Depth) BuiltIn FragDepth
+                              Decorate 119(g_tTex1df4) DescriptorSet 0
+                              Decorate 119(g_tTex1df4) Binding 0
+                              Decorate 122(g_tTex1di4) DescriptorSet 0
+                              Decorate 125(g_tTex1du4) DescriptorSet 0
+                              Decorate 128(g_tTex2df4) DescriptorSet 0
+                              Decorate 131(g_tTex2di4) DescriptorSet 0
+                              Decorate 134(g_tTex2du4) DescriptorSet 0
+                              Decorate 137(g_tTex3df4) DescriptorSet 0
+                              Decorate 140(g_tTex3di4) DescriptorSet 0
+                              Decorate 143(g_tTex3du4) DescriptorSet 0
+                              Decorate 146(g_tTexcdf4) DescriptorSet 0
+                              Decorate 149(g_tTexcdi4) DescriptorSet 0
+                              Decorate 152(g_tTexcdu4) DescriptorSet 0
+                              Decorate 155(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 158(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 161(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -422,51 +454,55 @@
              103:   97(fvec4) ConstantComposite 102 102 102 102
              104:             TypePointer Function 97(fvec4)
              106:     26(int) Constant 1
-             110:             TypeImage 6(float) 1D sampled format:Unknown
-             111:             TypePointer UniformConstant 110
- 112(g_tTex1df4):    111(ptr) Variable UniformConstant
-             113:             TypeImage 26(int) 1D sampled format:Unknown
-             114:             TypePointer UniformConstant 113
- 115(g_tTex1di4):    114(ptr) Variable UniformConstant
-             116:             TypeImage 43(int) 1D sampled format:Unknown
-             117:             TypePointer UniformConstant 116
- 118(g_tTex1du4):    117(ptr) Variable UniformConstant
-             119:             TypeImage 6(float) 2D sampled format:Unknown
-             120:             TypePointer UniformConstant 119
- 121(g_tTex2df4):    120(ptr) Variable UniformConstant
-             122:             TypeImage 26(int) 2D sampled format:Unknown
-             123:             TypePointer UniformConstant 122
- 124(g_tTex2di4):    123(ptr) Variable UniformConstant
-             125:             TypeImage 43(int) 2D sampled format:Unknown
-             126:             TypePointer UniformConstant 125
- 127(g_tTex2du4):    126(ptr) Variable UniformConstant
-             128:             TypeImage 6(float) 3D sampled format:Unknown
-             129:             TypePointer UniformConstant 128
- 130(g_tTex3df4):    129(ptr) Variable UniformConstant
-             131:             TypeImage 26(int) 3D sampled format:Unknown
-             132:             TypePointer UniformConstant 131
- 133(g_tTex3di4):    132(ptr) Variable UniformConstant
-             134:             TypeImage 43(int) 3D sampled format:Unknown
-             135:             TypePointer UniformConstant 134
- 136(g_tTex3du4):    135(ptr) Variable UniformConstant
-             137:             TypeImage 6(float) Cube sampled format:Unknown
-             138:             TypePointer UniformConstant 137
- 139(g_tTexcdf4):    138(ptr) Variable UniformConstant
-             140:             TypeImage 26(int) Cube sampled format:Unknown
-             141:             TypePointer UniformConstant 140
- 142(g_tTexcdi4):    141(ptr) Variable UniformConstant
-             143:             TypeImage 43(int) Cube sampled format:Unknown
-             144:             TypePointer UniformConstant 143
- 145(g_tTexcdu4):    144(ptr) Variable UniformConstant
-             146:             TypeImage 6(float) Cube array sampled format:Unknown
-             147:             TypePointer UniformConstant 146
-148(g_tTexcdf4a):    147(ptr) Variable UniformConstant
-             149:             TypeImage 26(int) Cube array sampled format:Unknown
-             150:             TypePointer UniformConstant 149
-151(g_tTexcdi4a):    150(ptr) Variable UniformConstant
-             152:             TypeImage 43(int) Cube array sampled format:Unknown
-             153:             TypePointer UniformConstant 152
-154(g_tTexcdu4a):    153(ptr) Variable UniformConstant
+             108:             TypePointer Output 97(fvec4)
+      109(Color):    108(ptr) Variable Output
+             112:             TypePointer Output 6(float)
+      113(Depth):    112(ptr) Variable Output
+             117:             TypeImage 6(float) 1D sampled format:Unknown
+             118:             TypePointer UniformConstant 117
+ 119(g_tTex1df4):    118(ptr) Variable UniformConstant
+             120:             TypeImage 26(int) 1D sampled format:Unknown
+             121:             TypePointer UniformConstant 120
+ 122(g_tTex1di4):    121(ptr) Variable UniformConstant
+             123:             TypeImage 43(int) 1D sampled format:Unknown
+             124:             TypePointer UniformConstant 123
+ 125(g_tTex1du4):    124(ptr) Variable UniformConstant
+             126:             TypeImage 6(float) 2D sampled format:Unknown
+             127:             TypePointer UniformConstant 126
+ 128(g_tTex2df4):    127(ptr) Variable UniformConstant
+             129:             TypeImage 26(int) 2D sampled format:Unknown
+             130:             TypePointer UniformConstant 129
+ 131(g_tTex2di4):    130(ptr) Variable UniformConstant
+             132:             TypeImage 43(int) 2D sampled format:Unknown
+             133:             TypePointer UniformConstant 132
+ 134(g_tTex2du4):    133(ptr) Variable UniformConstant
+             135:             TypeImage 6(float) 3D sampled format:Unknown
+             136:             TypePointer UniformConstant 135
+ 137(g_tTex3df4):    136(ptr) Variable UniformConstant
+             138:             TypeImage 26(int) 3D sampled format:Unknown
+             139:             TypePointer UniformConstant 138
+ 140(g_tTex3di4):    139(ptr) Variable UniformConstant
+             141:             TypeImage 43(int) 3D sampled format:Unknown
+             142:             TypePointer UniformConstant 141
+ 143(g_tTex3du4):    142(ptr) Variable UniformConstant
+             144:             TypeImage 6(float) Cube sampled format:Unknown
+             145:             TypePointer UniformConstant 144
+ 146(g_tTexcdf4):    145(ptr) Variable UniformConstant
+             147:             TypeImage 26(int) Cube sampled format:Unknown
+             148:             TypePointer UniformConstant 147
+ 149(g_tTexcdi4):    148(ptr) Variable UniformConstant
+             150:             TypeImage 43(int) Cube sampled format:Unknown
+             151:             TypePointer UniformConstant 150
+ 152(g_tTexcdu4):    151(ptr) Variable UniformConstant
+             153:             TypeImage 6(float) Cube array sampled format:Unknown
+             154:             TypePointer UniformConstant 153
+155(g_tTexcdf4a):    154(ptr) Variable UniformConstant
+             156:             TypeImage 26(int) Cube array sampled format:Unknown
+             157:             TypePointer UniformConstant 156
+158(g_tTexcdi4a):    157(ptr) Variable UniformConstant
+             159:             TypeImage 43(int) Cube array sampled format:Unknown
+             160:             TypePointer UniformConstant 159
+161(g_tTexcdu4a):    160(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r11):      7(ptr) Variable Function
@@ -522,6 +558,11 @@
                               Store 105 103
              107:      7(ptr) AccessChain 100(psout) 106
                               Store 107 102
-             108:98(PS_OUTPUT) Load 100(psout)
-                              ReturnValue 108
+             110:    104(ptr) AccessChain 100(psout) 101
+             111:   97(fvec4) Load 110
+                              Store 109(Color) 111
+             114:      7(ptr) AccessChain 100(psout) 106
+             115:    6(float) Load 114
+                              Store 113(Depth) 115
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
index c54e2d5..949f7f2 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:61  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -151,7 +151,7 @@
 0:54              0.000000
 0:56      move second child to first child (temp 4-component vector of float)
 0:56        Color: direct index for structure (temp 4-component vector of float)
-0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:56          Constant:
 0:56            0 (const int)
 0:56        Constant:
@@ -160,14 +160,27 @@
 0:56          1.000000
 0:56          1.000000
 0:57      move second child to first child (temp float)
-0:57        Depth: direct index for structure (temp float FragDepth)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57        Depth: direct index for structure (temp float)
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            1 (const int)
 0:57        Constant:
 0:57          1.000000
-0:59      Branch: Return with expression
-0:59        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:59          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:59            Color: direct index for structure (temp 4-component vector of float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                0 (const int)
+0:59          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:59            Depth: direct index for structure (temp float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                1 (const int)
+0:59        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -191,6 +204,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -199,7 +214,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:61  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -348,7 +363,7 @@
 0:54              0.000000
 0:56      move second child to first child (temp 4-component vector of float)
 0:56        Color: direct index for structure (temp 4-component vector of float)
-0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:56          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:56          Constant:
 0:56            0 (const int)
 0:56        Constant:
@@ -357,14 +372,27 @@
 0:56          1.000000
 0:56          1.000000
 0:57      move second child to first child (temp float)
-0:57        Depth: direct index for structure (temp float FragDepth)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57        Depth: direct index for structure (temp float)
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            1 (const int)
 0:57        Constant:
 0:57          1.000000
-0:59      Branch: Return with expression
-0:59        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:59          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:59            Color: direct index for structure (temp 4-component vector of float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                0 (const int)
+0:59          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:59            Depth: direct index for structure (temp float)
+0:59              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:59              Constant:
+0:59                1 (const int)
+0:59        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -388,19 +416,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 178
+// Id's are bound by 185
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 141 145
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r10"
                               Name 11  "g_tTex1df4a"
@@ -425,18 +454,20 @@
                               MemberName 130(PS_OUTPUT) 0  "Color"
                               MemberName 130(PS_OUTPUT) 1  "Depth"
                               Name 132  "psout"
-                              Name 144  "g_tTex1df4"
-                              Name 147  "g_tTex1di4"
-                              Name 150  "g_tTex1du4"
-                              Name 153  "g_tTex2df4"
-                              Name 156  "g_tTex2di4"
-                              Name 159  "g_tTex2du4"
-                              Name 162  "g_tTex3df4"
-                              Name 165  "g_tTex3di4"
-                              Name 168  "g_tTex3du4"
-                              Name 171  "g_tTexcdf4"
-                              Name 174  "g_tTexcdi4"
-                              Name 177  "g_tTexcdu4"
+                              Name 141  "Color"
+                              Name 145  "Depth"
+                              Name 151  "g_tTex1df4"
+                              Name 154  "g_tTex1di4"
+                              Name 157  "g_tTex1du4"
+                              Name 160  "g_tTex2df4"
+                              Name 163  "g_tTex2di4"
+                              Name 166  "g_tTex2du4"
+                              Name 169  "g_tTex3df4"
+                              Name 172  "g_tTex3di4"
+                              Name 175  "g_tTex3du4"
+                              Name 178  "g_tTexcdf4"
+                              Name 181  "g_tTexcdi4"
+                              Name 184  "g_tTexcdu4"
                               Decorate 11(g_tTex1df4a) DescriptorSet 0
                               Decorate 15(g_sSamp) DescriptorSet 0
                               Decorate 15(g_sSamp) Binding 0
@@ -448,20 +479,21 @@
                               Decorate 97(g_tTexcdf4a) DescriptorSet 0
                               Decorate 111(g_tTexcdi4a) DescriptorSet 0
                               Decorate 122(g_tTexcdu4a) DescriptorSet 0
-                              MemberDecorate 130(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 144(g_tTex1df4) DescriptorSet 0
-                              Decorate 144(g_tTex1df4) Binding 0
-                              Decorate 147(g_tTex1di4) DescriptorSet 0
-                              Decorate 150(g_tTex1du4) DescriptorSet 0
-                              Decorate 153(g_tTex2df4) DescriptorSet 0
-                              Decorate 156(g_tTex2di4) DescriptorSet 0
-                              Decorate 159(g_tTex2du4) DescriptorSet 0
-                              Decorate 162(g_tTex3df4) DescriptorSet 0
-                              Decorate 165(g_tTex3di4) DescriptorSet 0
-                              Decorate 168(g_tTex3du4) DescriptorSet 0
-                              Decorate 171(g_tTexcdf4) DescriptorSet 0
-                              Decorate 174(g_tTexcdi4) DescriptorSet 0
-                              Decorate 177(g_tTexcdu4) DescriptorSet 0
+                              Decorate 141(Color) Location 0
+                              Decorate 145(Depth) BuiltIn FragDepth
+                              Decorate 151(g_tTex1df4) DescriptorSet 0
+                              Decorate 151(g_tTex1df4) Binding 0
+                              Decorate 154(g_tTex1di4) DescriptorSet 0
+                              Decorate 157(g_tTex1du4) DescriptorSet 0
+                              Decorate 160(g_tTex2df4) DescriptorSet 0
+                              Decorate 163(g_tTex2di4) DescriptorSet 0
+                              Decorate 166(g_tTex2du4) DescriptorSet 0
+                              Decorate 169(g_tTex3df4) DescriptorSet 0
+                              Decorate 172(g_tTex3di4) DescriptorSet 0
+                              Decorate 175(g_tTex3du4) DescriptorSet 0
+                              Decorate 178(g_tTexcdf4) DescriptorSet 0
+                              Decorate 181(g_tTexcdi4) DescriptorSet 0
+                              Decorate 184(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -535,42 +567,46 @@
              135:  103(fvec4) ConstantComposite 134 134 134 134
              136:             TypePointer Function 103(fvec4)
              138:     30(int) Constant 1
-             142:             TypeImage 6(float) 1D sampled format:Unknown
-             143:             TypePointer UniformConstant 142
- 144(g_tTex1df4):    143(ptr) Variable UniformConstant
-             145:             TypeImage 30(int) 1D sampled format:Unknown
-             146:             TypePointer UniformConstant 145
- 147(g_tTex1di4):    146(ptr) Variable UniformConstant
-             148:             TypeImage 43(int) 1D sampled format:Unknown
-             149:             TypePointer UniformConstant 148
- 150(g_tTex1du4):    149(ptr) Variable UniformConstant
-             151:             TypeImage 6(float) 2D sampled format:Unknown
-             152:             TypePointer UniformConstant 151
- 153(g_tTex2df4):    152(ptr) Variable UniformConstant
-             154:             TypeImage 30(int) 2D sampled format:Unknown
-             155:             TypePointer UniformConstant 154
- 156(g_tTex2di4):    155(ptr) Variable UniformConstant
-             157:             TypeImage 43(int) 2D sampled format:Unknown
-             158:             TypePointer UniformConstant 157
- 159(g_tTex2du4):    158(ptr) Variable UniformConstant
-             160:             TypeImage 6(float) 3D sampled format:Unknown
-             161:             TypePointer UniformConstant 160
- 162(g_tTex3df4):    161(ptr) Variable UniformConstant
-             163:             TypeImage 30(int) 3D sampled format:Unknown
-             164:             TypePointer UniformConstant 163
- 165(g_tTex3di4):    164(ptr) Variable UniformConstant
-             166:             TypeImage 43(int) 3D sampled format:Unknown
-             167:             TypePointer UniformConstant 166
- 168(g_tTex3du4):    167(ptr) Variable UniformConstant
-             169:             TypeImage 6(float) Cube sampled format:Unknown
-             170:             TypePointer UniformConstant 169
- 171(g_tTexcdf4):    170(ptr) Variable UniformConstant
-             172:             TypeImage 30(int) Cube sampled format:Unknown
-             173:             TypePointer UniformConstant 172
- 174(g_tTexcdi4):    173(ptr) Variable UniformConstant
-             175:             TypeImage 43(int) Cube sampled format:Unknown
-             176:             TypePointer UniformConstant 175
- 177(g_tTexcdu4):    176(ptr) Variable UniformConstant
+             140:             TypePointer Output 103(fvec4)
+      141(Color):    140(ptr) Variable Output
+             144:             TypePointer Output 6(float)
+      145(Depth):    144(ptr) Variable Output
+             149:             TypeImage 6(float) 1D sampled format:Unknown
+             150:             TypePointer UniformConstant 149
+ 151(g_tTex1df4):    150(ptr) Variable UniformConstant
+             152:             TypeImage 30(int) 1D sampled format:Unknown
+             153:             TypePointer UniformConstant 152
+ 154(g_tTex1di4):    153(ptr) Variable UniformConstant
+             155:             TypeImage 43(int) 1D sampled format:Unknown
+             156:             TypePointer UniformConstant 155
+ 157(g_tTex1du4):    156(ptr) Variable UniformConstant
+             158:             TypeImage 6(float) 2D sampled format:Unknown
+             159:             TypePointer UniformConstant 158
+ 160(g_tTex2df4):    159(ptr) Variable UniformConstant
+             161:             TypeImage 30(int) 2D sampled format:Unknown
+             162:             TypePointer UniformConstant 161
+ 163(g_tTex2di4):    162(ptr) Variable UniformConstant
+             164:             TypeImage 43(int) 2D sampled format:Unknown
+             165:             TypePointer UniformConstant 164
+ 166(g_tTex2du4):    165(ptr) Variable UniformConstant
+             167:             TypeImage 6(float) 3D sampled format:Unknown
+             168:             TypePointer UniformConstant 167
+ 169(g_tTex3df4):    168(ptr) Variable UniformConstant
+             170:             TypeImage 30(int) 3D sampled format:Unknown
+             171:             TypePointer UniformConstant 170
+ 172(g_tTex3di4):    171(ptr) Variable UniformConstant
+             173:             TypeImage 43(int) 3D sampled format:Unknown
+             174:             TypePointer UniformConstant 173
+ 175(g_tTex3du4):    174(ptr) Variable UniformConstant
+             176:             TypeImage 6(float) Cube sampled format:Unknown
+             177:             TypePointer UniformConstant 176
+ 178(g_tTexcdf4):    177(ptr) Variable UniformConstant
+             179:             TypeImage 30(int) Cube sampled format:Unknown
+             180:             TypePointer UniformConstant 179
+ 181(g_tTexcdi4):    180(ptr) Variable UniformConstant
+             182:             TypeImage 43(int) Cube sampled format:Unknown
+             183:             TypePointer UniformConstant 182
+ 184(g_tTexcdu4):    183(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r10):      7(ptr) Variable Function
@@ -647,6 +683,11 @@
                               Store 137 135
              139:      7(ptr) AccessChain 132(psout) 138
                               Store 139 134
-             140:130(PS_OUTPUT) Load 132(psout)
-                              ReturnValue 140
+             142:    136(ptr) AccessChain 132(psout) 133
+             143:  103(fvec4) Load 142
+                              Store 141(Color) 143
+             146:      7(ptr) AccessChain 132(psout) 138
+             147:    6(float) Load 146
+                              Store 145(Depth) 147
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
index 1fbdb48..5f83499 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:62  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -142,7 +142,7 @@
 0:55              0.000000
 0:57      move second child to first child (temp 4-component vector of float)
 0:57        Color: direct index for structure (temp 4-component vector of float)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            0 (const int)
 0:57        Constant:
@@ -151,14 +151,27 @@
 0:57          1.000000
 0:57          1.000000
 0:58      move second child to first child (temp float)
-0:58        Depth: direct index for structure (temp float FragDepth)
-0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:58        Depth: direct index for structure (temp float)
+0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:58          Constant:
 0:58            1 (const int)
 0:58        Constant:
 0:58          1.000000
-0:60      Branch: Return with expression
-0:60        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:60          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:60            Color: direct index for structure (temp 4-component vector of float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                0 (const int)
+0:60          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:60            Depth: direct index for structure (temp float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                1 (const int)
+0:60        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -182,6 +195,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -190,7 +205,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:62  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -330,7 +345,7 @@
 0:55              0.000000
 0:57      move second child to first child (temp 4-component vector of float)
 0:57        Color: direct index for structure (temp 4-component vector of float)
-0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:57          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:57          Constant:
 0:57            0 (const int)
 0:57        Constant:
@@ -339,14 +354,27 @@
 0:57          1.000000
 0:57          1.000000
 0:58      move second child to first child (temp float)
-0:58        Depth: direct index for structure (temp float FragDepth)
-0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:58        Depth: direct index for structure (temp float)
+0:58          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:58          Constant:
 0:58            1 (const int)
 0:58        Constant:
 0:58          1.000000
-0:60      Branch: Return with expression
-0:60        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:60          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:60            Color: direct index for structure (temp 4-component vector of float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                0 (const int)
+0:60          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:60            Depth: direct index for structure (temp float)
+0:60              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:60              Constant:
+0:60                1 (const int)
+0:60        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -370,19 +398,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 176
+// Id's are bound by 183
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 139 143
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r00"
                               Name 11  "g_tTex1df4"
@@ -407,18 +436,20 @@
                               MemberName 128(PS_OUTPUT) 0  "Color"
                               MemberName 128(PS_OUTPUT) 1  "Depth"
                               Name 130  "psout"
-                              Name 142  "g_tTex3df4"
-                              Name 145  "g_tTex3di4"
-                              Name 148  "g_tTex3du4"
-                              Name 151  "g_tTex1df4a"
-                              Name 154  "g_tTex1di4a"
-                              Name 157  "g_tTex1du4a"
-                              Name 160  "g_tTex2df4a"
-                              Name 163  "g_tTex2di4a"
-                              Name 166  "g_tTex2du4a"
-                              Name 169  "g_tTexcdf4a"
-                              Name 172  "g_tTexcdi4a"
-                              Name 175  "g_tTexcdu4a"
+                              Name 139  "Color"
+                              Name 143  "Depth"
+                              Name 149  "g_tTex3df4"
+                              Name 152  "g_tTex3di4"
+                              Name 155  "g_tTex3du4"
+                              Name 158  "g_tTex1df4a"
+                              Name 161  "g_tTex1di4a"
+                              Name 164  "g_tTex1du4a"
+                              Name 167  "g_tTex2df4a"
+                              Name 170  "g_tTex2di4a"
+                              Name 173  "g_tTex2du4a"
+                              Name 176  "g_tTexcdf4a"
+                              Name 179  "g_tTexcdi4a"
+                              Name 182  "g_tTexcdu4a"
                               Decorate 11(g_tTex1df4) DescriptorSet 0
                               Decorate 11(g_tTex1df4) Binding 0
                               Decorate 15(g_sSamp) DescriptorSet 0
@@ -431,19 +462,20 @@
                               Decorate 91(g_tTexcdf4) DescriptorSet 0
                               Decorate 106(g_tTexcdi4) DescriptorSet 0
                               Decorate 118(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 128(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 142(g_tTex3df4) DescriptorSet 0
-                              Decorate 145(g_tTex3di4) DescriptorSet 0
-                              Decorate 148(g_tTex3du4) DescriptorSet 0
-                              Decorate 151(g_tTex1df4a) DescriptorSet 0
-                              Decorate 154(g_tTex1di4a) DescriptorSet 0
-                              Decorate 157(g_tTex1du4a) DescriptorSet 0
-                              Decorate 160(g_tTex2df4a) DescriptorSet 0
-                              Decorate 163(g_tTex2di4a) DescriptorSet 0
-                              Decorate 166(g_tTex2du4a) DescriptorSet 0
-                              Decorate 169(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 172(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 175(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 139(Color) Location 0
+                              Decorate 143(Depth) BuiltIn FragDepth
+                              Decorate 149(g_tTex3df4) DescriptorSet 0
+                              Decorate 152(g_tTex3di4) DescriptorSet 0
+                              Decorate 155(g_tTex3du4) DescriptorSet 0
+                              Decorate 158(g_tTex1df4a) DescriptorSet 0
+                              Decorate 161(g_tTex1di4a) DescriptorSet 0
+                              Decorate 164(g_tTex1du4a) DescriptorSet 0
+                              Decorate 167(g_tTex2df4a) DescriptorSet 0
+                              Decorate 170(g_tTex2di4a) DescriptorSet 0
+                              Decorate 173(g_tTex2du4a) DescriptorSet 0
+                              Decorate 176(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 179(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 182(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -515,42 +547,46 @@
              133:  127(fvec4) ConstantComposite 132 132 132 132
              134:             TypePointer Function 127(fvec4)
              136:     26(int) Constant 1
-             140:             TypeImage 6(float) 3D sampled format:Unknown
-             141:             TypePointer UniformConstant 140
- 142(g_tTex3df4):    141(ptr) Variable UniformConstant
-             143:             TypeImage 26(int) 3D sampled format:Unknown
-             144:             TypePointer UniformConstant 143
- 145(g_tTex3di4):    144(ptr) Variable UniformConstant
-             146:             TypeImage 38(int) 3D sampled format:Unknown
-             147:             TypePointer UniformConstant 146
- 148(g_tTex3du4):    147(ptr) Variable UniformConstant
-             149:             TypeImage 6(float) 1D array sampled format:Unknown
-             150:             TypePointer UniformConstant 149
-151(g_tTex1df4a):    150(ptr) Variable UniformConstant
-             152:             TypeImage 26(int) 1D array sampled format:Unknown
-             153:             TypePointer UniformConstant 152
-154(g_tTex1di4a):    153(ptr) Variable UniformConstant
-             155:             TypeImage 38(int) 1D array sampled format:Unknown
-             156:             TypePointer UniformConstant 155
-157(g_tTex1du4a):    156(ptr) Variable UniformConstant
-             158:             TypeImage 6(float) 2D array sampled format:Unknown
-             159:             TypePointer UniformConstant 158
-160(g_tTex2df4a):    159(ptr) Variable UniformConstant
-             161:             TypeImage 26(int) 2D array sampled format:Unknown
-             162:             TypePointer UniformConstant 161
-163(g_tTex2di4a):    162(ptr) Variable UniformConstant
-             164:             TypeImage 38(int) 2D array sampled format:Unknown
-             165:             TypePointer UniformConstant 164
-166(g_tTex2du4a):    165(ptr) Variable UniformConstant
-             167:             TypeImage 6(float) Cube array sampled format:Unknown
-             168:             TypePointer UniformConstant 167
-169(g_tTexcdf4a):    168(ptr) Variable UniformConstant
-             170:             TypeImage 26(int) Cube array sampled format:Unknown
-             171:             TypePointer UniformConstant 170
-172(g_tTexcdi4a):    171(ptr) Variable UniformConstant
-             173:             TypeImage 38(int) Cube array sampled format:Unknown
-             174:             TypePointer UniformConstant 173
-175(g_tTexcdu4a):    174(ptr) Variable UniformConstant
+             138:             TypePointer Output 127(fvec4)
+      139(Color):    138(ptr) Variable Output
+             142:             TypePointer Output 6(float)
+      143(Depth):    142(ptr) Variable Output
+             147:             TypeImage 6(float) 3D sampled format:Unknown
+             148:             TypePointer UniformConstant 147
+ 149(g_tTex3df4):    148(ptr) Variable UniformConstant
+             150:             TypeImage 26(int) 3D sampled format:Unknown
+             151:             TypePointer UniformConstant 150
+ 152(g_tTex3di4):    151(ptr) Variable UniformConstant
+             153:             TypeImage 38(int) 3D sampled format:Unknown
+             154:             TypePointer UniformConstant 153
+ 155(g_tTex3du4):    154(ptr) Variable UniformConstant
+             156:             TypeImage 6(float) 1D array sampled format:Unknown
+             157:             TypePointer UniformConstant 156
+158(g_tTex1df4a):    157(ptr) Variable UniformConstant
+             159:             TypeImage 26(int) 1D array sampled format:Unknown
+             160:             TypePointer UniformConstant 159
+161(g_tTex1di4a):    160(ptr) Variable UniformConstant
+             162:             TypeImage 38(int) 1D array sampled format:Unknown
+             163:             TypePointer UniformConstant 162
+164(g_tTex1du4a):    163(ptr) Variable UniformConstant
+             165:             TypeImage 6(float) 2D array sampled format:Unknown
+             166:             TypePointer UniformConstant 165
+167(g_tTex2df4a):    166(ptr) Variable UniformConstant
+             168:             TypeImage 26(int) 2D array sampled format:Unknown
+             169:             TypePointer UniformConstant 168
+170(g_tTex2di4a):    169(ptr) Variable UniformConstant
+             171:             TypeImage 38(int) 2D array sampled format:Unknown
+             172:             TypePointer UniformConstant 171
+173(g_tTex2du4a):    172(ptr) Variable UniformConstant
+             174:             TypeImage 6(float) Cube array sampled format:Unknown
+             175:             TypePointer UniformConstant 174
+176(g_tTexcdf4a):    175(ptr) Variable UniformConstant
+             177:             TypeImage 26(int) Cube array sampled format:Unknown
+             178:             TypePointer UniformConstant 177
+179(g_tTexcdi4a):    178(ptr) Variable UniformConstant
+             180:             TypeImage 38(int) Cube array sampled format:Unknown
+             181:             TypePointer UniformConstant 180
+182(g_tTexcdu4a):    181(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r00):      7(ptr) Variable Function
@@ -627,6 +663,11 @@
                               Store 135 133
              137:      7(ptr) AccessChain 130(psout) 136
                               Store 137 132
-             138:128(PS_OUTPUT) Load 130(psout)
-                              ReturnValue 138
+             140:    134(ptr) AccessChain 130(psout) 131
+             141:  127(fvec4) Load 140
+                              Store 139(Color) 141
+             144:      7(ptr) AccessChain 130(psout) 136
+             145:    6(float) Load 144
+                              Store 143(Depth) 145
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
index 68d07d5..ceb1415 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:67  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -109,7 +109,7 @@
 0:?               3 (const int)
 0:62      move second child to first child (temp 4-component vector of float)
 0:62        Color: direct index for structure (temp 4-component vector of float)
-0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:62          Constant:
 0:62            0 (const int)
 0:62        Constant:
@@ -118,14 +118,27 @@
 0:62          1.000000
 0:62          1.000000
 0:63      move second child to first child (temp float)
-0:63        Depth: direct index for structure (temp float FragDepth)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63        Depth: direct index for structure (temp float)
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            1 (const int)
 0:63        Constant:
 0:63          1.000000
-0:65      Branch: Return with expression
-0:65        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:65          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:65            Color: direct index for structure (temp 4-component vector of float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                0 (const int)
+0:65          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:65            Depth: direct index for structure (temp float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                1 (const int)
+0:65        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -149,6 +162,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -157,7 +172,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:67  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -264,7 +279,7 @@
 0:?               3 (const int)
 0:62      move second child to first child (temp 4-component vector of float)
 0:62        Color: direct index for structure (temp 4-component vector of float)
-0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:62          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:62          Constant:
 0:62            0 (const int)
 0:62        Constant:
@@ -273,14 +288,27 @@
 0:62          1.000000
 0:62          1.000000
 0:63      move second child to first child (temp float)
-0:63        Depth: direct index for structure (temp float FragDepth)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63        Depth: direct index for structure (temp float)
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            1 (const int)
 0:63        Constant:
 0:63          1.000000
-0:65      Branch: Return with expression
-0:65        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:65          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:65            Color: direct index for structure (temp 4-component vector of float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                0 (const int)
+0:65          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:65            Depth: direct index for structure (temp float)
+0:65              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:65              Constant:
+0:65                1 (const int)
+0:65        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -304,19 +332,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 150
+// Id's are bound by 157
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 104 108
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r01"
                               Name 11  "g_tTex1df4"
@@ -335,21 +364,23 @@
                               MemberName 93(PS_OUTPUT) 0  "Color"
                               MemberName 93(PS_OUTPUT) 1  "Depth"
                               Name 95  "psout"
-                              Name 107  "g_tTex3df4"
-                              Name 110  "g_tTex3di4"
-                              Name 113  "g_tTex3du4"
-                              Name 116  "g_tTexcdf4"
-                              Name 119  "g_tTexcdi4"
-                              Name 122  "g_tTexcdu4"
-                              Name 125  "g_tTex1df4a"
-                              Name 128  "g_tTex1di4a"
-                              Name 131  "g_tTex1du4a"
-                              Name 134  "g_tTex2df4a"
-                              Name 137  "g_tTex2di4a"
-                              Name 140  "g_tTex2du4a"
-                              Name 143  "g_tTexcdf4a"
-                              Name 146  "g_tTexcdi4a"
-                              Name 149  "g_tTexcdu4a"
+                              Name 104  "Color"
+                              Name 108  "Depth"
+                              Name 114  "g_tTex3df4"
+                              Name 117  "g_tTex3di4"
+                              Name 120  "g_tTex3du4"
+                              Name 123  "g_tTexcdf4"
+                              Name 126  "g_tTexcdi4"
+                              Name 129  "g_tTexcdu4"
+                              Name 132  "g_tTex1df4a"
+                              Name 135  "g_tTex1di4a"
+                              Name 138  "g_tTex1du4a"
+                              Name 141  "g_tTex2df4a"
+                              Name 144  "g_tTex2di4a"
+                              Name 147  "g_tTex2du4a"
+                              Name 150  "g_tTexcdf4a"
+                              Name 153  "g_tTexcdi4a"
+                              Name 156  "g_tTexcdu4a"
                               Decorate 11(g_tTex1df4) DescriptorSet 0
                               Decorate 11(g_tTex1df4) Binding 0
                               Decorate 15(g_sSamp) DescriptorSet 0
@@ -359,22 +390,23 @@
                               Decorate 53(g_tTex2df4) DescriptorSet 0
                               Decorate 71(g_tTex2di4) DescriptorSet 0
                               Decorate 83(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 93(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 107(g_tTex3df4) DescriptorSet 0
-                              Decorate 110(g_tTex3di4) DescriptorSet 0
-                              Decorate 113(g_tTex3du4) DescriptorSet 0
-                              Decorate 116(g_tTexcdf4) DescriptorSet 0
-                              Decorate 119(g_tTexcdi4) DescriptorSet 0
-                              Decorate 122(g_tTexcdu4) DescriptorSet 0
-                              Decorate 125(g_tTex1df4a) DescriptorSet 0
-                              Decorate 128(g_tTex1di4a) DescriptorSet 0
-                              Decorate 131(g_tTex1du4a) DescriptorSet 0
-                              Decorate 134(g_tTex2df4a) DescriptorSet 0
-                              Decorate 137(g_tTex2di4a) DescriptorSet 0
-                              Decorate 140(g_tTex2du4a) DescriptorSet 0
-                              Decorate 143(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 146(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 149(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 104(Color) Location 0
+                              Decorate 108(Depth) BuiltIn FragDepth
+                              Decorate 114(g_tTex3df4) DescriptorSet 0
+                              Decorate 117(g_tTex3di4) DescriptorSet 0
+                              Decorate 120(g_tTex3du4) DescriptorSet 0
+                              Decorate 123(g_tTexcdf4) DescriptorSet 0
+                              Decorate 126(g_tTexcdi4) DescriptorSet 0
+                              Decorate 129(g_tTexcdu4) DescriptorSet 0
+                              Decorate 132(g_tTex1df4a) DescriptorSet 0
+                              Decorate 135(g_tTex1di4a) DescriptorSet 0
+                              Decorate 138(g_tTex1du4a) DescriptorSet 0
+                              Decorate 141(g_tTex2df4a) DescriptorSet 0
+                              Decorate 144(g_tTex2di4a) DescriptorSet 0
+                              Decorate 147(g_tTex2du4a) DescriptorSet 0
+                              Decorate 150(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 153(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 156(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -432,51 +464,55 @@
               98:   92(fvec4) ConstantComposite 97 97 97 97
               99:             TypePointer Function 92(fvec4)
              101:     23(int) Constant 1
-             105:             TypeImage 6(float) 3D sampled format:Unknown
-             106:             TypePointer UniformConstant 105
- 107(g_tTex3df4):    106(ptr) Variable UniformConstant
-             108:             TypeImage 23(int) 3D sampled format:Unknown
-             109:             TypePointer UniformConstant 108
- 110(g_tTex3di4):    109(ptr) Variable UniformConstant
-             111:             TypeImage 39(int) 3D sampled format:Unknown
-             112:             TypePointer UniformConstant 111
- 113(g_tTex3du4):    112(ptr) Variable UniformConstant
-             114:             TypeImage 6(float) Cube sampled format:Unknown
-             115:             TypePointer UniformConstant 114
- 116(g_tTexcdf4):    115(ptr) Variable UniformConstant
-             117:             TypeImage 23(int) Cube sampled format:Unknown
-             118:             TypePointer UniformConstant 117
- 119(g_tTexcdi4):    118(ptr) Variable UniformConstant
-             120:             TypeImage 39(int) Cube sampled format:Unknown
-             121:             TypePointer UniformConstant 120
- 122(g_tTexcdu4):    121(ptr) Variable UniformConstant
-             123:             TypeImage 6(float) 1D array sampled format:Unknown
-             124:             TypePointer UniformConstant 123
-125(g_tTex1df4a):    124(ptr) Variable UniformConstant
-             126:             TypeImage 23(int) 1D array sampled format:Unknown
-             127:             TypePointer UniformConstant 126
-128(g_tTex1di4a):    127(ptr) Variable UniformConstant
-             129:             TypeImage 39(int) 1D array sampled format:Unknown
-             130:             TypePointer UniformConstant 129
-131(g_tTex1du4a):    130(ptr) Variable UniformConstant
-             132:             TypeImage 6(float) 2D array sampled format:Unknown
-             133:             TypePointer UniformConstant 132
-134(g_tTex2df4a):    133(ptr) Variable UniformConstant
-             135:             TypeImage 23(int) 2D array sampled format:Unknown
-             136:             TypePointer UniformConstant 135
-137(g_tTex2di4a):    136(ptr) Variable UniformConstant
-             138:             TypeImage 39(int) 2D array sampled format:Unknown
-             139:             TypePointer UniformConstant 138
-140(g_tTex2du4a):    139(ptr) Variable UniformConstant
-             141:             TypeImage 6(float) Cube array sampled format:Unknown
-             142:             TypePointer UniformConstant 141
-143(g_tTexcdf4a):    142(ptr) Variable UniformConstant
-             144:             TypeImage 23(int) Cube array sampled format:Unknown
-             145:             TypePointer UniformConstant 144
-146(g_tTexcdi4a):    145(ptr) Variable UniformConstant
-             147:             TypeImage 39(int) Cube array sampled format:Unknown
-             148:             TypePointer UniformConstant 147
-149(g_tTexcdu4a):    148(ptr) Variable UniformConstant
+             103:             TypePointer Output 92(fvec4)
+      104(Color):    103(ptr) Variable Output
+             107:             TypePointer Output 6(float)
+      108(Depth):    107(ptr) Variable Output
+             112:             TypeImage 6(float) 3D sampled format:Unknown
+             113:             TypePointer UniformConstant 112
+ 114(g_tTex3df4):    113(ptr) Variable UniformConstant
+             115:             TypeImage 23(int) 3D sampled format:Unknown
+             116:             TypePointer UniformConstant 115
+ 117(g_tTex3di4):    116(ptr) Variable UniformConstant
+             118:             TypeImage 39(int) 3D sampled format:Unknown
+             119:             TypePointer UniformConstant 118
+ 120(g_tTex3du4):    119(ptr) Variable UniformConstant
+             121:             TypeImage 6(float) Cube sampled format:Unknown
+             122:             TypePointer UniformConstant 121
+ 123(g_tTexcdf4):    122(ptr) Variable UniformConstant
+             124:             TypeImage 23(int) Cube sampled format:Unknown
+             125:             TypePointer UniformConstant 124
+ 126(g_tTexcdi4):    125(ptr) Variable UniformConstant
+             127:             TypeImage 39(int) Cube sampled format:Unknown
+             128:             TypePointer UniformConstant 127
+ 129(g_tTexcdu4):    128(ptr) Variable UniformConstant
+             130:             TypeImage 6(float) 1D array sampled format:Unknown
+             131:             TypePointer UniformConstant 130
+132(g_tTex1df4a):    131(ptr) Variable UniformConstant
+             133:             TypeImage 23(int) 1D array sampled format:Unknown
+             134:             TypePointer UniformConstant 133
+135(g_tTex1di4a):    134(ptr) Variable UniformConstant
+             136:             TypeImage 39(int) 1D array sampled format:Unknown
+             137:             TypePointer UniformConstant 136
+138(g_tTex1du4a):    137(ptr) Variable UniformConstant
+             139:             TypeImage 6(float) 2D array sampled format:Unknown
+             140:             TypePointer UniformConstant 139
+141(g_tTex2df4a):    140(ptr) Variable UniformConstant
+             142:             TypeImage 23(int) 2D array sampled format:Unknown
+             143:             TypePointer UniformConstant 142
+144(g_tTex2di4a):    143(ptr) Variable UniformConstant
+             145:             TypeImage 39(int) 2D array sampled format:Unknown
+             146:             TypePointer UniformConstant 145
+147(g_tTex2du4a):    146(ptr) Variable UniformConstant
+             148:             TypeImage 6(float) Cube array sampled format:Unknown
+             149:             TypePointer UniformConstant 148
+150(g_tTexcdf4a):    149(ptr) Variable UniformConstant
+             151:             TypeImage 23(int) Cube array sampled format:Unknown
+             152:             TypePointer UniformConstant 151
+153(g_tTexcdi4a):    152(ptr) Variable UniformConstant
+             154:             TypeImage 39(int) Cube array sampled format:Unknown
+             155:             TypePointer UniformConstant 154
+156(g_tTexcdu4a):    155(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r01):      7(ptr) Variable Function
@@ -529,6 +565,11 @@
                               Store 100 98
              102:      7(ptr) AccessChain 95(psout) 101
                               Store 102 97
-             103:93(PS_OUTPUT) Load 95(psout)
-                              ReturnValue 103
+             105:     99(ptr) AccessChain 95(psout) 96
+             106:   92(fvec4) Load 105
+                              Store 104(Color) 106
+             109:      7(ptr) AccessChain 95(psout) 101
+             110:    6(float) Load 109
+                              Store 108(Depth) 110
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
index 627b023..ea32bce 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:68  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -115,7 +115,7 @@
 0:?               3 (const int)
 0:63      move second child to first child (temp 4-component vector of float)
 0:63        Color: direct index for structure (temp 4-component vector of float)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            0 (const int)
 0:63        Constant:
@@ -124,14 +124,27 @@
 0:63          1.000000
 0:63          1.000000
 0:64      move second child to first child (temp float)
-0:64        Depth: direct index for structure (temp float FragDepth)
-0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:64        Depth: direct index for structure (temp float)
+0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:64          Constant:
 0:64            1 (const int)
 0:64        Constant:
 0:64          1.000000
-0:66      Branch: Return with expression
-0:66        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:66          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:66            Color: direct index for structure (temp 4-component vector of float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                0 (const int)
+0:66          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:66            Depth: direct index for structure (temp float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                1 (const int)
+0:66        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -155,6 +168,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -163,7 +178,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:68  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:38    Function Parameters: 
 0:?     Sequence
 0:42      Sequence
@@ -276,7 +291,7 @@
 0:?               3 (const int)
 0:63      move second child to first child (temp 4-component vector of float)
 0:63        Color: direct index for structure (temp 4-component vector of float)
-0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:63          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:63          Constant:
 0:63            0 (const int)
 0:63        Constant:
@@ -285,14 +300,27 @@
 0:63          1.000000
 0:63          1.000000
 0:64      move second child to first child (temp float)
-0:64        Depth: direct index for structure (temp float FragDepth)
-0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:64        Depth: direct index for structure (temp float)
+0:64          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:64          Constant:
 0:64            1 (const int)
 0:64        Constant:
 0:64          1.000000
-0:66      Branch: Return with expression
-0:66        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:66          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:66            Color: direct index for structure (temp 4-component vector of float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                0 (const int)
+0:66          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:66            Depth: direct index for structure (temp float)
+0:66              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:66              Constant:
+0:66                1 (const int)
+0:66        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
@@ -316,19 +344,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 156
+// Id's are bound by 163
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 110 114
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 8  "r11"
                               Name 11  "g_tTex1df4a"
@@ -347,21 +376,23 @@
                               MemberName 99(PS_OUTPUT) 0  "Color"
                               MemberName 99(PS_OUTPUT) 1  "Depth"
                               Name 101  "psout"
-                              Name 113  "g_tTex1df4"
-                              Name 116  "g_tTex1di4"
-                              Name 119  "g_tTex1du4"
-                              Name 122  "g_tTex2df4"
-                              Name 125  "g_tTex2di4"
-                              Name 128  "g_tTex2du4"
-                              Name 131  "g_tTex3df4"
-                              Name 134  "g_tTex3di4"
-                              Name 137  "g_tTex3du4"
-                              Name 140  "g_tTexcdf4"
-                              Name 143  "g_tTexcdi4"
-                              Name 146  "g_tTexcdu4"
-                              Name 149  "g_tTexcdf4a"
-                              Name 152  "g_tTexcdi4a"
-                              Name 155  "g_tTexcdu4a"
+                              Name 110  "Color"
+                              Name 114  "Depth"
+                              Name 120  "g_tTex1df4"
+                              Name 123  "g_tTex1di4"
+                              Name 126  "g_tTex1du4"
+                              Name 129  "g_tTex2df4"
+                              Name 132  "g_tTex2di4"
+                              Name 135  "g_tTex2du4"
+                              Name 138  "g_tTex3df4"
+                              Name 141  "g_tTex3di4"
+                              Name 144  "g_tTex3du4"
+                              Name 147  "g_tTexcdf4"
+                              Name 150  "g_tTexcdi4"
+                              Name 153  "g_tTexcdu4"
+                              Name 156  "g_tTexcdf4a"
+                              Name 159  "g_tTexcdi4a"
+                              Name 162  "g_tTexcdu4a"
                               Decorate 11(g_tTex1df4a) DescriptorSet 0
                               Decorate 15(g_sSamp) DescriptorSet 0
                               Decorate 15(g_sSamp) Binding 0
@@ -370,23 +401,24 @@
                               Decorate 59(g_tTex2df4a) DescriptorSet 0
                               Decorate 77(g_tTex2di4a) DescriptorSet 0
                               Decorate 89(g_tTex2du4a) DescriptorSet 0
-                              MemberDecorate 99(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 113(g_tTex1df4) DescriptorSet 0
-                              Decorate 113(g_tTex1df4) Binding 0
-                              Decorate 116(g_tTex1di4) DescriptorSet 0
-                              Decorate 119(g_tTex1du4) DescriptorSet 0
-                              Decorate 122(g_tTex2df4) DescriptorSet 0
-                              Decorate 125(g_tTex2di4) DescriptorSet 0
-                              Decorate 128(g_tTex2du4) DescriptorSet 0
-                              Decorate 131(g_tTex3df4) DescriptorSet 0
-                              Decorate 134(g_tTex3di4) DescriptorSet 0
-                              Decorate 137(g_tTex3du4) DescriptorSet 0
-                              Decorate 140(g_tTexcdf4) DescriptorSet 0
-                              Decorate 143(g_tTexcdi4) DescriptorSet 0
-                              Decorate 146(g_tTexcdu4) DescriptorSet 0
-                              Decorate 149(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 152(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 155(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 110(Color) Location 0
+                              Decorate 114(Depth) BuiltIn FragDepth
+                              Decorate 120(g_tTex1df4) DescriptorSet 0
+                              Decorate 120(g_tTex1df4) Binding 0
+                              Decorate 123(g_tTex1di4) DescriptorSet 0
+                              Decorate 126(g_tTex1du4) DescriptorSet 0
+                              Decorate 129(g_tTex2df4) DescriptorSet 0
+                              Decorate 132(g_tTex2di4) DescriptorSet 0
+                              Decorate 135(g_tTex2du4) DescriptorSet 0
+                              Decorate 138(g_tTex3df4) DescriptorSet 0
+                              Decorate 141(g_tTex3di4) DescriptorSet 0
+                              Decorate 144(g_tTex3du4) DescriptorSet 0
+                              Decorate 147(g_tTexcdf4) DescriptorSet 0
+                              Decorate 150(g_tTexcdi4) DescriptorSet 0
+                              Decorate 153(g_tTexcdu4) DescriptorSet 0
+                              Decorate 156(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 159(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 162(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -447,51 +479,55 @@
              104:   98(fvec4) ConstantComposite 103 103 103 103
              105:             TypePointer Function 98(fvec4)
              107:     27(int) Constant 1
-             111:             TypeImage 6(float) 1D sampled format:Unknown
-             112:             TypePointer UniformConstant 111
- 113(g_tTex1df4):    112(ptr) Variable UniformConstant
-             114:             TypeImage 27(int) 1D sampled format:Unknown
-             115:             TypePointer UniformConstant 114
- 116(g_tTex1di4):    115(ptr) Variable UniformConstant
-             117:             TypeImage 44(int) 1D sampled format:Unknown
-             118:             TypePointer UniformConstant 117
- 119(g_tTex1du4):    118(ptr) Variable UniformConstant
-             120:             TypeImage 6(float) 2D sampled format:Unknown
-             121:             TypePointer UniformConstant 120
- 122(g_tTex2df4):    121(ptr) Variable UniformConstant
-             123:             TypeImage 27(int) 2D sampled format:Unknown
-             124:             TypePointer UniformConstant 123
- 125(g_tTex2di4):    124(ptr) Variable UniformConstant
-             126:             TypeImage 44(int) 2D sampled format:Unknown
-             127:             TypePointer UniformConstant 126
- 128(g_tTex2du4):    127(ptr) Variable UniformConstant
-             129:             TypeImage 6(float) 3D sampled format:Unknown
-             130:             TypePointer UniformConstant 129
- 131(g_tTex3df4):    130(ptr) Variable UniformConstant
-             132:             TypeImage 27(int) 3D sampled format:Unknown
-             133:             TypePointer UniformConstant 132
- 134(g_tTex3di4):    133(ptr) Variable UniformConstant
-             135:             TypeImage 44(int) 3D sampled format:Unknown
-             136:             TypePointer UniformConstant 135
- 137(g_tTex3du4):    136(ptr) Variable UniformConstant
-             138:             TypeImage 6(float) Cube sampled format:Unknown
-             139:             TypePointer UniformConstant 138
- 140(g_tTexcdf4):    139(ptr) Variable UniformConstant
-             141:             TypeImage 27(int) Cube sampled format:Unknown
-             142:             TypePointer UniformConstant 141
- 143(g_tTexcdi4):    142(ptr) Variable UniformConstant
-             144:             TypeImage 44(int) Cube sampled format:Unknown
-             145:             TypePointer UniformConstant 144
- 146(g_tTexcdu4):    145(ptr) Variable UniformConstant
-             147:             TypeImage 6(float) Cube array sampled format:Unknown
-             148:             TypePointer UniformConstant 147
-149(g_tTexcdf4a):    148(ptr) Variable UniformConstant
-             150:             TypeImage 27(int) Cube array sampled format:Unknown
-             151:             TypePointer UniformConstant 150
-152(g_tTexcdi4a):    151(ptr) Variable UniformConstant
-             153:             TypeImage 44(int) Cube array sampled format:Unknown
-             154:             TypePointer UniformConstant 153
-155(g_tTexcdu4a):    154(ptr) Variable UniformConstant
+             109:             TypePointer Output 98(fvec4)
+      110(Color):    109(ptr) Variable Output
+             113:             TypePointer Output 6(float)
+      114(Depth):    113(ptr) Variable Output
+             118:             TypeImage 6(float) 1D sampled format:Unknown
+             119:             TypePointer UniformConstant 118
+ 120(g_tTex1df4):    119(ptr) Variable UniformConstant
+             121:             TypeImage 27(int) 1D sampled format:Unknown
+             122:             TypePointer UniformConstant 121
+ 123(g_tTex1di4):    122(ptr) Variable UniformConstant
+             124:             TypeImage 44(int) 1D sampled format:Unknown
+             125:             TypePointer UniformConstant 124
+ 126(g_tTex1du4):    125(ptr) Variable UniformConstant
+             127:             TypeImage 6(float) 2D sampled format:Unknown
+             128:             TypePointer UniformConstant 127
+ 129(g_tTex2df4):    128(ptr) Variable UniformConstant
+             130:             TypeImage 27(int) 2D sampled format:Unknown
+             131:             TypePointer UniformConstant 130
+ 132(g_tTex2di4):    131(ptr) Variable UniformConstant
+             133:             TypeImage 44(int) 2D sampled format:Unknown
+             134:             TypePointer UniformConstant 133
+ 135(g_tTex2du4):    134(ptr) Variable UniformConstant
+             136:             TypeImage 6(float) 3D sampled format:Unknown
+             137:             TypePointer UniformConstant 136
+ 138(g_tTex3df4):    137(ptr) Variable UniformConstant
+             139:             TypeImage 27(int) 3D sampled format:Unknown
+             140:             TypePointer UniformConstant 139
+ 141(g_tTex3di4):    140(ptr) Variable UniformConstant
+             142:             TypeImage 44(int) 3D sampled format:Unknown
+             143:             TypePointer UniformConstant 142
+ 144(g_tTex3du4):    143(ptr) Variable UniformConstant
+             145:             TypeImage 6(float) Cube sampled format:Unknown
+             146:             TypePointer UniformConstant 145
+ 147(g_tTexcdf4):    146(ptr) Variable UniformConstant
+             148:             TypeImage 27(int) Cube sampled format:Unknown
+             149:             TypePointer UniformConstant 148
+ 150(g_tTexcdi4):    149(ptr) Variable UniformConstant
+             151:             TypeImage 44(int) Cube sampled format:Unknown
+             152:             TypePointer UniformConstant 151
+ 153(g_tTexcdu4):    152(ptr) Variable UniformConstant
+             154:             TypeImage 6(float) Cube array sampled format:Unknown
+             155:             TypePointer UniformConstant 154
+156(g_tTexcdf4a):    155(ptr) Variable UniformConstant
+             157:             TypeImage 27(int) Cube array sampled format:Unknown
+             158:             TypePointer UniformConstant 157
+159(g_tTexcdi4a):    158(ptr) Variable UniformConstant
+             160:             TypeImage 44(int) Cube array sampled format:Unknown
+             161:             TypePointer UniformConstant 160
+162(g_tTexcdu4a):    161(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
           8(r11):      7(ptr) Variable Function
@@ -547,6 +583,11 @@
                               Store 106 104
              108:      7(ptr) AccessChain 101(psout) 107
                               Store 108 103
-             109:99(PS_OUTPUT) Load 101(psout)
-                              ReturnValue 109
+             111:    105(ptr) AccessChain 101(psout) 102
+             112:   98(fvec4) Load 111
+                              Store 110(Color) 112
+             115:      7(ptr) AccessChain 101(psout) 107
+             116:    6(float) Load 115
+                              Store 114(Depth) 116
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
index 6da919a..16f575a 100644
--- a/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -160,7 +160,7 @@
 0:?               1.300000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -169,14 +169,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -189,6 +202,8 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -197,7 +212,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -355,7 +370,7 @@
 0:?               1.300000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -364,14 +379,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -384,19 +412,20 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 126
+// Id's are bound by 133
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 124 128
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -421,7 +450,9 @@
                               MemberName 113(PS_OUTPUT) 0  "Color"
                               MemberName 113(PS_OUTPUT) 1  "Depth"
                               Name 115  "psout"
-                              Name 125  "g_tTex1df4a"
+                              Name 124  "Color"
+                              Name 128  "Depth"
+                              Name 132  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -434,9 +465,10 @@
                               Decorate 85(g_tTexcdf4) DescriptorSet 0
                               Decorate 98(g_tTexcdi4) DescriptorSet 0
                               Decorate 107(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 113(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 125(g_tTex1df4a) DescriptorSet 0
-                              Decorate 125(g_tTex1df4a) Binding 1
+                              Decorate 124(Color) Location 0
+                              Decorate 128(Depth) BuiltIn FragDepth
+                              Decorate 132(g_tTex1df4a) DescriptorSet 0
+                              Decorate 132(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -508,7 +540,11 @@
              118:    7(fvec4) ConstantComposite 117 117 117 117
              120:     27(int) Constant 1
              121:             TypePointer Function 6(float)
-125(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             123:             TypePointer Output 7(fvec4)
+      124(Color):    123(ptr) Variable Output
+             127:             TypePointer Output 6(float)
+      128(Depth):    127(ptr) Variable Output
+132(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -570,6 +606,11 @@
                               Store 119 118
              122:    121(ptr) AccessChain 115(psout) 120
                               Store 122 117
-             123:113(PS_OUTPUT) Load 115(psout)
-                              ReturnValue 123
+             125:      8(ptr) AccessChain 115(psout) 116
+             126:    7(fvec4) Load 125
+                              Store 124(Color) 126
+             129:    121(ptr) AccessChain 115(psout) 120
+             130:    6(float) Load 129
+                              Store 128(Depth) 130
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
index 0685dc2..d0d275f 100644
--- a/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:52  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -208,7 +208,7 @@
 0:?               1.300000
 0:47      move second child to first child (temp 4-component vector of float)
 0:47        Color: direct index for structure (temp 4-component vector of float)
-0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:47          Constant:
 0:47            0 (const int)
 0:47        Constant:
@@ -217,14 +217,27 @@
 0:47          1.000000
 0:47          1.000000
 0:48      move second child to first child (temp float)
-0:48        Depth: direct index for structure (temp float FragDepth)
-0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48        Depth: direct index for structure (temp float)
+0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:48          Constant:
 0:48            1 (const int)
 0:48        Constant:
 0:48          1.000000
-0:50      Branch: Return with expression
-0:50        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:50          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:50            Color: direct index for structure (temp 4-component vector of float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                0 (const int)
+0:50          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:50            Depth: direct index for structure (temp float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                1 (const int)
+0:50        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -240,6 +253,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -248,7 +263,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:52  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -454,7 +469,7 @@
 0:?               1.300000
 0:47      move second child to first child (temp 4-component vector of float)
 0:47        Color: direct index for structure (temp 4-component vector of float)
-0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:47          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:47          Constant:
 0:47            0 (const int)
 0:47        Constant:
@@ -463,14 +478,27 @@
 0:47          1.000000
 0:47          1.000000
 0:48      move second child to first child (temp float)
-0:48        Depth: direct index for structure (temp float FragDepth)
-0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48        Depth: direct index for structure (temp float)
+0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:48          Constant:
 0:48            1 (const int)
 0:48        Constant:
 0:48          1.000000
-0:50      Branch: Return with expression
-0:50        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:50          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:50            Color: direct index for structure (temp 4-component vector of float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                0 (const int)
+0:50          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:50            Depth: direct index for structure (temp float)
+0:50              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:50              Constant:
+0:50                1 (const int)
+0:50        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -486,18 +514,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 161
+// Id's are bound by 168
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 159 163
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -528,7 +557,9 @@
                               MemberName 148(PS_OUTPUT) 0  "Color"
                               MemberName 148(PS_OUTPUT) 1  "Depth"
                               Name 150  "psout"
-                              Name 160  "g_tTex1df4a"
+                              Name 159  "Color"
+                              Name 163  "Depth"
+                              Name 167  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -544,9 +575,10 @@
                               Decorate 124(g_tTexcdf4) DescriptorSet 0
                               Decorate 133(g_tTexcdi4) DescriptorSet 0
                               Decorate 142(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 148(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 160(g_tTex1df4a) DescriptorSet 0
-                              Decorate 160(g_tTex1df4a) Binding 1
+                              Decorate 159(Color) Location 0
+                              Decorate 163(Depth) BuiltIn FragDepth
+                              Decorate 167(g_tTex1df4a) DescriptorSet 0
+                              Decorate 167(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -638,7 +670,11 @@
              153:    7(fvec4) ConstantComposite 152 152 152 152
              155:     24(int) Constant 1
              156:             TypePointer Function 6(float)
-160(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             158:             TypePointer Output 7(fvec4)
+      159(Color):    158(ptr) Variable Output
+             162:             TypePointer Output 6(float)
+      163(Depth):    162(ptr) Variable Output
+167(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -718,6 +754,11 @@
                               Store 154 153
              157:    156(ptr) AccessChain 150(psout) 155
                               Store 157 152
-             158:148(PS_OUTPUT) Load 150(psout)
-                              ReturnValue 158
+             160:      8(ptr) AccessChain 150(psout) 151
+             161:    7(fvec4) Load 160
+                              Store 159(Color) 161
+             164:    156(ptr) AccessChain 150(psout) 155
+             165:    6(float) Load 164
+                              Store 163(Depth) 165
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out b/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
index eacddae..5e95ae0 100644
--- a/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
@@ -1,7 +1,7 @@
 hlsl.samplegrad.basic.dx10.vert
 Shader version: 450
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:27  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:27    Function Parameters: 
 0:?     Sequence
 0:30      Sequence
@@ -206,8 +206,8 @@
 0:?               1.200000
 0:?               1.300000
 0:46      move second child to first child (temp 4-component vector of float)
-0:46        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:46          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:46        Pos: direct index for structure (temp 4-component vector of float)
+0:46          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:46          Constant:
 0:46            0 (const int)
 0:?         Constant:
@@ -215,8 +215,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:48      Branch: Return with expression
-0:48        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:48            Pos: direct index for structure (temp 4-component vector of float)
+0:48              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:48              Constant:
+0:48                0 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -232,6 +239,7 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Pos' (out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -239,7 +247,7 @@
 
 Shader version: 450
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:27  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:27    Function Parameters: 
 0:?     Sequence
 0:30      Sequence
@@ -444,8 +452,8 @@
 0:?               1.200000
 0:?               1.300000
 0:46      move second child to first child (temp 4-component vector of float)
-0:46        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:46          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:46        Pos: direct index for structure (temp 4-component vector of float)
+0:46          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:46          Constant:
 0:46            0 (const int)
 0:?         Constant:
@@ -453,8 +461,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:48      Branch: Return with expression
-0:48        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:48            Pos: direct index for structure (temp 4-component vector of float)
+0:48              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:48              Constant:
+0:48                0 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -470,17 +485,17 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Pos' (out 4-component vector of float Position)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 158
+// Id's are bound by 161
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main"
-                              Source HLSL 450
+                              EntryPoint Vertex 4  "main" 156
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -510,7 +525,8 @@
                               Name 148  "VS_OUTPUT"
                               MemberName 148(VS_OUTPUT) 0  "Pos"
                               Name 150  "vsout"
-                              Name 157  "g_tTex1df4a"
+                              Name 156  "Pos"
+                              Name 160  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -526,9 +542,9 @@
                               Decorate 124(g_tTexcdf4) DescriptorSet 0
                               Decorate 133(g_tTexcdi4) DescriptorSet 0
                               Decorate 142(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 148(VS_OUTPUT) 0 BuiltIn FragCoord
-                              Decorate 157(g_tTex1df4a) DescriptorSet 0
-                              Decorate 157(g_tTex1df4a) Binding 1
+                              Decorate 156(Pos) BuiltIn Position
+                              Decorate 160(g_tTex1df4a) DescriptorSet 0
+                              Decorate 160(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -618,7 +634,9 @@
              151:     24(int) Constant 0
              152:    6(float) Constant 0
              153:    7(fvec4) ConstantComposite 152 152 152 152
-157(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             155:             TypePointer Output 7(fvec4)
+        156(Pos):    155(ptr) Variable Output
+160(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -696,6 +714,8 @@
                               Store 139(txval42) 147
              154:      8(ptr) AccessChain 150(vsout) 151
                               Store 154 153
-             155:148(VS_OUTPUT) Load 150(vsout)
-                              ReturnValue 155
+             157:      8(ptr) AccessChain 150(vsout) 151
+             158:    7(fvec4) Load 157
+                              Store 156(Pos) 158
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
index 343babc..ffe8832 100644
--- a/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -178,7 +178,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -187,14 +187,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -210,6 +223,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -218,7 +233,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -394,7 +409,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -403,14 +418,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -426,18 +454,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 152
+// Id's are bound by 159
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 141 145
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -462,10 +491,12 @@
                               MemberName 132(PS_OUTPUT) 0  "Color"
                               MemberName 132(PS_OUTPUT) 1  "Depth"
                               Name 134  "psout"
-                              Name 142  "g_tTex1df4a"
-                              Name 145  "g_tTexcdf4"
-                              Name 148  "g_tTexcdi4"
-                              Name 151  "g_tTexcdu4"
+                              Name 141  "Color"
+                              Name 145  "Depth"
+                              Name 149  "g_tTex1df4a"
+                              Name 152  "g_tTexcdf4"
+                              Name 155  "g_tTexcdi4"
+                              Name 158  "g_tTexcdu4"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -478,12 +509,13 @@
                               Decorate 95(g_tTex3df4) DescriptorSet 0
                               Decorate 110(g_tTex3di4) DescriptorSet 0
                               Decorate 121(g_tTex3du4) DescriptorSet 0
-                              MemberDecorate 132(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 142(g_tTex1df4a) DescriptorSet 0
-                              Decorate 142(g_tTex1df4a) Binding 1
-                              Decorate 145(g_tTexcdf4) DescriptorSet 0
-                              Decorate 148(g_tTexcdi4) DescriptorSet 0
-                              Decorate 151(g_tTexcdu4) DescriptorSet 0
+                              Decorate 141(Color) Location 0
+                              Decorate 145(Depth) BuiltIn FragDepth
+                              Decorate 149(g_tTex1df4a) DescriptorSet 0
+                              Decorate 149(g_tTex1df4a) Binding 1
+                              Decorate 152(g_tTexcdf4) DescriptorSet 0
+                              Decorate 155(g_tTexcdi4) DescriptorSet 0
+                              Decorate 158(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -572,16 +604,20 @@
              135:    6(float) Constant 1065353216
              136:    7(fvec4) ConstantComposite 135 135 135 135
              138:             TypePointer Function 6(float)
-142(g_tTex1df4a):     11(ptr) Variable UniformConstant
-             143:             TypeImage 6(float) Cube sampled format:Unknown
-             144:             TypePointer UniformConstant 143
- 145(g_tTexcdf4):    144(ptr) Variable UniformConstant
-             146:             TypeImage 23(int) Cube sampled format:Unknown
-             147:             TypePointer UniformConstant 146
- 148(g_tTexcdi4):    147(ptr) Variable UniformConstant
-             149:             TypeImage 38(int) Cube sampled format:Unknown
-             150:             TypePointer UniformConstant 149
- 151(g_tTexcdu4):    150(ptr) Variable UniformConstant
+             140:             TypePointer Output 7(fvec4)
+      141(Color):    140(ptr) Variable Output
+             144:             TypePointer Output 6(float)
+      145(Depth):    144(ptr) Variable Output
+149(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             150:             TypeImage 6(float) Cube sampled format:Unknown
+             151:             TypePointer UniformConstant 150
+ 152(g_tTexcdf4):    151(ptr) Variable UniformConstant
+             153:             TypeImage 23(int) Cube sampled format:Unknown
+             154:             TypePointer UniformConstant 153
+ 155(g_tTexcdi4):    154(ptr) Variable UniformConstant
+             156:             TypeImage 38(int) Cube sampled format:Unknown
+             157:             TypePointer UniformConstant 156
+ 158(g_tTexcdu4):    157(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -643,6 +679,11 @@
                               Store 137 136
              139:    138(ptr) AccessChain 134(psout) 24
                               Store 139 135
-             140:132(PS_OUTPUT) Load 134(psout)
-                              ReturnValue 140
+             142:      8(ptr) AccessChain 134(psout) 63
+             143:    7(fvec4) Load 142
+                              Store 141(Color) 143
+             146:    138(ptr) AccessChain 134(psout) 24
+             147:    6(float) Load 146
+                              Store 145(Depth) 147
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
index 3318e46..9e14176 100644
--- a/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:40  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -115,7 +115,7 @@
 0:?               0 (const int)
 0:35      move second child to first child (temp 4-component vector of float)
 0:35        Color: direct index for structure (temp 4-component vector of float)
-0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:35          Constant:
 0:35            0 (const int)
 0:35        Constant:
@@ -124,14 +124,27 @@
 0:35          1.000000
 0:35          1.000000
 0:36      move second child to first child (temp float)
-0:36        Depth: direct index for structure (temp float FragDepth)
-0:36          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:36        Depth: direct index for structure (temp float)
+0:36          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:36          Constant:
 0:36            1 (const int)
 0:36        Constant:
 0:36          1.000000
-0:38      Branch: Return with expression
-0:38        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:38          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:38            Color: direct index for structure (temp 4-component vector of float)
+0:38              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38              Constant:
+0:38                0 (const int)
+0:38          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:38            Depth: direct index for structure (temp float)
+0:38              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38              Constant:
+0:38                1 (const int)
+0:38        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -144,6 +157,8 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -152,7 +167,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:40  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -265,7 +280,7 @@
 0:?               0 (const int)
 0:35      move second child to first child (temp 4-component vector of float)
 0:35        Color: direct index for structure (temp 4-component vector of float)
-0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:35          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:35          Constant:
 0:35            0 (const int)
 0:35        Constant:
@@ -274,14 +289,27 @@
 0:35          1.000000
 0:35          1.000000
 0:36      move second child to first child (temp float)
-0:36        Depth: direct index for structure (temp float FragDepth)
-0:36          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:36        Depth: direct index for structure (temp float)
+0:36          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:36          Constant:
 0:36            1 (const int)
 0:36        Constant:
 0:36          1.000000
-0:38      Branch: Return with expression
-0:38        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:38          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:38            Color: direct index for structure (temp 4-component vector of float)
+0:38              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38              Constant:
+0:38                0 (const int)
+0:38          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:38            Depth: direct index for structure (temp float)
+0:38              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38              Constant:
+0:38                1 (const int)
+0:38        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -294,19 +322,20 @@
 0:?     'g_tTexcdf4' (uniform textureCubeArray)
 0:?     'g_tTexcdi4' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 106
+// Id's are bound by 113
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 95 99
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -325,10 +354,12 @@
                               MemberName 86(PS_OUTPUT) 0  "Color"
                               MemberName 86(PS_OUTPUT) 1  "Depth"
                               Name 88  "psout"
-                              Name 96  "g_tTex1df4a"
-                              Name 99  "g_tTexcdf4"
-                              Name 102  "g_tTexcdi4"
-                              Name 105  "g_tTexcdu4"
+                              Name 95  "Color"
+                              Name 99  "Depth"
+                              Name 103  "g_tTex1df4a"
+                              Name 106  "g_tTexcdf4"
+                              Name 109  "g_tTexcdi4"
+                              Name 112  "g_tTexcdu4"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -338,12 +369,13 @@
                               Decorate 55(g_tTex2df4) DescriptorSet 0
                               Decorate 71(g_tTex2di4) DescriptorSet 0
                               Decorate 80(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 86(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 96(g_tTex1df4a) DescriptorSet 0
-                              Decorate 96(g_tTex1df4a) Binding 1
-                              Decorate 99(g_tTexcdf4) DescriptorSet 0
-                              Decorate 102(g_tTexcdi4) DescriptorSet 0
-                              Decorate 105(g_tTexcdu4) DescriptorSet 0
+                              Decorate 95(Color) Location 0
+                              Decorate 99(Depth) BuiltIn FragDepth
+                              Decorate 103(g_tTex1df4a) DescriptorSet 0
+                              Decorate 103(g_tTex1df4a) Binding 1
+                              Decorate 106(g_tTexcdf4) DescriptorSet 0
+                              Decorate 109(g_tTexcdi4) DescriptorSet 0
+                              Decorate 112(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -401,16 +433,20 @@
               89:    6(float) Constant 1065353216
               90:    7(fvec4) ConstantComposite 89 89 89 89
               92:             TypePointer Function 6(float)
- 96(g_tTex1df4a):     11(ptr) Variable UniformConstant
-              97:             TypeImage 6(float) Cube array sampled format:Unknown
-              98:             TypePointer UniformConstant 97
-  99(g_tTexcdf4):     98(ptr) Variable UniformConstant
-             100:             TypeImage 26(int) Cube array sampled format:Unknown
-             101:             TypePointer UniformConstant 100
- 102(g_tTexcdi4):    101(ptr) Variable UniformConstant
-             103:             TypeImage 40(int) Cube array sampled format:Unknown
-             104:             TypePointer UniformConstant 103
- 105(g_tTexcdu4):    104(ptr) Variable UniformConstant
+              94:             TypePointer Output 7(fvec4)
+       95(Color):     94(ptr) Variable Output
+              98:             TypePointer Output 6(float)
+       99(Depth):     98(ptr) Variable Output
+103(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             104:             TypeImage 6(float) Cube array sampled format:Unknown
+             105:             TypePointer UniformConstant 104
+ 106(g_tTexcdf4):    105(ptr) Variable UniformConstant
+             107:             TypeImage 26(int) Cube array sampled format:Unknown
+             108:             TypePointer UniformConstant 107
+ 109(g_tTexcdi4):    108(ptr) Variable UniformConstant
+             110:             TypeImage 40(int) Cube array sampled format:Unknown
+             111:             TypePointer UniformConstant 110
+ 112(g_tTexcdu4):    111(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -454,6 +490,11 @@
                               Store 91 90
               93:     92(ptr) AccessChain 88(psout) 27
                               Store 93 89
-              94:86(PS_OUTPUT) Load 88(psout)
-                              ReturnValue 94
+              96:      8(ptr) AccessChain 88(psout) 65
+              97:    7(fvec4) Load 96
+                              Store 95(Color) 97
+             100:     92(ptr) AccessChain 88(psout) 27
+             101:    6(float) Load 100
+                              Store 99(Depth) 101
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
index dd042de..766f6ac 100644
--- a/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -124,7 +124,7 @@
 0:37              0.750000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -133,14 +133,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -153,6 +166,8 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -161,7 +176,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:44  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:24  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
 0:27      Sequence
@@ -283,7 +298,7 @@
 0:37              0.750000
 0:39      move second child to first child (temp 4-component vector of float)
 0:39        Color: direct index for structure (temp 4-component vector of float)
-0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:39          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:39          Constant:
 0:39            0 (const int)
 0:39        Constant:
@@ -292,14 +307,27 @@
 0:39          1.000000
 0:39          1.000000
 0:40      move second child to first child (temp float)
-0:40        Depth: direct index for structure (temp float FragDepth)
-0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:40        Depth: direct index for structure (temp float)
+0:40          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:40          Constant:
 0:40            1 (const int)
 0:40        Constant:
 0:40          1.000000
-0:42      Branch: Return with expression
-0:42        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:42          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:42            Color: direct index for structure (temp 4-component vector of float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                0 (const int)
+0:42          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:42            Depth: direct index for structure (temp float)
+0:42              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:42              Constant:
+0:42                1 (const int)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -312,19 +340,20 @@
 0:?     'g_tTexcdf4a' (uniform textureCubeArray)
 0:?     'g_tTexcdi4a' (uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' (uniform utextureCubeArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 133
+// Id's are bound by 140
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 131 135
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4a"
@@ -349,7 +378,9 @@
                               MemberName 121(PS_OUTPUT) 0  "Color"
                               MemberName 121(PS_OUTPUT) 1  "Depth"
                               Name 123  "psout"
-                              Name 132  "g_tTex1df4"
+                              Name 131  "Color"
+                              Name 135  "Depth"
+                              Name 139  "g_tTex1df4"
                               Decorate 12(g_tTex1df4a) DescriptorSet 0
                               Decorate 12(g_tTex1df4a) Binding 1
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -362,9 +393,10 @@
                               Decorate 91(g_tTexcdf4a) DescriptorSet 0
                               Decorate 101(g_tTexcdi4a) DescriptorSet 0
                               Decorate 111(g_tTexcdu4a) DescriptorSet 0
-                              MemberDecorate 121(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 132(g_tTex1df4) DescriptorSet 0
-                              Decorate 132(g_tTex1df4) Binding 0
+                              Decorate 131(Color) Location 0
+                              Decorate 135(Depth) BuiltIn FragDepth
+                              Decorate 139(g_tTex1df4) DescriptorSet 0
+                              Decorate 139(g_tTex1df4) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -443,7 +475,11 @@
              125:    7(fvec4) ConstantComposite 118 118 118 118
              127:     26(int) Constant 1
              128:             TypePointer Function 6(float)
- 132(g_tTex1df4):     11(ptr) Variable UniformConstant
+             130:             TypePointer Output 7(fvec4)
+      131(Color):    130(ptr) Variable Output
+             134:             TypePointer Output 6(float)
+      135(Depth):    134(ptr) Variable Output
+ 139(g_tTex1df4):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -505,6 +541,11 @@
                               Store 126 125
              129:    128(ptr) AccessChain 123(psout) 127
                               Store 129 118
-             130:121(PS_OUTPUT) Load 123(psout)
-                              ReturnValue 130
+             132:      8(ptr) AccessChain 123(psout) 124
+             133:    7(fvec4) Load 132
+                              Store 131(Color) 133
+             136:    128(ptr) AccessChain 123(psout) 127
+             137:    6(float) Load 136
+                              Store 135(Depth) 137
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
index 52c635d..ee53339 100644
--- a/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:53  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:29  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:29    Function Parameters: 
 0:?     Sequence
 0:32      Sequence
@@ -154,7 +154,7 @@
 0:46              0.750000
 0:48      move second child to first child (temp 4-component vector of float)
 0:48        Color: direct index for structure (temp 4-component vector of float)
-0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:48          Constant:
 0:48            0 (const int)
 0:48        Constant:
@@ -163,14 +163,27 @@
 0:48          1.000000
 0:48          1.000000
 0:49      move second child to first child (temp float)
-0:49        Depth: direct index for structure (temp float FragDepth)
-0:49          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:49        Depth: direct index for structure (temp float)
+0:49          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:49          Constant:
 0:49            1 (const int)
 0:49        Constant:
 0:49          1.000000
-0:51      Branch: Return with expression
-0:51        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:51          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:51            Color: direct index for structure (temp 4-component vector of float)
+0:51              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:51              Constant:
+0:51                0 (const int)
+0:51          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:51            Depth: direct index for structure (temp float)
+0:51              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:51              Constant:
+0:51                1 (const int)
+0:51        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -187,6 +200,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -195,7 +210,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:53  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:29  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:29    Function Parameters: 
 0:?     Sequence
 0:32      Sequence
@@ -347,7 +362,7 @@
 0:46              0.750000
 0:48      move second child to first child (temp 4-component vector of float)
 0:48        Color: direct index for structure (temp 4-component vector of float)
-0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:48          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:48          Constant:
 0:48            0 (const int)
 0:48        Constant:
@@ -356,14 +371,27 @@
 0:48          1.000000
 0:48          1.000000
 0:49      move second child to first child (temp float)
-0:49        Depth: direct index for structure (temp float FragDepth)
-0:49          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:49        Depth: direct index for structure (temp float)
+0:49          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:49          Constant:
 0:49            1 (const int)
 0:49        Constant:
 0:49          1.000000
-0:51      Branch: Return with expression
-0:51        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:51          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:51            Color: direct index for structure (temp 4-component vector of float)
+0:51              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:51              Constant:
+0:51                0 (const int)
+0:51          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:51            Depth: direct index for structure (temp float)
+0:51              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:51              Constant:
+0:51                1 (const int)
+0:51        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_sSamp2d' (uniform sampler)
@@ -380,18 +408,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 158
+// Id's are bound by 165
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 155 159
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -422,8 +451,10 @@
                               MemberName 144(PS_OUTPUT) 0  "Color"
                               MemberName 144(PS_OUTPUT) 1  "Depth"
                               Name 146  "psout"
-                              Name 156  "g_sSamp2d"
-                              Name 157  "g_tTex1df4a"
+                              Name 155  "Color"
+                              Name 159  "Depth"
+                              Name 163  "g_sSamp2d"
+                              Name 164  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -439,10 +470,11 @@
                               Decorate 120(g_tTexcdf4) DescriptorSet 0
                               Decorate 129(g_tTexcdi4) DescriptorSet 0
                               Decorate 138(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 144(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 156(g_sSamp2d) DescriptorSet 0
-                              Decorate 157(g_tTex1df4a) DescriptorSet 0
-                              Decorate 157(g_tTex1df4a) Binding 1
+                              Decorate 155(Color) Location 0
+                              Decorate 159(Depth) BuiltIn FragDepth
+                              Decorate 163(g_sSamp2d) DescriptorSet 0
+                              Decorate 164(g_tTex1df4a) DescriptorSet 0
+                              Decorate 164(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -530,8 +562,12 @@
              149:    7(fvec4) ConstantComposite 148 148 148 148
              151:     23(int) Constant 1
              152:             TypePointer Function 6(float)
-  156(g_sSamp2d):     15(ptr) Variable UniformConstant
-157(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             154:             TypePointer Output 7(fvec4)
+      155(Color):    154(ptr) Variable Output
+             158:             TypePointer Output 6(float)
+      159(Depth):    158(ptr) Variable Output
+  163(g_sSamp2d):     15(ptr) Variable UniformConstant
+164(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -611,6 +647,11 @@
                               Store 150 149
              153:    152(ptr) AccessChain 146(psout) 151
                               Store 153 148
-             154:144(PS_OUTPUT) Load 146(psout)
-                              ReturnValue 154
+             156:      8(ptr) AccessChain 146(psout) 147
+             157:    7(fvec4) Load 156
+                              Store 155(Color) 157
+             160:    152(ptr) AccessChain 146(psout) 151
+             161:    6(float) Load 160
+                              Store 159(Depth) 161
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out b/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
index 4bef16d..9af7a9f 100644
--- a/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
@@ -1,7 +1,7 @@
 hlsl.samplelevel.basic.dx10.vert
 Shader version: 450
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:27  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:27    Function Parameters: 
 0:?     Sequence
 0:30      Sequence
@@ -152,8 +152,8 @@
 0:44            Constant:
 0:44              0.750000
 0:46      move second child to first child (temp 4-component vector of float)
-0:46        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:46          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:46        Pos: direct index for structure (temp 4-component vector of float)
+0:46          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:46          Constant:
 0:46            0 (const int)
 0:?         Constant:
@@ -161,8 +161,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:48      Branch: Return with expression
-0:48        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:48            Pos: direct index for structure (temp 4-component vector of float)
+0:48              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:48              Constant:
+0:48                0 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -178,6 +185,7 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Pos' (out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -185,7 +193,7 @@
 
 Shader version: 450
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float FragCoord Pos})
+0:27  Function Definition: main( (global structure{temp 4-component vector of float Pos})
 0:27    Function Parameters: 
 0:?     Sequence
 0:30      Sequence
@@ -336,8 +344,8 @@
 0:44            Constant:
 0:44              0.750000
 0:46      move second child to first child (temp 4-component vector of float)
-0:46        Pos: direct index for structure (temp 4-component vector of float FragCoord)
-0:46          'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:46        Pos: direct index for structure (temp 4-component vector of float)
+0:46          'vsout' (temp structure{temp 4-component vector of float Pos})
 0:46          Constant:
 0:46            0 (const int)
 0:?         Constant:
@@ -345,8 +353,15 @@
 0:?           0.000000
 0:?           0.000000
 0:?           0.000000
-0:48      Branch: Return with expression
-0:48        'vsout' (temp structure{temp 4-component vector of float FragCoord Pos})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Pos' (out 4-component vector of float Position)
+0:48            Pos: direct index for structure (temp 4-component vector of float)
+0:48              'vsout' (temp structure{temp 4-component vector of float Pos})
+0:48              Constant:
+0:48                0 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -362,17 +377,17 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Pos' (out 4-component vector of float Position)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 154
+// Id's are bound by 157
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main"
-                              Source HLSL 450
+                              EntryPoint Vertex 4  "main" 152
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -402,7 +417,8 @@
                               Name 144  "VS_OUTPUT"
                               MemberName 144(VS_OUTPUT) 0  "Pos"
                               Name 146  "vsout"
-                              Name 153  "g_tTex1df4a"
+                              Name 152  "Pos"
+                              Name 156  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -418,9 +434,9 @@
                               Decorate 120(g_tTexcdf4) DescriptorSet 0
                               Decorate 129(g_tTexcdi4) DescriptorSet 0
                               Decorate 138(g_tTexcdu4) DescriptorSet 0
-                              MemberDecorate 144(VS_OUTPUT) 0 BuiltIn FragCoord
-                              Decorate 153(g_tTex1df4a) DescriptorSet 0
-                              Decorate 153(g_tTex1df4a) Binding 1
+                              Decorate 152(Pos) BuiltIn Position
+                              Decorate 156(g_tTex1df4a) DescriptorSet 0
+                              Decorate 156(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -506,7 +522,9 @@
              147:     23(int) Constant 0
              148:    6(float) Constant 0
              149:    7(fvec4) ConstantComposite 148 148 148 148
-153(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             151:             TypePointer Output 7(fvec4)
+        152(Pos):    151(ptr) Variable Output
+156(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -584,6 +602,8 @@
                               Store 135(txval42) 143
              150:      8(ptr) AccessChain 146(vsout) 147
                               Store 150 149
-             151:144(VS_OUTPUT) Load 146(vsout)
-                              ReturnValue 151
+             153:      8(ptr) AccessChain 146(vsout) 147
+             154:    7(fvec4) Load 153
+                              Store 152(Pos) 154
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
index 4f7a1a0..d669a99 100644
--- a/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -142,7 +142,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -151,14 +151,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -174,6 +187,8 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -182,7 +197,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:50  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:28  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:28    Function Parameters: 
 0:?     Sequence
 0:31      Sequence
@@ -322,7 +337,7 @@
 0:?               -1 (const int)
 0:45      move second child to first child (temp 4-component vector of float)
 0:45        Color: direct index for structure (temp 4-component vector of float)
-0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:45          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:45          Constant:
 0:45            0 (const int)
 0:45        Constant:
@@ -331,14 +346,27 @@
 0:45          1.000000
 0:45          1.000000
 0:46      move second child to first child (temp float)
-0:46        Depth: direct index for structure (temp float FragDepth)
-0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:46        Depth: direct index for structure (temp float)
+0:46          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
 0:46          1.000000
-0:48      Branch: Return with expression
-0:48        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:48          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:48            Color: direct index for structure (temp 4-component vector of float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                0 (const int)
+0:48          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:48            Depth: direct index for structure (temp float)
+0:48              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:48              Constant:
+0:48                1 (const int)
+0:48        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
@@ -354,18 +382,19 @@
 0:?     'g_tTexcdf4' (uniform textureCube)
 0:?     'g_tTexcdi4' (uniform itextureCube)
 0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 148
+// Id's are bound by 155
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 137 141
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -390,10 +419,12 @@
                               MemberName 128(PS_OUTPUT) 0  "Color"
                               MemberName 128(PS_OUTPUT) 1  "Depth"
                               Name 130  "psout"
-                              Name 138  "g_tTex1df4a"
-                              Name 141  "g_tTexcdf4"
-                              Name 144  "g_tTexcdi4"
-                              Name 147  "g_tTexcdu4"
+                              Name 137  "Color"
+                              Name 141  "Depth"
+                              Name 145  "g_tTex1df4a"
+                              Name 148  "g_tTexcdf4"
+                              Name 151  "g_tTexcdi4"
+                              Name 154  "g_tTexcdu4"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -406,12 +437,13 @@
                               Decorate 93(g_tTex3df4) DescriptorSet 0
                               Decorate 106(g_tTex3di4) DescriptorSet 0
                               Decorate 117(g_tTex3du4) DescriptorSet 0
-                              MemberDecorate 128(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 138(g_tTex1df4a) DescriptorSet 0
-                              Decorate 138(g_tTex1df4a) Binding 1
-                              Decorate 141(g_tTexcdf4) DescriptorSet 0
-                              Decorate 144(g_tTexcdi4) DescriptorSet 0
-                              Decorate 147(g_tTexcdu4) DescriptorSet 0
+                              Decorate 137(Color) Location 0
+                              Decorate 141(Depth) BuiltIn FragDepth
+                              Decorate 145(g_tTex1df4a) DescriptorSet 0
+                              Decorate 145(g_tTex1df4a) Binding 1
+                              Decorate 148(g_tTexcdf4) DescriptorSet 0
+                              Decorate 151(g_tTexcdi4) DescriptorSet 0
+                              Decorate 154(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -496,16 +528,20 @@
              131:    6(float) Constant 1065353216
              132:    7(fvec4) ConstantComposite 131 131 131 131
              134:             TypePointer Function 6(float)
-138(g_tTex1df4a):     11(ptr) Variable UniformConstant
-             139:             TypeImage 6(float) Cube sampled format:Unknown
-             140:             TypePointer UniformConstant 139
- 141(g_tTexcdf4):    140(ptr) Variable UniformConstant
-             142:             TypeImage 22(int) Cube sampled format:Unknown
-             143:             TypePointer UniformConstant 142
- 144(g_tTexcdi4):    143(ptr) Variable UniformConstant
-             145:             TypeImage 37(int) Cube sampled format:Unknown
-             146:             TypePointer UniformConstant 145
- 147(g_tTexcdu4):    146(ptr) Variable UniformConstant
+             136:             TypePointer Output 7(fvec4)
+      137(Color):    136(ptr) Variable Output
+             140:             TypePointer Output 6(float)
+      141(Depth):    140(ptr) Variable Output
+145(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             146:             TypeImage 6(float) Cube sampled format:Unknown
+             147:             TypePointer UniformConstant 146
+ 148(g_tTexcdf4):    147(ptr) Variable UniformConstant
+             149:             TypeImage 22(int) Cube sampled format:Unknown
+             150:             TypePointer UniformConstant 149
+ 151(g_tTexcdi4):    150(ptr) Variable UniformConstant
+             152:             TypeImage 37(int) Cube sampled format:Unknown
+             153:             TypePointer UniformConstant 152
+ 154(g_tTexcdu4):    153(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -567,6 +603,11 @@
                               Store 133 132
              135:    134(ptr) AccessChain 130(psout) 23
                               Store 135 131
-             136:128(PS_OUTPUT) Load 130(psout)
-                              ReturnValue 136
+             138:      8(ptr) AccessChain 130(psout) 61
+             139:    7(fvec4) Load 138
+                              Store 137(Color) 139
+             142:    134(ptr) AccessChain 130(psout) 23
+             143:    6(float) Load 142
+                              Store 141(Depth) 143
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
index 0d18428..fd2673b 100644
--- a/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:23      Sequence
@@ -97,7 +97,7 @@
 0:?               1 (const int)
 0:33      move second child to first child (temp 4-component vector of float)
 0:33        Color: direct index for structure (temp 4-component vector of float)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            0 (const int)
 0:33        Constant:
@@ -106,14 +106,27 @@
 0:33          1.000000
 0:33          1.000000
 0:34      move second child to first child (temp float)
-0:34        Depth: direct index for structure (temp float FragDepth)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34        Depth: direct index for structure (temp float)
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            1 (const int)
 0:34        Constant:
 0:34          1.000000
-0:36      Branch: Return with expression
-0:36        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:36          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:36            Color: direct index for structure (temp 4-component vector of float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                0 (const int)
+0:36          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:36            Depth: direct index for structure (temp float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                1 (const int)
+0:36        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -123,6 +136,8 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 
 Linked fragment stage:
@@ -131,7 +146,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:38  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:20  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float Depth})
 0:20    Function Parameters: 
 0:?     Sequence
 0:23      Sequence
@@ -226,7 +241,7 @@
 0:?               1 (const int)
 0:33      move second child to first child (temp 4-component vector of float)
 0:33        Color: direct index for structure (temp 4-component vector of float)
-0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:33          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:33          Constant:
 0:33            0 (const int)
 0:33        Constant:
@@ -235,14 +250,27 @@
 0:33          1.000000
 0:33          1.000000
 0:34      move second child to first child (temp float)
-0:34        Depth: direct index for structure (temp float FragDepth)
-0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:34        Depth: direct index for structure (temp float)
+0:34          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:34          Constant:
 0:34            1 (const int)
 0:34        Constant:
 0:34          1.000000
-0:36      Branch: Return with expression
-0:36        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?       Sequence
+0:?         Sequence
+0:36          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:36            Color: direct index for structure (temp 4-component vector of float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                0 (const int)
+0:36          move second child to first child (temp float)
+0:?             'Depth' (out float FragDepth)
+0:36            Depth: direct index for structure (temp float)
+0:36              'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:36              Constant:
+0:36                1 (const int)
+0:36        Branch: Return
 0:?   Linker Objects
 0:?     'g_sSamp' (layout(binding=0 ) uniform sampler)
 0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1DArray)
@@ -252,18 +280,19 @@
 0:?     'g_tTex2df4' (uniform texture2DArray)
 0:?     'g_tTex2di4' (uniform itexture2DArray)
 0:?     'g_tTex2du4' (uniform utexture2DArray)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 105
+// Id's are bound by 112
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 103 107
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 9  "txval10"
                               Name 12  "g_tTex1df4"
@@ -282,7 +311,9 @@
                               MemberName 94(PS_OUTPUT) 0  "Color"
                               MemberName 94(PS_OUTPUT) 1  "Depth"
                               Name 96  "psout"
-                              Name 104  "g_tTex1df4a"
+                              Name 103  "Color"
+                              Name 107  "Depth"
+                              Name 111  "g_tTex1df4a"
                               Decorate 12(g_tTex1df4) DescriptorSet 0
                               Decorate 12(g_tTex1df4) Binding 0
                               Decorate 16(g_sSamp) DescriptorSet 0
@@ -292,9 +323,10 @@
                               Decorate 60(g_tTex2df4) DescriptorSet 0
                               Decorate 73(g_tTex2di4) DescriptorSet 0
                               Decorate 84(g_tTex2du4) DescriptorSet 0
-                              MemberDecorate 94(PS_OUTPUT) 1 BuiltIn FragDepth
-                              Decorate 104(g_tTex1df4a) DescriptorSet 0
-                              Decorate 104(g_tTex1df4a) Binding 1
+                              Decorate 103(Color) Location 0
+                              Decorate 107(Depth) BuiltIn FragDepth
+                              Decorate 111(g_tTex1df4a) DescriptorSet 0
+                              Decorate 111(g_tTex1df4a) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -360,7 +392,11 @@
               97:    6(float) Constant 1065353216
               98:    7(fvec4) ConstantComposite 97 97 97 97
              100:             TypePointer Function 6(float)
-104(g_tTex1df4a):     11(ptr) Variable UniformConstant
+             102:             TypePointer Output 7(fvec4)
+      103(Color):    102(ptr) Variable Output
+             106:             TypePointer Output 6(float)
+      107(Depth):    106(ptr) Variable Output
+111(g_tTex1df4a):     11(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
       9(txval10):      8(ptr) Variable Function
@@ -404,6 +440,11 @@
                               Store 99 98
              101:    100(ptr) AccessChain 96(psout) 40
                               Store 101 97
-             102:94(PS_OUTPUT) Load 96(psout)
-                              ReturnValue 102
+             104:      8(ptr) AccessChain 96(psout) 26
+             105:    7(fvec4) Load 104
+                              Store 103(Color) 105
+             108:    100(ptr) AccessChain 96(psout) 40
+             109:    6(float) Load 108
+                              Store 107(Depth) 109
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.scope.frag.out b/Test/baseResults/hlsl.scope.frag.out
index 082e142..4218c4f 100755
--- a/Test/baseResults/hlsl.scope.frag.out
+++ b/Test/baseResults/hlsl.scope.frag.out
@@ -2,9 +2,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:31  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global void)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:4      'x' (temp int)
 0:?       Sequence
@@ -38,6 +38,7 @@
 0:29            0 (const int)
 0:27        No loop body
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -46,9 +47,9 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:31  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global void)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:4      'x' (temp int)
 0:?       Sequence
@@ -82,22 +83,24 @@
 0:29            0 (const int)
 0:27        No loop body
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 36
+// Id's are bound by 39
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction"
+                              EntryPoint Fragment 4  "PixelShaderFunction" 38
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 8  "x"
                               Name 11  "x"
                               Name 14  "x"
                               Name 17  "x"
+                              Name 38  "input"
+                              Decorate 38(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -109,6 +112,9 @@
               15:             TypeVector 9(float) 3
               16:             TypePointer Function 15(fvec3)
               19:      6(int) Constant 0
+              36:             TypeVector 9(float) 4
+              37:             TypePointer Input 36(fvec4)
+       38(input):     37(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
             8(x):      7(ptr) Variable Function
diff --git a/Test/baseResults/hlsl.semicolons.frag.out b/Test/baseResults/hlsl.semicolons.frag.out
index 78a3a5a..a37991d 100644
--- a/Test/baseResults/hlsl.semicolons.frag.out
+++ b/Test/baseResults/hlsl.semicolons.frag.out
@@ -2,11 +2,11 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:4  Function Definition: MyFunc( (global void)
+0:2  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 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)
@@ -19,9 +19,17 @@
 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:?       Sequence
+0:?         Sequence
+0:17          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:17            color: direct index for structure (temp 4-component vector of float)
+0:17              'ps_output' (temp structure{temp 4-component vector of float color})
+0:17              Constant:
+0:17                0 (const int)
+0:17        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -30,11 +38,11 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:4  Function Definition: MyFunc( (global void)
+0:2  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 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)
@@ -47,26 +55,35 @@
 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:?       Sequence
+0:?         Sequence
+0:17          move second child to first child (temp 4-component vector of float)
+0:?             'color' (layout(location=0 ) out 4-component vector of float)
+0:17            color: direct index for structure (temp 4-component vector of float)
+0:17              'ps_output' (temp structure{temp 4-component vector of float color})
+0:17              Constant:
+0:17                0 (const int)
+0:17        Branch: Return
 0:?   Linker Objects
+0:?     'color' (layout(location=0 ) out 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 23
+// Id's are bound by 26
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main"
+                              EntryPoint Fragment 4  "main" 22
                               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"
+                              Name 22  "color"
+                              Decorate 22(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
@@ -78,13 +95,17 @@
               17:   10(float) Constant 1065353216
               18:   11(fvec4) ConstantComposite 17 17 17 17
               19:             TypePointer Function 11(fvec4)
+              21:             TypePointer Output 11(fvec4)
+       22(color):     21(ptr) Variable Output
          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
+              23:     19(ptr) AccessChain 14(ps_output) 16
+              24:   11(fvec4) Load 23
+                              Store 22(color) 24
+                              Return
                               FunctionEnd
       6(MyFunc():           2 Function None 3
                7:             Label
diff --git a/Test/baseResults/hlsl.shapeConv.frag.out b/Test/baseResults/hlsl.shapeConv.frag.out
index e9b7389..c7fdf8d 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:2  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,72 @@
 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      Compare Equal (temp bool)
+0:21        Construct vec4 (temp 4-component vector of float)
+0:21          direct index (temp float)
+0:21            'v' (temp 4-component vector of float)
+0:21            Constant:
+0:21              0 (const int)
+0:21        'v' (temp 4-component vector of float)
+0:22      Compare Not Equal (temp bool)
+0:22        Construct vec4 (temp 4-component vector of float)
+0:22          'f' (in float)
+0:22        'v' (temp 4-component vector of float)
+0:26      Compare Equal (temp bool)
+0:26        'f1' (temp 1-component vector of float)
+0:26        Construct float (temp 1-component vector of float)
+0:26          'v' (temp 4-component vector of float)
+0:27      Compare Less Than (temp bool)
+0:27        Construct float (temp 1-component vector of float)
+0:27          'v' (temp 4-component vector of float)
+0:27        'f1' (temp 1-component vector of float)
+0:28      Construct float (temp float)
+0:28        'f1' (temp 1-component vector of float)
+0:29      Construct vec3 (temp 3-component vector of float)
+0:29        Construct float (temp float)
+0:29          'f1' (temp 1-component vector of float)
+0:31      Branch: Return with expression
+0:31        'input' (in 4-component vector of float)
 0:?   Linker Objects
 
 
@@ -53,7 +117,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:2  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,26 +157,94 @@
 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      Compare Equal (temp bool)
+0:21        Construct vec4 (temp 4-component vector of float)
+0:21          direct index (temp float)
+0:21            'v' (temp 4-component vector of float)
+0:21            Constant:
+0:21              0 (const int)
+0:21        'v' (temp 4-component vector of float)
+0:22      Compare Not Equal (temp bool)
+0:22        Construct vec4 (temp 4-component vector of float)
+0:22          'f' (in float)
+0:22        'v' (temp 4-component vector of float)
+0:26      Compare Equal (temp bool)
+0:26        'f1' (temp 1-component vector of float)
+0:26        Construct float (temp 1-component vector of float)
+0:26          'v' (temp 4-component vector of float)
+0:27      Compare Less Than (temp bool)
+0:27        Construct float (temp 1-component vector of float)
+0:27          'v' (temp 4-component vector of float)
+0:27        'f1' (temp 1-component vector of float)
+0:28      Construct float (temp float)
+0:28        'f1' (temp 1-component vector of float)
+0:29      Construct vec3 (temp 3-component vector of float)
+0:29        Construct float (temp float)
+0:29          'f1' (temp 1-component vector of float)
+0:31      Branch: Return with expression
+0:31        '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 84
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main"
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "main"
                               Name 13  "PixelShaderFunction(vf4;f1;"
                               Name 11  "input"
                               Name 12  "f"
                               Name 15  "v"
                               Name 24  "u"
+                              Name 31  "w"
+                              Name 33  "V"
+                              Name 34  "MyVal"
+                              Name 37  "foo"
+                              Name 69  "f1"
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -128,6 +260,21 @@
               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
+              55:             TypeInt 32 0
+              56:     55(int) Constant 0
+              61:             TypeVector 41(bool) 4
          4(main):           2 Function None 3
                5:             Label
                               FunctionEnd
@@ -137,6 +284,11 @@
               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
+          69(f1):      9(ptr) Variable Function
                               Store 15(v) 17
                               Store 15(v) 19
               20:    6(float) Load 12(f)
@@ -147,6 +299,41 @@
               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
+              57:      9(ptr) AccessChain 15(v) 56
+              58:    6(float) Load 57
+              59:    7(fvec4) CompositeConstruct 58 58 58 58
+              60:    7(fvec4) Load 15(v)
+              62:   61(bvec4) FOrdEqual 59 60
+              63:    41(bool) All 62
+              64:    6(float) Load 12(f)
+              65:    7(fvec4) CompositeConstruct 64 64 64 64
+              66:    7(fvec4) Load 15(v)
+              67:   61(bvec4) FOrdNotEqual 65 66
+              68:    41(bool) Any 67
+              70:    6(float) Load 69(f1)
+              71:    7(fvec4) Load 15(v)
+              72:    6(float) CompositeExtract 71 0
+              73:    41(bool) FOrdEqual 70 72
+              74:    7(fvec4) Load 15(v)
+              75:    6(float) CompositeExtract 74 0
+              76:    6(float) Load 69(f1)
+              77:    41(bool) FOrdLessThan 75 76
+              78:    6(float) Load 69(f1)
+              79:    6(float) Load 69(f1)
+              80:   22(fvec3) CompositeConstruct 79 79 79
+              81:    7(fvec4) Load 11(input)
+                              ReturnValue 81
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.sin.frag.out b/Test/baseResults/hlsl.sin.frag.out
index e145ab1..e4940ae 100755
--- a/Test/baseResults/hlsl.sin.frag.out
+++ b/Test/baseResults/hlsl.sin.frag.out
@@ -2,14 +2,19 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:3      Branch: Return with expression
-0:3        sine (global 4-component vector of float)
-0:3          'input' (in 4-component vector of float)
+0:3      Sequence
+0:3        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:3          sine (global 4-component vector of float)
+0:3            'input' (layout(location=0 ) in 4-component vector of float)
+0:3        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -18,36 +23,46 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:3      Branch: Return with expression
-0:3        sine (global 4-component vector of float)
-0:3          'input' (in 4-component vector of float)
+0:3      Sequence
+0:3        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:3          sine (global 4-component vector of float)
+0:3            'input' (layout(location=0 ) in 4-component vector of float)
+0:3        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 13
+// Id's are bound by 15
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 9
+                              EntryPoint Fragment 4  "PixelShaderFunction" 9 11
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
-                              Name 9  "input"
+                              Name 9  "@entryPointOutput"
+                              Name 11  "input"
+                              Decorate 9(@entryPointOutput) Location 0
+                              Decorate 11(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypePointer Input 7(fvec4)
-        9(input):      8(ptr) Variable Input
+               8:             TypePointer Output 7(fvec4)
+9(@entryPointOutput):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+       11(input):     10(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-              10:    7(fvec4) Load 9(input)
-              11:    7(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 10
-                              ReturnValue 11
+              12:    7(fvec4) Load 11(input)
+              13:    7(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 12
+                              Store 9(@entryPointOutput) 13
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.string.frag.out b/Test/baseResults/hlsl.string.frag.out
new file mode 100755
index 0000000..6016f52
--- /dev/null
+++ b/Test/baseResults/hlsl.string.frag.out
@@ -0,0 +1,64 @@
+hlsl.string.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main(f1; (global float)
+0:10    Function Parameters: 
+0:10      'f' (layout(location=0 ) in float)
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:11          'f' (layout(location=0 ) in float)
+0:11        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
+0:?     'f' (layout(location=0 ) in float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main(f1; (global float)
+0:10    Function Parameters: 
+0:10      'f' (layout(location=0 ) in float)
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:11          'f' (layout(location=0 ) in float)
+0:11        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
+0:?     'f' (layout(location=0 ) in float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 13
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 10
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 8  "@entryPointOutput"
+                              Name 10  "f"
+                              Decorate 8(@entryPointOutput) Location 0
+                              Decorate 10(f) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Output 6(float)
+8(@entryPointOutput):      7(ptr) Variable Output
+               9:             TypePointer Input 6(float)
+           10(f):      9(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              11:    6(float) Load 10(f)
+                              Store 8(@entryPointOutput) 11
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.stringtoken.frag.out b/Test/baseResults/hlsl.stringtoken.frag.out
new file mode 100644
index 0000000..42885bc
--- /dev/null
+++ b/Test/baseResults/hlsl.stringtoken.frag.out
@@ -0,0 +1,112 @@
+hlsl.stringtoken.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:16  Function Definition: main( (global structure{temp 4-component vector of float Color})
+0:16    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child (temp 4-component vector of float)
+0:18        Color: direct index for structure (temp 4-component vector of float)
+0:18          'psout' (temp structure{temp 4-component vector of float Color})
+0:18          Constant:
+0:18            0 (const int)
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           1.000000
+0:?       Sequence
+0:?         Sequence
+0:19          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:19            Color: direct index for structure (temp 4-component vector of float)
+0:19              'psout' (temp structure{temp 4-component vector of float Color})
+0:19              Constant:
+0:19                0 (const int)
+0:19        Branch: Return
+0:?   Linker Objects
+0:?     'TestTexture' (uniform texture2D)
+0:?     'TestUF' (uniform 4-component vector of float)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:16  Function Definition: main( (global structure{temp 4-component vector of float Color})
+0:16    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child (temp 4-component vector of float)
+0:18        Color: direct index for structure (temp 4-component vector of float)
+0:18          'psout' (temp structure{temp 4-component vector of float Color})
+0:18          Constant:
+0:18            0 (const int)
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           1.000000
+0:?       Sequence
+0:?         Sequence
+0:19          move second child to first child (temp 4-component vector of float)
+0:?             'Color' (layout(location=0 ) out 4-component vector of float)
+0:19            Color: direct index for structure (temp 4-component vector of float)
+0:19              'psout' (temp structure{temp 4-component vector of float Color})
+0:19              Constant:
+0:19                0 (const int)
+0:19        Branch: Return
+0:?   Linker Objects
+0:?     'TestTexture' (uniform texture2D)
+0:?     'TestUF' (uniform 4-component vector of float)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 28
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 19
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 8  "PS_OUTPUT"
+                              MemberName 8(PS_OUTPUT) 0  "Color"
+                              Name 10  "psout"
+                              Name 19  "Color"
+                              Name 25  "TestTexture"
+                              Name 27  "TestUF"
+                              Decorate 19(Color) Location 0
+                              Decorate 25(TestTexture) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(PS_OUTPUT):             TypeStruct 7(fvec4)
+               9:             TypePointer Function 8(PS_OUTPUT)
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:    6(float) Constant 0
+              14:    6(float) Constant 1065353216
+              15:    7(fvec4) ConstantComposite 13 13 13 14
+              16:             TypePointer Function 7(fvec4)
+              18:             TypePointer Output 7(fvec4)
+       19(Color):     18(ptr) Variable Output
+              23:             TypeImage 6(float) 2D sampled format:Unknown
+              24:             TypePointer UniformConstant 23
+ 25(TestTexture):     24(ptr) Variable UniformConstant
+              26:             TypePointer UniformConstant 7(fvec4)
+      27(TestUF):     26(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+       10(psout):      9(ptr) Variable Function
+              17:     16(ptr) AccessChain 10(psout) 12
+                              Store 17 15
+              20:     16(ptr) AccessChain 10(psout) 12
+              21:    7(fvec4) Load 20
+                              Store 19(Color) 21
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.struct.frag.out b/Test/baseResults/hlsl.struct.frag.out
index 02eed4e..3a44495 100755
--- a/Test/baseResults/hlsl.struct.frag.out
+++ b/Test/baseResults/hlsl.struct.frag.out
@@ -6,9 +6,10 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:43  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:34  Function Definition: PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (global 4-component vector of float)
 0:34    Function Parameters: 
-0:34      'input' (in 4-component vector of float)
+0:34      'input' (layout(location=0 ) in 4-component vector of float)
+0:34      's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?     Sequence
 0:39      Compare Equal (temp bool)
 0:39        's3' (temp structure{temp 3-component vector of bool b3})
@@ -18,18 +19,27 @@
 0:40          's2' (global structure{temp 4-component vector of float i})
 0:40          Constant:
 0:40            0 (const int)
-0:40        ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord)
-0:40          's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4})
-0:40          Constant:
-0:40            7 (const int)
-0:42      Branch: Return with expression
-0:42        'input' (in 4-component vector of float)
+0:?         'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float)
+0:42      Sequence
+0:42        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:42          'input' (layout(location=0 ) in 4-component vector of float)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     's1' (global structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d})
 0:?     's2' (global structure{temp 4-component vector of float i})
-0:?     's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4})
 0:?     'ff5' (layout(binding=5 offset=20 ) global 3-component vector of float)
 0:?     'ff6' (layout(binding=8 offset=36 ) global 3-component vector of float)
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+0:?     'a' (layout(location=1 ) smooth in 4-component vector of float)
+0:?     'b' (layout(location=2 ) flat in bool)
+0:?     'c' (layout(location=3 ) centroid noperspective in 1-component vector of float)
+0:?     'd' (layout(location=4 ) centroid sample in 2-component vector of float)
+0:?     'ff1' (in bool Face)
+0:?     'ff2' (layout(location=5 offset=4 ) in bool)
+0:?     'ff3' (layout(location=6 binding=0 offset=4 ) in bool)
+0:?     'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -38,9 +48,10 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:43  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:34  Function Definition: PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (global 4-component vector of float)
 0:34    Function Parameters: 
-0:34      'input' (in 4-component vector of float)
+0:34      'input' (layout(location=0 ) in 4-component vector of float)
+0:34      's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?     Sequence
 0:39      Compare Equal (temp bool)
 0:39        's3' (temp structure{temp 3-component vector of bool b3})
@@ -50,29 +61,37 @@
 0:40          's2' (global structure{temp 4-component vector of float i})
 0:40          Constant:
 0:40            0 (const int)
-0:40        ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord)
-0:40          's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4})
-0:40          Constant:
-0:40            7 (const int)
-0:42      Branch: Return with expression
-0:42        'input' (in 4-component vector of float)
+0:?         'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float)
+0:42      Sequence
+0:42        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:42          'input' (layout(location=0 ) in 4-component vector of float)
+0:42        Branch: Return
 0:?   Linker Objects
 0:?     's1' (global structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d})
 0:?     's2' (global structure{temp 4-component vector of float i})
-0:?     's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4})
 0:?     'ff5' (layout(binding=5 offset=20 ) global 3-component vector of float)
 0:?     'ff6' (layout(binding=8 offset=36 ) global 3-component vector of float)
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+0:?     'a' (layout(location=1 ) smooth in 4-component vector of float)
+0:?     'b' (layout(location=2 ) flat in bool)
+0:?     'c' (layout(location=3 ) centroid noperspective in 1-component vector of float)
+0:?     'd' (layout(location=4 ) centroid sample in 2-component vector of float)
+0:?     'ff1' (in bool Face)
+0:?     'ff2' (layout(location=5 offset=4 ) in bool)
+0:?     'ff3' (layout(location=6 binding=0 offset=4 ) in bool)
+0:?     'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 44
+// Id's are bound by 52
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 34
+                              EntryPoint Fragment 4  "PixelShaderFunction" 25 30 31 41 43 45 48 49 50 51
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 8  "FS"
                               MemberName 8(FS) 0  "b3"
@@ -80,31 +99,47 @@
                               Name 19  ""
                               MemberName 19 0  "i"
                               Name 21  "s2"
-                              Name 25  ""
-                              MemberName 25 0  "a"
-                              MemberName 25 1  "b"
-                              MemberName 25 2  "c"
-                              MemberName 25 3  "d"
-                              MemberName 25 4  "ff1"
-                              MemberName 25 5  "ff2"
-                              MemberName 25 6  "ff3"
-                              MemberName 25 7  "ff4"
-                              Name 27  "s4"
-                              Name 34  "input"
-                              Name 37  "myS"
-                              MemberName 37(myS) 0  "b"
-                              MemberName 37(myS) 1  "c"
-                              MemberName 37(myS) 2  "a"
-                              MemberName 37(myS) 3  "d"
-                              Name 39  "s1"
-                              Name 42  "ff5"
-                              Name 43  "ff6"
-                              MemberDecorate 25 4 BuiltIn FrontFacing
-                              MemberDecorate 25 7 BuiltIn FragCoord
-                              Decorate 42(ff5) Offset 20
-                              Decorate 42(ff5) Binding 5
-                              Decorate 43(ff6) Offset 36
-                              Decorate 43(ff6) Binding 8
+                              Name 25  "ff4"
+                              Name 30  "@entryPointOutput"
+                              Name 31  "input"
+                              Name 34  "myS"
+                              MemberName 34(myS) 0  "b"
+                              MemberName 34(myS) 1  "c"
+                              MemberName 34(myS) 2  "a"
+                              MemberName 34(myS) 3  "d"
+                              Name 36  "s1"
+                              Name 39  "ff5"
+                              Name 40  "ff6"
+                              Name 41  "a"
+                              Name 43  "b"
+                              Name 45  "c"
+                              Name 48  "d"
+                              Name 49  "ff1"
+                              Name 50  "ff2"
+                              Name 51  "ff3"
+                              Decorate 25(ff4) Offset 4
+                              Decorate 25(ff4) Location 7
+                              Decorate 25(ff4) Binding 0
+                              Decorate 30(@entryPointOutput) Location 0
+                              Decorate 31(input) Location 0
+                              Decorate 39(ff5) Offset 20
+                              Decorate 39(ff5) Binding 5
+                              Decorate 40(ff6) Offset 36
+                              Decorate 40(ff6) Binding 8
+                              Decorate 41(a) Location 1
+                              Decorate 43(b) Flat
+                              Decorate 43(b) Location 2
+                              Decorate 45(c) NoPerspective
+                              Decorate 45(c) Centroid
+                              Decorate 45(c) Location 3
+                              Decorate 48(d) Centroid
+                              Decorate 48(d) Location 4
+                              Decorate 49(ff1) BuiltIn FrontFacing
+                              Decorate 50(ff2) Offset 4
+                              Decorate 50(ff2) Location 5
+                              Decorate 51(ff3) Offset 4
+                              Decorate 51(ff3) Location 6
+                              Decorate 51(ff3) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeBool
@@ -118,21 +153,30 @@
           21(s2):     20(ptr) Variable Private
               22:             TypeInt 32 1
               23:     22(int) Constant 0
-              24:             TypeVector 17(float) 2
-              25:             TypeStruct 18(fvec4) 6(bool) 17(float) 24(fvec2) 6(bool) 6(bool) 6(bool) 18(fvec4)
-              26:             TypePointer Private 25(struct)
-          27(s4):     26(ptr) Variable Private
-              28:     22(int) Constant 7
-              29:             TypePointer Private 18(fvec4)
-              33:             TypePointer Input 18(fvec4)
-       34(input):     33(ptr) Variable Input
-         37(myS):             TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4)
-              38:             TypePointer Private 37(myS)
-          39(s1):     38(ptr) Variable Private
-              40:             TypeVector 17(float) 3
-              41:             TypePointer Private 40(fvec3)
-         42(ff5):     41(ptr) Variable Private
-         43(ff6):     41(ptr) Variable Private
+              24:             TypePointer Input 18(fvec4)
+         25(ff4):     24(ptr) Variable Input
+              27:             TypePointer Private 18(fvec4)
+              29:             TypePointer Output 18(fvec4)
+30(@entryPointOutput):     29(ptr) Variable Output
+       31(input):     24(ptr) Variable Input
+         34(myS):             TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4)
+              35:             TypePointer Private 34(myS)
+          36(s1):     35(ptr) Variable Private
+              37:             TypeVector 17(float) 3
+              38:             TypePointer Private 37(fvec3)
+         39(ff5):     38(ptr) Variable Private
+         40(ff6):     38(ptr) Variable Private
+           41(a):     24(ptr) Variable Input
+              42:             TypePointer Input 6(bool)
+           43(b):     42(ptr) Variable Input
+              44:             TypePointer Input 17(float)
+           45(c):     44(ptr) Variable Input
+              46:             TypeVector 17(float) 2
+              47:             TypePointer Input 46(fvec2)
+           48(d):     47(ptr) Variable Input
+         49(ff1):     42(ptr) Variable Input
+         50(ff2):     42(ptr) Variable Input
+         51(ff3):     42(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
           10(s3):      9(ptr) Variable Function
@@ -142,10 +186,10 @@
               14:    7(bvec3) CompositeExtract 12 0
               15:    7(bvec3) LogicalEqual 13 14
               16:     6(bool) All 15
-              30:     29(ptr) AccessChain 27(s4) 28
-              31:   18(fvec4) Load 30
-              32:     29(ptr) AccessChain 21(s2) 23
-                              Store 32 31
-              35:   18(fvec4) Load 34(input)
-                              ReturnValue 35
+              26:   18(fvec4) Load 25(ff4)
+              28:     27(ptr) AccessChain 21(s2) 23
+                              Store 28 26
+              32:   18(fvec4) Load 31(input)
+                              Store 30(@entryPointOutput) 32
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structin.vert.out b/Test/baseResults/hlsl.structin.vert.out
new file mode 100755
index 0000000..b27f210
--- /dev/null
+++ b/Test/baseResults/hlsl.structin.vert.out
@@ -0,0 +1,226 @@
+hlsl.structin.vert
+Shader version: 450
+0:? Sequence
+0:8  Function Definition: main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; (global structure Position{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:8    Function Parameters: 
+0:8      'd' (layout(location=0 ) in 4-component vector of float)
+0:8      'vi' (in structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:8      'e' (layout(location=5 ) in 4-component vector of float)
+0:?     Sequence
+0:11      move second child to first child (temp 4-component vector of float)
+0:11        b: direct index for structure (temp 4-component vector of float)
+0:11          'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:11          Constant:
+0:11            2 (const int)
+0:11        add (temp 4-component vector of float)
+0:11          add (temp 4-component vector of float)
+0:11            add (temp 4-component vector of float)
+0:11              add (temp 4-component vector of float)
+0:11                direct index (layout(location=1 ) temp 4-component vector of float)
+0:?                   'm' (layout(location=1 ) in 2-element array of 4-component vector of float)
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                direct index (layout(location=1 ) temp 4-component vector of float)
+0:?                   'm' (layout(location=1 ) in 2-element array of 4-component vector of float)
+0:11                  Constant:
+0:11                    0 (const int)
+0:11              Construct vec4 (temp 4-component vector of float)
+0:11                Convert uint to float (temp float)
+0:11                  direct index (temp uint)
+0:?                     'coord' (layout(location=3 ) in 2-component vector of uint)
+0:11                    Constant:
+0:11                      0 (const int)
+0:11            'd' (layout(location=0 ) in 4-component vector of float)
+0:11          'e' (layout(location=5 ) in 4-component vector of float)
+0:?       Sequence
+0:?         Sequence
+0:13          move second child to first child (temp 2-element array of 4-component vector of float)
+0:?             'm' (layout(location=0 ) out 2-element array of 4-component vector of float)
+0:13            m: direct index for structure (temp 2-element array of 4-component vector of float)
+0:13              'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:13              Constant:
+0:13                0 (const int)
+0:13          move second child to first child (temp 2-component vector of uint)
+0:?             'coord' (layout(location=2 ) out 2-component vector of uint)
+0:13            coord: direct index for structure (temp 2-component vector of uint)
+0:13              'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:13              Constant:
+0:13                1 (const int)
+0:13          move second child to first child (temp 4-component vector of float)
+0:?             'b' (layout(location=3 ) smooth out 4-component vector of float)
+0:13            b: direct index for structure (temp 4-component vector of float)
+0:13              'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:13              Constant:
+0:13                2 (const int)
+0:13        Branch: Return
+0:?   Linker Objects
+0:?     'm' (layout(location=0 ) out 2-element array of 4-component vector of float)
+0:?     'coord' (layout(location=2 ) out 2-component vector of uint)
+0:?     'b' (layout(location=3 ) smooth out 4-component vector of float)
+0:?     'd' (layout(location=0 ) in 4-component vector of float)
+0:?     'm' (layout(location=1 ) in 2-element array of 4-component vector of float)
+0:?     'coord' (layout(location=3 ) in 2-component vector of uint)
+0:?     'b' (layout(location=4 ) in 4-component vector of float)
+0:?     'e' (layout(location=5 ) in 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+0:? Sequence
+0:8  Function Definition: main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; (global structure Position{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:8    Function Parameters: 
+0:8      'd' (layout(location=0 ) in 4-component vector of float)
+0:8      'vi' (in structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:8      'e' (layout(location=5 ) in 4-component vector of float)
+0:?     Sequence
+0:11      move second child to first child (temp 4-component vector of float)
+0:11        b: direct index for structure (temp 4-component vector of float)
+0:11          'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:11          Constant:
+0:11            2 (const int)
+0:11        add (temp 4-component vector of float)
+0:11          add (temp 4-component vector of float)
+0:11            add (temp 4-component vector of float)
+0:11              add (temp 4-component vector of float)
+0:11                direct index (layout(location=1 ) temp 4-component vector of float)
+0:?                   'm' (layout(location=1 ) in 2-element array of 4-component vector of float)
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                direct index (layout(location=1 ) temp 4-component vector of float)
+0:?                   'm' (layout(location=1 ) in 2-element array of 4-component vector of float)
+0:11                  Constant:
+0:11                    0 (const int)
+0:11              Construct vec4 (temp 4-component vector of float)
+0:11                Convert uint to float (temp float)
+0:11                  direct index (temp uint)
+0:?                     'coord' (layout(location=3 ) in 2-component vector of uint)
+0:11                    Constant:
+0:11                      0 (const int)
+0:11            'd' (layout(location=0 ) in 4-component vector of float)
+0:11          'e' (layout(location=5 ) in 4-component vector of float)
+0:?       Sequence
+0:?         Sequence
+0:13          move second child to first child (temp 2-element array of 4-component vector of float)
+0:?             'm' (layout(location=0 ) out 2-element array of 4-component vector of float)
+0:13            m: direct index for structure (temp 2-element array of 4-component vector of float)
+0:13              'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:13              Constant:
+0:13                0 (const int)
+0:13          move second child to first child (temp 2-component vector of uint)
+0:?             'coord' (layout(location=2 ) out 2-component vector of uint)
+0:13            coord: direct index for structure (temp 2-component vector of uint)
+0:13              'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:13              Constant:
+0:13                1 (const int)
+0:13          move second child to first child (temp 4-component vector of float)
+0:?             'b' (layout(location=3 ) smooth out 4-component vector of float)
+0:13            b: direct index for structure (temp 4-component vector of float)
+0:13              'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, temp 4-component vector of float b})
+0:13              Constant:
+0:13                2 (const int)
+0:13        Branch: Return
+0:?   Linker Objects
+0:?     'm' (layout(location=0 ) out 2-element array of 4-component vector of float)
+0:?     'coord' (layout(location=2 ) out 2-component vector of uint)
+0:?     'b' (layout(location=3 ) smooth out 4-component vector of float)
+0:?     'd' (layout(location=0 ) in 4-component vector of float)
+0:?     'm' (layout(location=1 ) in 2-element array of 4-component vector of float)
+0:?     'coord' (layout(location=3 ) in 2-component vector of uint)
+0:?     'b' (layout(location=4 ) in 4-component vector of float)
+0:?     'e' (layout(location=5 ) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 60
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 18 28 36 39 45 50 55 59
+                              Name 4  "main"
+                              Name 12  "VI"
+                              MemberName 12(VI) 0  "m"
+                              MemberName 12(VI) 1  "coord"
+                              MemberName 12(VI) 2  "b"
+                              Name 14  "local"
+                              Name 18  "m"
+                              Name 28  "coord"
+                              Name 36  "d"
+                              Name 39  "e"
+                              Name 45  "m"
+                              Name 50  "coord"
+                              Name 55  "b"
+                              Name 59  "b"
+                              Decorate 18(m) Location 1
+                              Decorate 28(coord) Location 3
+                              Decorate 36(d) Location 0
+                              Decorate 39(e) Location 5
+                              Decorate 45(m) Location 0
+                              Decorate 50(coord) Location 2
+                              Decorate 55(b) Location 3
+                              Decorate 59(b) Location 4
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 2
+              10:             TypeArray 7(fvec4) 9
+              11:             TypeVector 8(int) 2
+          12(VI):             TypeStruct 10 11(ivec2) 7(fvec4)
+              13:             TypePointer Function 12(VI)
+              15:             TypeInt 32 1
+              16:     15(int) Constant 2
+              17:             TypePointer Input 10
+           18(m):     17(ptr) Variable Input
+              19:     15(int) Constant 1
+              20:             TypePointer Input 7(fvec4)
+              23:     15(int) Constant 0
+              27:             TypePointer Input 11(ivec2)
+       28(coord):     27(ptr) Variable Input
+              29:      8(int) Constant 0
+              30:             TypePointer Input 8(int)
+           36(d):     20(ptr) Variable Input
+           39(e):     20(ptr) Variable Input
+              42:             TypePointer Function 7(fvec4)
+              44:             TypePointer Output 10
+           45(m):     44(ptr) Variable Output
+              46:             TypePointer Function 10
+              49:             TypePointer Output 11(ivec2)
+       50(coord):     49(ptr) Variable Output
+              51:             TypePointer Function 11(ivec2)
+              54:             TypePointer Output 7(fvec4)
+           55(b):     54(ptr) Variable Output
+           59(b):     20(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+       14(local):     13(ptr) Variable Function
+              21:     20(ptr) AccessChain 18(m) 19
+              22:    7(fvec4) Load 21
+              24:     20(ptr) AccessChain 18(m) 23
+              25:    7(fvec4) Load 24
+              26:    7(fvec4) FAdd 22 25
+              31:     30(ptr) AccessChain 28(coord) 29
+              32:      8(int) Load 31
+              33:    6(float) ConvertUToF 32
+              34:    7(fvec4) CompositeConstruct 33 33 33 33
+              35:    7(fvec4) FAdd 26 34
+              37:    7(fvec4) Load 36(d)
+              38:    7(fvec4) FAdd 35 37
+              40:    7(fvec4) Load 39(e)
+              41:    7(fvec4) FAdd 38 40
+              43:     42(ptr) AccessChain 14(local) 16
+                              Store 43 41
+              47:     46(ptr) AccessChain 14(local) 23
+              48:          10 Load 47
+                              Store 45(m) 48
+              52:     51(ptr) AccessChain 14(local) 19
+              53:   11(ivec2) Load 52
+                              Store 50(coord) 53
+              56:     42(ptr) AccessChain 14(local) 16
+              57:    7(fvec4) Load 56
+                              Store 55(b) 57
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.switch.frag.out b/Test/baseResults/hlsl.switch.frag.out
index c4af33f..abf777a 100755
--- a/Test/baseResults/hlsl.switch.frag.out
+++ b/Test/baseResults/hlsl.switch.frag.out
@@ -2,16 +2,16 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:56  Function Definition: PixelShaderFunction(vf4;i1;i1; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4;i1;i1; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
-0:2      'c' (in int)
-0:2      'd' (in int)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
+0:2      'c' (layout(location=1 ) in int)
+0:2      'd' (layout(location=2 ) in int)
 0:?     Sequence
-0:3      'c' (in int)
+0:3      'c' (layout(location=1 ) in int)
 0:7      switch
 0:7      condition
-0:7        'c' (in int)
+0:7        'c' (layout(location=1 ) in int)
 0:7      body
 0:7        Sequence
 0:9          default: 
@@ -19,7 +19,7 @@
 0:7            Branch: Break
 0:12      switch
 0:12      condition
-0:12        'c' (in int)
+0:12        'c' (layout(location=1 ) in int)
 0:12      body
 0:12        Sequence
 0:13          case:  with expression
@@ -27,18 +27,18 @@
 0:13              1 (const int)
 0:?           Sequence
 0:14            Pre-Increment (temp 4-component vector of float)
-0:14              'input' (in 4-component vector of float)
+0:14              'input' (layout(location=0 ) in 4-component vector of float)
 0:15            Branch: Break
 0:16          case:  with expression
 0:16            Constant:
 0:16              2 (const int)
 0:?           Sequence
 0:17            Pre-Decrement (temp 4-component vector of float)
-0:17              'input' (in 4-component vector of float)
+0:17              'input' (layout(location=0 ) in 4-component vector of float)
 0:18            Branch: Break
 0:21      switch
 0:21      condition
-0:21        'c' (in int)
+0:21        'c' (layout(location=1 ) in int)
 0:21      body
 0:21        Sequence
 0:22          case:  with expression
@@ -46,7 +46,7 @@
 0:22              1 (const int)
 0:?           Sequence
 0:23            Pre-Increment (temp 4-component vector of float)
-0:23              'input' (in 4-component vector of float)
+0:23              'input' (layout(location=0 ) in 4-component vector of float)
 0:24            Branch: Break
 0:25          case:  with expression
 0:25            Constant:
@@ -54,7 +54,7 @@
 0:?           Sequence
 0:26            switch
 0:26            condition
-0:26              'd' (in int)
+0:26              'd' (layout(location=2 ) in int)
 0:26            body
 0:26              Sequence
 0:27                case:  with expression
@@ -62,7 +62,7 @@
 0:27                    2 (const int)
 0:?                 Sequence
 0:28                  add second child into first child (temp 4-component vector of float)
-0:28                    'input' (in 4-component vector of float)
+0:28                    'input' (layout(location=0 ) in 4-component vector of float)
 0:28                    Constant:
 0:28                      2.000000
 0:29                  Branch: Break
@@ -71,7 +71,7 @@
 0:30                    3 (const int)
 0:?                 Sequence
 0:31                  add second child into first child (temp 4-component vector of float)
-0:31                    'input' (in 4-component vector of float)
+0:31                    'input' (layout(location=0 ) in 4-component vector of float)
 0:31                    Constant:
 0:31                      3.000000
 0:32                  Branch: Break
@@ -79,12 +79,12 @@
 0:35          default: 
 0:?           Sequence
 0:36            add second child into first child (temp 4-component vector of float)
-0:36              'input' (in 4-component vector of float)
+0:36              'input' (layout(location=0 ) in 4-component vector of float)
 0:36              Constant:
 0:36                4.000000
 0:39      switch
 0:39      condition
-0:39        'c' (in int)
+0:39        'c' (layout(location=1 ) in int)
 0:39      body
 0:39        Sequence
 0:40          case:  with expression
@@ -94,7 +94,7 @@
 0:39            Branch: Break
 0:43      switch
 0:43      condition
-0:43        'c' (in int)
+0:43        'c' (layout(location=1 ) in int)
 0:43      body
 0:43        Sequence
 0:44          case:  with expression
@@ -108,7 +108,7 @@
 0:46              3 (const int)
 0:?           Sequence
 0:47            Pre-Increment (temp 4-component vector of float)
-0:47              'input' (in 4-component vector of float)
+0:47              'input' (layout(location=0 ) in 4-component vector of float)
 0:48            Branch: Break
 0:49          case:  with expression
 0:49            Constant:
@@ -118,10 +118,17 @@
 0:50              5 (const int)
 0:?           Sequence
 0:51            Pre-Decrement (temp 4-component vector of float)
-0:51              'input' (in 4-component vector of float)
-0:54      Branch: Return with expression
-0:54        'input' (in 4-component vector of float)
+0:51              'input' (layout(location=0 ) in 4-component vector of float)
+0:54      Sequence
+0:54        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:54          'input' (layout(location=0 ) in 4-component vector of float)
+0:54        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+0:?     'c' (layout(location=1 ) in int)
+0:?     'd' (layout(location=2 ) in int)
 
 
 Linked fragment stage:
@@ -130,16 +137,16 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:56  Function Definition: PixelShaderFunction(vf4;i1;i1; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4;i1;i1; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
-0:2      'c' (in int)
-0:2      'd' (in int)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
+0:2      'c' (layout(location=1 ) in int)
+0:2      'd' (layout(location=2 ) in int)
 0:?     Sequence
-0:3      'c' (in int)
+0:3      'c' (layout(location=1 ) in int)
 0:7      switch
 0:7      condition
-0:7        'c' (in int)
+0:7        'c' (layout(location=1 ) in int)
 0:7      body
 0:7        Sequence
 0:9          default: 
@@ -147,7 +154,7 @@
 0:7            Branch: Break
 0:12      switch
 0:12      condition
-0:12        'c' (in int)
+0:12        'c' (layout(location=1 ) in int)
 0:12      body
 0:12        Sequence
 0:13          case:  with expression
@@ -155,18 +162,18 @@
 0:13              1 (const int)
 0:?           Sequence
 0:14            Pre-Increment (temp 4-component vector of float)
-0:14              'input' (in 4-component vector of float)
+0:14              'input' (layout(location=0 ) in 4-component vector of float)
 0:15            Branch: Break
 0:16          case:  with expression
 0:16            Constant:
 0:16              2 (const int)
 0:?           Sequence
 0:17            Pre-Decrement (temp 4-component vector of float)
-0:17              'input' (in 4-component vector of float)
+0:17              'input' (layout(location=0 ) in 4-component vector of float)
 0:18            Branch: Break
 0:21      switch
 0:21      condition
-0:21        'c' (in int)
+0:21        'c' (layout(location=1 ) in int)
 0:21      body
 0:21        Sequence
 0:22          case:  with expression
@@ -174,7 +181,7 @@
 0:22              1 (const int)
 0:?           Sequence
 0:23            Pre-Increment (temp 4-component vector of float)
-0:23              'input' (in 4-component vector of float)
+0:23              'input' (layout(location=0 ) in 4-component vector of float)
 0:24            Branch: Break
 0:25          case:  with expression
 0:25            Constant:
@@ -182,7 +189,7 @@
 0:?           Sequence
 0:26            switch
 0:26            condition
-0:26              'd' (in int)
+0:26              'd' (layout(location=2 ) in int)
 0:26            body
 0:26              Sequence
 0:27                case:  with expression
@@ -190,7 +197,7 @@
 0:27                    2 (const int)
 0:?                 Sequence
 0:28                  add second child into first child (temp 4-component vector of float)
-0:28                    'input' (in 4-component vector of float)
+0:28                    'input' (layout(location=0 ) in 4-component vector of float)
 0:28                    Constant:
 0:28                      2.000000
 0:29                  Branch: Break
@@ -199,7 +206,7 @@
 0:30                    3 (const int)
 0:?                 Sequence
 0:31                  add second child into first child (temp 4-component vector of float)
-0:31                    'input' (in 4-component vector of float)
+0:31                    'input' (layout(location=0 ) in 4-component vector of float)
 0:31                    Constant:
 0:31                      3.000000
 0:32                  Branch: Break
@@ -207,12 +214,12 @@
 0:35          default: 
 0:?           Sequence
 0:36            add second child into first child (temp 4-component vector of float)
-0:36              'input' (in 4-component vector of float)
+0:36              'input' (layout(location=0 ) in 4-component vector of float)
 0:36              Constant:
 0:36                4.000000
 0:39      switch
 0:39      condition
-0:39        'c' (in int)
+0:39        'c' (layout(location=1 ) in int)
 0:39      body
 0:39        Sequence
 0:40          case:  with expression
@@ -222,7 +229,7 @@
 0:39            Branch: Break
 0:43      switch
 0:43      condition
-0:43        'c' (in int)
+0:43        'c' (layout(location=1 ) in int)
 0:43      body
 0:43        Sequence
 0:44          case:  with expression
@@ -236,7 +243,7 @@
 0:46              3 (const int)
 0:?           Sequence
 0:47            Pre-Increment (temp 4-component vector of float)
-0:47              'input' (in 4-component vector of float)
+0:47              'input' (layout(location=0 ) in 4-component vector of float)
 0:48            Branch: Break
 0:49          case:  with expression
 0:49            Constant:
@@ -246,25 +253,36 @@
 0:50              5 (const int)
 0:?           Sequence
 0:51            Pre-Decrement (temp 4-component vector of float)
-0:51              'input' (in 4-component vector of float)
-0:54      Branch: Return with expression
-0:54        'input' (in 4-component vector of float)
+0:51              'input' (layout(location=0 ) in 4-component vector of float)
+0:54      Sequence
+0:54        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:54          'input' (layout(location=0 ) in 4-component vector of float)
+0:54        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
+0:?     'c' (layout(location=1 ) in int)
+0:?     'd' (layout(location=2 ) in int)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 82
+// Id's are bound by 84
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 8 21 41
+                              EntryPoint Fragment 4  "PixelShaderFunction" 8 21 41 81
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 8  "c"
                               Name 21  "input"
                               Name 41  "d"
+                              Name 81  "@entryPointOutput"
+                              Decorate 8(c) Location 1
+                              Decorate 21(input) Location 0
+                              Decorate 41(d) Location 2
+                              Decorate 81(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -279,6 +297,8 @@
               46:   18(float) Constant 1073741824
               51:   18(float) Constant 1077936128
               58:   18(float) Constant 1082130432
+              80:             TypePointer Output 19(fvec4)
+81(@entryPointOutput):     80(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
                9:      6(int) Load 8(c)
@@ -371,6 +391,7 @@
                                 Store 21(input) 78
                                 Branch 71
               71:             Label
-              80:   19(fvec4) Load 21(input)
-                              ReturnValue 80
+              82:   19(fvec4) Load 21(input)
+                              Store 81(@entryPointOutput) 82
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.swizzle.frag.out b/Test/baseResults/hlsl.swizzle.frag.out
index 7bb2818..0bc4bd0 100755
--- a/Test/baseResults/hlsl.swizzle.frag.out
+++ b/Test/baseResults/hlsl.swizzle.frag.out
@@ -10,7 +10,7 @@
 0:?         0.500000
 0:?         0.000000
 0:?         1.000000
-0:7  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
+0:4  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
 0:4    Function Parameters: 
 0:4      'input' (in 4-component vector of float)
 0:?     Sequence
@@ -50,7 +50,7 @@
 0:?         0.500000
 0:?         0.000000
 0:?         1.000000
-0:7  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
+0:4  Function Definition: ShaderFunction(vf4; (global 4-component vector of float)
 0:4    Function Parameters: 
 0:4      'input' (in 4-component vector of float)
 0:?     Sequence
@@ -84,7 +84,6 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "PixelShaderFunction"
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 11  "ShaderFunction(vf4;"
                               Name 10  "input"
diff --git a/Test/baseResults/hlsl.templatetypes.frag.out b/Test/baseResults/hlsl.templatetypes.frag.out
index 5acb877..f526086 100644
--- a/Test/baseResults/hlsl.templatetypes.frag.out
+++ b/Test/baseResults/hlsl.templatetypes.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:48  Function Definition: PixelShaderFunction( (global float)
+0:3  Function Definition: PixelShaderFunction( (global float)
 0:3    Function Parameters: 
 0:?     Sequence
 0:4      Sequence
@@ -192,8 +192,8 @@
 0:?             14.000000
 0:?             15.000000
 0:35      Sequence
-0:35        move second child to first child (temp 3X2 matrix of float)
-0:35          'r61' (temp 3X2 matrix of float)
+0:35        move second child to first child (temp 2X3 matrix of float)
+0:35          'r61' (temp 2X3 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -202,8 +202,8 @@
 0:?             5.000000
 0:?             6.000000
 0:36      Sequence
-0:36        move second child to first child (temp 2X3 matrix of float)
-0:36          'r62' (temp 2X3 matrix of float)
+0:36        move second child to first child (temp 3X2 matrix of float)
+0:36          'r62' (temp 3X2 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -212,8 +212,8 @@
 0:?             5.000000
 0:?             6.000000
 0:39      Sequence
-0:39        move second child to first child (temp 2X4 matrix of float)
-0:39          'r65' (temp 2X4 matrix of float)
+0:39        move second child to first child (temp 4X2 matrix of float)
+0:39          'r65' (temp 4X2 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -224,8 +224,8 @@
 0:?             7.000000
 0:?             8.000000
 0:40      Sequence
-0:40        move second child to first child (temp 3X4 matrix of float)
-0:40          'r66' (temp 3X4 matrix of float)
+0:40        move second child to first child (temp 4X3 matrix of float)
+0:40          'r66' (temp 4X3 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -239,10 +239,14 @@
 0:?             10.000000
 0:?             11.000000
 0:?             12.000000
-0:45      Branch: Return with expression
-0:45        Constant:
-0:45          0.000000
+0:45      Sequence
+0:45        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:45          Constant:
+0:45            0.000000
+0:45        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
 
 
 Linked fragment stage:
@@ -251,7 +255,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:48  Function Definition: PixelShaderFunction( (global float)
+0:3  Function Definition: PixelShaderFunction( (global float)
 0:3    Function Parameters: 
 0:?     Sequence
 0:4      Sequence
@@ -441,8 +445,8 @@
 0:?             14.000000
 0:?             15.000000
 0:35      Sequence
-0:35        move second child to first child (temp 3X2 matrix of float)
-0:35          'r61' (temp 3X2 matrix of float)
+0:35        move second child to first child (temp 2X3 matrix of float)
+0:35          'r61' (temp 2X3 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -451,8 +455,8 @@
 0:?             5.000000
 0:?             6.000000
 0:36      Sequence
-0:36        move second child to first child (temp 2X3 matrix of float)
-0:36          'r62' (temp 2X3 matrix of float)
+0:36        move second child to first child (temp 3X2 matrix of float)
+0:36          'r62' (temp 3X2 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -461,8 +465,8 @@
 0:?             5.000000
 0:?             6.000000
 0:39      Sequence
-0:39        move second child to first child (temp 2X4 matrix of float)
-0:39          'r65' (temp 2X4 matrix of float)
+0:39        move second child to first child (temp 4X2 matrix of float)
+0:39          'r65' (temp 4X2 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -473,8 +477,8 @@
 0:?             7.000000
 0:?             8.000000
 0:40      Sequence
-0:40        move second child to first child (temp 3X4 matrix of float)
-0:40          'r66' (temp 3X4 matrix of float)
+0:40        move second child to first child (temp 4X3 matrix of float)
+0:40          'r66' (temp 4X3 matrix of float)
 0:?           Constant:
 0:?             1.000000
 0:?             2.000000
@@ -488,22 +492,25 @@
 0:?             10.000000
 0:?             11.000000
 0:?             12.000000
-0:45      Branch: Return with expression
-0:45        Constant:
-0:45          0.000000
+0:45      Sequence
+0:45        move second child to first child (temp float)
+0:?           '@entryPointOutput' (layout(location=0 ) out float)
+0:45          Constant:
+0:45            0.000000
+0:45        Branch: Return
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 145
+// Id's are bound by 148
 
                               Capability Shader
                               Capability Float64
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction"
+                              EntryPoint Fragment 4  "PixelShaderFunction" 146
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 9  "r00"
                               Name 15  "r01"
@@ -530,9 +537,11 @@
                               Name 105  "r50"
                               Name 122  "r51"
                               Name 125  "r61"
-                              Name 131  "r62"
+                              Name 130  "r62"
                               Name 136  "r65"
                               Name 141  "r66"
+                              Name 146  "@entryPointOutput"
+                              Decorate 146(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -628,23 +637,26 @@
              119:    6(float) Constant 1097859072
              120:    7(fvec4) ConstantComposite 116 117 118 119
              121:         103 ConstantComposite 107 110 115 120
-             123:             TypeMatrix 46(fvec2) 3
+             123:             TypeMatrix 69(fvec3) 2
              124:             TypePointer Function 123
-             126:   46(fvec2) ConstantComposite 12 13
-             127:   46(fvec2) ConstantComposite 16 108
-             128:         123 ConstantComposite 49 126 127
-             129:             TypeMatrix 69(fvec3) 2
-             130:             TypePointer Function 129
-             132:   69(fvec3) ConstantComposite 13 16 108
-             133:         129 ConstantComposite 72 132
-             134:             TypeMatrix 7(fvec4) 2
+             126:   69(fvec3) ConstantComposite 13 16 108
+             127:         123 ConstantComposite 72 126
+             128:             TypeMatrix 46(fvec2) 3
+             129:             TypePointer Function 128
+             131:   46(fvec2) ConstantComposite 12 13
+             132:   46(fvec2) ConstantComposite 16 108
+             133:         128 ConstantComposite 49 131 132
+             134:             TypeMatrix 46(fvec2) 4
              135:             TypePointer Function 134
-             137:    7(fvec4) ConstantComposite 16 108 109 111
-             138:         134 ConstantComposite 14 137
-             139:             TypeMatrix 7(fvec4) 3
+             137:   46(fvec2) ConstantComposite 109 111
+             138:         134 ConstantComposite 49 131 132 137
+             139:             TypeMatrix 69(fvec3) 4
              140:             TypePointer Function 139
-             142:    7(fvec4) ConstantComposite 112 113 114 116
-             143:         139 ConstantComposite 14 137 142
+             142:   69(fvec3) ConstantComposite 109 111 112
+             143:   69(fvec3) ConstantComposite 113 114 116
+             144:         139 ConstantComposite 72 126 142 143
+             145:             TypePointer Output 6(float)
+146(@entryPointOutput):    145(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
           9(r00):      8(ptr) Variable Function
@@ -672,7 +684,7 @@
         105(r50):    104(ptr) Variable Function
         122(r51):    104(ptr) Variable Function
         125(r61):    124(ptr) Variable Function
-        131(r62):    130(ptr) Variable Function
+        130(r62):    129(ptr) Variable Function
         136(r65):    135(ptr) Variable Function
         141(r66):    140(ptr) Variable Function
                               Store 9(r00) 14
@@ -699,9 +711,10 @@
                               Store 100(r44) 102
                               Store 105(r50) 121
                               Store 122(r51) 121
-                              Store 125(r61) 128
-                              Store 131(r62) 133
+                              Store 125(r61) 127
+                              Store 130(r62) 133
                               Store 136(r65) 138
-                              Store 141(r66) 143
-                              ReturnValue 106
+                              Store 141(r66) 144
+                              Store 146(@entryPointOutput) 106
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.typedef.frag.out b/Test/baseResults/hlsl.typedef.frag.out
index ca0235a..0600873 100755
--- a/Test/baseResults/hlsl.typedef.frag.out
+++ b/Test/baseResults/hlsl.typedef.frag.out
@@ -2,7 +2,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:12  Function Definition: ShaderFunction(vf4;i1; (global 4-component vector of float)
+0:4  Function Definition: ShaderFunction(vf4;i1; (global 4-component vector of float)
 0:4    Function Parameters: 
 0:4      'input' (in 4-component vector of float)
 0:4      'ii' (in int)
@@ -43,7 +43,7 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:12  Function Definition: ShaderFunction(vf4;i1; (global 4-component vector of float)
+0:4  Function Definition: ShaderFunction(vf4;i1; (global 4-component vector of float)
 0:4    Function Parameters: 
 0:4      'input' (in 4-component vector of float)
 0:4      'ii' (in int)
@@ -86,7 +86,6 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "PixelShaderFunction"
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 14  "ShaderFunction(vf4;i1;"
                               Name 12  "input"
diff --git a/Test/baseResults/hlsl.void.frag.out b/Test/baseResults/hlsl.void.frag.out
index c3fc10c..3715166 100755
--- a/Test/baseResults/hlsl.void.frag.out
+++ b/Test/baseResults/hlsl.void.frag.out
@@ -2,17 +2,19 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:2  Function Definition: foo1( (global void)
+0:1  Function Definition: foo1( (global void)
 0:1    Function Parameters: 
-0:4  Function Definition: foo2( (global void)
+0:2  Function Definition: foo2( (global void)
 0:2    Function Parameters: 
-0:8  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:5  Function Definition: PixelShaderFunction(vf4; (global void)
 0:5    Function Parameters: 
-0:5      'input' (in 4-component vector of float)
+0:5      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:6      Function Call: foo1( (global void)
 0:7      Function Call: foo2( (global void)
+0:8      Branch: Return
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -21,33 +23,40 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:2  Function Definition: foo1( (global void)
+0:1  Function Definition: foo1( (global void)
 0:1    Function Parameters: 
-0:4  Function Definition: foo2( (global void)
+0:2  Function Definition: foo2( (global void)
 0:2    Function Parameters: 
-0:8  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:5  Function Definition: PixelShaderFunction(vf4; (global void)
 0:5    Function Parameters: 
-0:5      'input' (in 4-component vector of float)
+0:5      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:6      Function Call: foo1( (global void)
 0:7      Function Call: foo2( (global void)
+0:8      Branch: Return
 0:?   Linker Objects
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 12
+// Id's are bound by 17
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction"
+                              EntryPoint Fragment 4  "PixelShaderFunction" 16
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 6  "foo1("
                               Name 8  "foo2("
+                              Name 16  "input"
+                              Decorate 16(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
+              13:             TypeFloat 32
+              14:             TypeVector 13(float) 4
+              15:             TypePointer Input 14(fvec4)
+       16(input):     15(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
               10:           2 FunctionCall 6(foo1()
diff --git a/Test/baseResults/hlsl.whileLoop.frag.out b/Test/baseResults/hlsl.whileLoop.frag.out
index aece52a..63e14dc 100755
--- a/Test/baseResults/hlsl.whileLoop.frag.out
+++ b/Test/baseResults/hlsl.whileLoop.frag.out
@@ -2,19 +2,22 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:8  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Loop with condition tested first
 0:3        Loop Condition
 0:3        Compare Not Equal (temp bool)
-0:3          'input' (in 4-component vector of float)
-0:3          'input' (in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
 0:3        Loop Body
 0:?         Sequence
-0:3          Branch: Return with expression
-0:3            'input' (in 4-component vector of float)
+0:3          Sequence
+0:3            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:3              'input' (layout(location=0 ) in 4-component vector of float)
+0:3            Branch: Return
 0:4      Loop with condition tested first
 0:4        Loop Condition
 0:4        Constant:
@@ -31,6 +34,8 @@
 0:6          false (const bool)
 0:6        No loop body
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -39,19 +44,22 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:8  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
+0:2  Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
 0:2    Function Parameters: 
-0:2      'input' (in 4-component vector of float)
+0:2      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
 0:3      Loop with condition tested first
 0:3        Loop Condition
 0:3        Compare Not Equal (temp bool)
-0:3          'input' (in 4-component vector of float)
-0:3          'input' (in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
+0:3          'input' (layout(location=0 ) in 4-component vector of float)
 0:3        Loop Body
 0:?         Sequence
-0:3          Branch: Return with expression
-0:3            'input' (in 4-component vector of float)
+0:3          Sequence
+0:3            move second child to first child (temp 4-component vector of float)
+0:?               '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:3              'input' (layout(location=0 ) in 4-component vector of float)
+0:3            Branch: Return
 0:4      Loop with condition tested first
 0:4        Loop Condition
 0:4        Constant:
@@ -68,19 +76,23 @@
 0:6          false (const bool)
 0:6        No loop body
 0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'input' (layout(location=0 ) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 39
+// Id's are bound by 41
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 14
+                              EntryPoint Fragment 4  "PixelShaderFunction" 14 22
                               ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 450
                               Name 4  "PixelShaderFunction"
                               Name 14  "input"
+                              Name 22  "@entryPointOutput"
+                              Decorate 14(input) Location 0
+                              Decorate 22(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               11:             TypeFloat 32
@@ -89,7 +101,9 @@
        14(input):     13(ptr) Variable Input
               17:             TypeBool
               18:             TypeVector 17(bool) 4
-              28:    17(bool) ConstantFalse
+              21:             TypePointer Output 12(fvec4)
+22(@entryPointOutput):     21(ptr) Variable Output
+              30:    17(bool) ConstantFalse
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
                               Branch 6
@@ -103,43 +117,44 @@
               20:    17(bool) Any 19
                               BranchConditional 20 7 8
                7:               Label
-              21:   12(fvec4)   Load 14(input)
-                                ReturnValue 21
+              23:   12(fvec4)   Load 14(input)
+                                Store 22(@entryPointOutput) 23
+                                Return
                9:               Label
                                 Branch 6
                8:             Label
-                              Branch 23
-              23:             Label
-                              LoopMerge 25 26 None
-                              Branch 27
-              27:             Label
-                              BranchConditional 28 24 25
-              24:               Label
-                                Branch 26
-              26:               Label
-                                Branch 23
+                              Branch 25
               25:             Label
+                              LoopMerge 27 28 None
                               Branch 29
               29:             Label
-                              LoopMerge 31 32 None
-                              Branch 33
-              33:             Label
-                              BranchConditional 28 30 31
-              30:               Label
-                                Branch 32
-              32:               Label
-                                Branch 29
+                              BranchConditional 30 26 27
+              26:               Label
+                                Branch 28
+              28:               Label
+                                Branch 25
+              27:             Label
+                              Branch 31
               31:             Label
-                              Branch 34
-              34:             Label
-                              LoopMerge 36 37 None
-                              Branch 38
-              38:             Label
-                              BranchConditional 28 35 36
-              35:               Label
-                                Branch 37
-              37:               Label
+                              LoopMerge 33 34 None
+                              Branch 35
+              35:             Label
+                              BranchConditional 30 32 33
+              32:               Label
                                 Branch 34
+              34:               Label
+                                Branch 31
+              33:             Label
+                              Branch 36
               36:             Label
+                              LoopMerge 38 39 None
+                              Branch 40
+              40:             Label
+                              BranchConditional 30 37 38
+              37:               Label
+                                Branch 39
+              39:               Label
+                                Branch 36
+              38:             Label
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/mains1.frag.out b/Test/baseResults/mains1.frag.out
index 8ba02bf..0b5c2b7 100644
--- a/Test/baseResults/mains1.frag.out
+++ b/Test/baseResults/mains1.frag.out
@@ -42,7 +42,7 @@
 Linked geometry stage:
 
 ERROR: Linking geometry stage: Contradictory output layout primitives
-ERROR: Linking geometry stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking geometry stage: Missing entry point: Each stage requires one entry point
 ERROR: Linking geometry stage: At least one shader must specify an input layout primitive
 ERROR: Linking geometry stage: At least one shader must specify a layout(max_vertices = value)
 
diff --git a/Test/baseResults/noMain.vert.out b/Test/baseResults/noMain.vert.out
index 630af95..80a3225 100644
--- a/Test/baseResults/noMain.vert.out
+++ b/Test/baseResults/noMain.vert.out
@@ -23,7 +23,7 @@
 
 Linked vertex stage:
 
-ERROR: Linking vertex stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
 
 Linked fragment stage:
 
diff --git a/Test/baseResults/nonVulkan.frag.out b/Test/baseResults/nonVulkan.frag.out
index 10c693c..8e03610 100644
--- a/Test/baseResults/nonVulkan.frag.out
+++ b/Test/baseResults/nonVulkan.frag.out
@@ -18,7 +18,7 @@
 
 Linked fragment stage:
 
-ERROR: Linking fragment stage: Missing entry point: Each stage requires one "void main()" entry point
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
 
 Shader version: 450
 ERROR: node is still EOpNull!
diff --git a/Test/baseResults/remap.basic.dcefunc.frag.out b/Test/baseResults/remap.basic.dcefunc.frag.out
new file mode 100644
index 0000000..0f367c9
--- /dev/null
+++ b/Test/baseResults/remap.basic.dcefunc.frag.out
@@ -0,0 +1,40 @@
+remap.basic.dcefunc.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 19
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 14 16
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "dead_fn("
+                              Name 14  "outf4"
+                              Name 16  "inf"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+               8:             TypeFunction 7(fvec3)
+              10:    6(float) Constant 0
+              11:    7(fvec3) ConstantComposite 10 10 10
+              12:             TypeVector 6(float) 4
+              13:             TypePointer Output 12(fvec4)
+       14(outf4):     13(ptr) Variable Output
+              15:             TypePointer Input 6(float)
+         16(inf):     15(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              17:    6(float) Load 16(inf)
+              18:   12(fvec4) CompositeConstruct 17 17 17 17
+                              Store 14(outf4) 18
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.basic.dcevartype.frag.out b/Test/baseResults/remap.basic.dcevartype.frag.out
new file mode 100644
index 0000000..dd03946
--- /dev/null
+++ b/Test/baseResults/remap.basic.dcevartype.frag.out
@@ -0,0 +1,12 @@
+remap.basic.dcevartype.frag
+ERROR: #version: ES shaders for Vulkan SPIR-V require version 310 or higher
+Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
+ERROR: 1 compilation errors.  No code generated.
+
+
+
+Linked fragment stage:
+
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one "void main()" entry point
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/remap.basic.everything.frag.out b/Test/baseResults/remap.basic.everything.frag.out
new file mode 100644
index 0000000..f6d6ed4
--- /dev/null
+++ b/Test/baseResults/remap.basic.everything.frag.out
@@ -0,0 +1,31 @@
+remap.basic.everything.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 24969
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 4539 3773
+                              ExecutionMode 5663 OriginUpperLeft
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              13:             TypeFloat 32
+              29:             TypeVector 13(float) 4
+             666:             TypePointer Output 29(fvec4)
+            4539:    666(ptr) Variable Output
+             650:             TypePointer Input 13(float)
+            3773:    650(ptr) Variable Input
+            5663:           8 Function None 1282
+           24968:             Label
+           17486:   13(float) Load 3773
+           17691:   29(fvec4) CompositeConstruct 17486 17486 17486 17486
+                              Store 4539 17691
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.basic.none.frag.out b/Test/baseResults/remap.basic.none.frag.out
new file mode 100644
index 0000000..3632309
--- /dev/null
+++ b/Test/baseResults/remap.basic.none.frag.out
@@ -0,0 +1,44 @@
+remap.basic.none.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 20
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 15 17
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "dead_fn("
+                              Name 15  "outf4"
+                              Name 17  "inf"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+               8:             TypeFunction 7(fvec3)
+              11:    6(float) Constant 0
+              12:    7(fvec3) ConstantComposite 11 11 11
+              13:             TypeVector 6(float) 4
+              14:             TypePointer Output 13(fvec4)
+       15(outf4):     14(ptr) Variable Output
+              16:             TypePointer Input 6(float)
+         17(inf):     16(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              18:    6(float) Load 17(inf)
+              19:   13(fvec4) CompositeConstruct 18 18 18 18
+                              Store 15(outf4) 19
+                              Return
+                              FunctionEnd
+     9(dead_fn():    7(fvec3) Function None 8
+              10:             Label
+                              ReturnValue 12
+                              FunctionEnd
diff --git a/Test/baseResults/remap.basic.strip.frag.out b/Test/baseResults/remap.basic.strip.frag.out
new file mode 100644
index 0000000..d34ce8f
--- /dev/null
+++ b/Test/baseResults/remap.basic.strip.frag.out
@@ -0,0 +1,39 @@
+remap.basic.strip.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 20
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 15 17
+                              ExecutionMode 4 OriginUpperLeft
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+               8:             TypeFunction 7(fvec3)
+              11:    6(float) Constant 0
+              12:    7(fvec3) ConstantComposite 11 11 11
+              13:             TypeVector 6(float) 4
+              14:             TypePointer Output 13(fvec4)
+              15:     14(ptr) Variable Output
+              16:             TypePointer Input 6(float)
+              17:     16(ptr) Variable Input
+               4:           2 Function None 3
+               5:             Label
+              18:    6(float) Load 17
+              19:   13(fvec4) CompositeConstruct 18 18 18 18
+                              Store 15 19
+                              Return
+                              FunctionEnd
+               9:    7(fvec3) Function None 8
+              10:             Label
+                              ReturnValue 12
+                              FunctionEnd
diff --git a/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out b/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
new file mode 100644
index 0000000..bd1fa7e
--- /dev/null
+++ b/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
@@ -0,0 +1,223 @@
+remap.hlsl.sample.basic.everything.frag
+WARNING: 0:4: 'immediate sampler state' : unimplemented 
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 24916
+
+                              Capability Shader
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 4656 4112
+                              ExecutionMode 5663 OriginUpperLeft
+                              Decorate 4727 DescriptorSet 0
+                              Decorate 4727 Binding 0
+                              Decorate 3305 DescriptorSet 0
+                              Decorate 3305 Binding 0
+                              Decorate 4743 DescriptorSet 0
+                              Decorate 4807 DescriptorSet 0
+                              Decorate 5042 DescriptorSet 0
+                              Decorate 5058 DescriptorSet 0
+                              Decorate 5122 DescriptorSet 0
+                              Decorate 3967 DescriptorSet 0
+                              Decorate 3983 DescriptorSet 0
+                              Decorate 4047 DescriptorSet 0
+                              Decorate 3789 DescriptorSet 0
+                              Decorate 3805 DescriptorSet 0
+                              Decorate 3869 DescriptorSet 0
+                              Decorate 4656 Location 0
+                              Decorate 4112 BuiltIn FragDepth
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              12:             TypeInt 32 1
+            1335:             TypeStruct 12(int) 12(int) 12(int) 12(int) 12(int) 12(int) 12(int) 12(int) 12(int) 12(int) 12(int) 12(int)
+            1972:             TypePointer Function 1335(struct)
+            2574:     12(int) Constant 1
+             649:             TypePointer Function 12(int)
+            2577:     12(int) Constant 2
+            2580:     12(int) Constant 3
+            2583:     12(int) Constant 4
+            2586:     12(int) Constant 5
+            2589:     12(int) Constant 6
+            2571:     12(int) Constant 0
+            2592:     12(int) Constant 7
+            2595:     12(int) Constant 8
+            2598:     12(int) Constant 9
+            2601:     12(int) Constant 10
+            2604:     12(int) Constant 11
+              13:             TypeFloat 32
+              29:             TypeVector 13(float) 4
+             666:             TypePointer Function 29(fvec4)
+             149:             TypeImage 13(float) 1D sampled format:Unknown
+             786:             TypePointer UniformConstant 149
+            4727:    786(ptr) Variable UniformConstant
+             508:             TypeSampler
+            1145:             TypePointer UniformConstant 508
+            3305:   1145(ptr) Variable UniformConstant
+             510:             TypeSampledImage 149
+            2935:   13(float) Constant 1036831949
+              26:             TypeVector 12(int) 4
+             148:             TypeImage 12(int) 1D sampled format:Unknown
+             785:             TypePointer UniformConstant 148
+            4743:    785(ptr) Variable UniformConstant
+             511:             TypeSampledImage 148
+            2821:   13(float) Constant 1045220557
+              11:             TypeInt 32 0
+              23:             TypeVector 11(int) 4
+             147:             TypeImage 11(int) 1D sampled format:Unknown
+             784:             TypePointer UniformConstant 147
+            4807:    784(ptr) Variable UniformConstant
+             512:             TypeSampledImage 147
+            2151:   13(float) Constant 1050253722
+             150:             TypeImage 13(float) 2D sampled format:Unknown
+             787:             TypePointer UniformConstant 150
+            5042:    787(ptr) Variable UniformConstant
+             513:             TypeSampledImage 150
+              19:             TypeVector 13(float) 2
+            1825:   19(fvec2) ConstantComposite 2935 2821
+             151:             TypeImage 12(int) 2D sampled format:Unknown
+             788:             TypePointer UniformConstant 151
+            5058:    788(ptr) Variable UniformConstant
+             514:             TypeSampledImage 151
+            2707:   13(float) Constant 1053609165
+            2028:   19(fvec2) ConstantComposite 2151 2707
+             152:             TypeImage 11(int) 2D sampled format:Unknown
+             789:             TypePointer UniformConstant 152
+            5122:    789(ptr) Variable UniformConstant
+             515:             TypeSampledImage 152
+             252:   13(float) Constant 1056964608
+            2037:   13(float) Constant 1058642330
+            2684:   19(fvec2) ConstantComposite 252 2037
+             153:             TypeImage 13(float) 3D sampled format:Unknown
+             790:             TypePointer UniformConstant 153
+            3967:    790(ptr) Variable UniformConstant
+             516:             TypeSampledImage 153
+              24:             TypeVector 13(float) 3
+            1660:   24(fvec3) ConstantComposite 2935 2821 2151
+             154:             TypeImage 12(int) 3D sampled format:Unknown
+             791:             TypePointer UniformConstant 154
+            3983:    791(ptr) Variable UniformConstant
+             517:             TypeSampledImage 154
+            2174:   24(fvec3) ConstantComposite 2707 252 2037
+             155:             TypeImage 11(int) 3D sampled format:Unknown
+             792:             TypePointer UniformConstant 155
+            4047:    792(ptr) Variable UniformConstant
+             518:             TypeSampledImage 155
+             808:   13(float) Constant 1060320051
+            2593:   13(float) Constant 1061997773
+            1364:   13(float) Constant 1063675494
+            2476:   24(fvec3) ConstantComposite 808 2593 1364
+             156:             TypeImage 13(float) Cube sampled format:Unknown
+             793:             TypePointer UniformConstant 156
+            3789:    793(ptr) Variable UniformConstant
+             519:             TypeSampledImage 156
+             157:             TypeImage 12(int) Cube sampled format:Unknown
+             794:             TypePointer UniformConstant 157
+            3805:    794(ptr) Variable UniformConstant
+             520:             TypeSampledImage 157
+             158:             TypeImage 11(int) Cube sampled format:Unknown
+             795:             TypePointer UniformConstant 158
+            3869:    795(ptr) Variable UniformConstant
+             521:             TypeSampledImage 158
+            1032:             TypeStruct 29(fvec4) 13(float)
+            1669:             TypePointer Function 1032(struct)
+             138:   13(float) Constant 1065353216
+            1284:   29(fvec4) ConstantComposite 138 138 138 138
+             650:             TypePointer Function 13(float)
+             667:             TypePointer Output 29(fvec4)
+            4656:    667(ptr) Variable Output
+             651:             TypePointer Output 13(float)
+            4112:    651(ptr) Variable Output
+            5663:           8 Function None 1282
+           24915:             Label
+            5830:   1972(ptr) Variable Function
+            5072:   1669(ptr) Variable Function
+           22097:    649(ptr) AccessChain 5830 2574
+                              Store 22097 2574
+           19732:    649(ptr) AccessChain 5830 2577
+                              Store 19732 2574
+           19733:    649(ptr) AccessChain 5830 2580
+                              Store 19733 2574
+           19734:    649(ptr) AccessChain 5830 2583
+                              Store 19734 2574
+           19735:    649(ptr) AccessChain 5830 2586
+                              Store 19735 2574
+           19736:    649(ptr) AccessChain 5830 2589
+                              Store 19736 2574
+           19737:    649(ptr) AccessChain 5830 2571
+                              Store 19737 2574
+           19738:    649(ptr) AccessChain 5830 2592
+                              Store 19738 2574
+           19739:    649(ptr) AccessChain 5830 2595
+                              Store 19739 2574
+           19740:    649(ptr) AccessChain 5830 2598
+                              Store 19740 2574
+           19741:    649(ptr) AccessChain 5830 2601
+                              Store 19741 2574
+           19656:    649(ptr) AccessChain 5830 2604
+                              Store 19656 2574
+           14934:         149 Load 4727
+           11686:         508 Load 3305
+           11940:         510 SampledImage 14934 11686
+            7877:   29(fvec4) ImageSampleImplicitLod 11940 2935
+           15360:         148 Load 4743
+           15706:         508 Load 3305
+           11941:         511 SampledImage 15360 15706
+            7878:   26(ivec4) ImageSampleImplicitLod 11941 2821
+           15361:         147 Load 4807
+           15707:         508 Load 3305
+           11942:         512 SampledImage 15361 15707
+            7879:   23(ivec4) ImageSampleImplicitLod 11942 2151
+           15362:         150 Load 5042
+           15708:         508 Load 3305
+           11943:         513 SampledImage 15362 15708
+            7880:   29(fvec4) ImageSampleImplicitLod 11943 1825
+           15363:         151 Load 5058
+           15709:         508 Load 3305
+           11944:         514 SampledImage 15363 15709
+            7881:   26(ivec4) ImageSampleImplicitLod 11944 2028
+           15364:         152 Load 5122
+           15710:         508 Load 3305
+           11945:         515 SampledImage 15364 15710
+            7882:   23(ivec4) ImageSampleImplicitLod 11945 2684
+           15365:         153 Load 3967
+           15711:         508 Load 3305
+           11946:         516 SampledImage 15365 15711
+            7883:   29(fvec4) ImageSampleImplicitLod 11946 1660
+           15366:         154 Load 3983
+           15712:         508 Load 3305
+           11947:         517 SampledImage 15366 15712
+            7884:   26(ivec4) ImageSampleImplicitLod 11947 2174
+           15367:         155 Load 4047
+           15713:         508 Load 3305
+           11948:         518 SampledImage 15367 15713
+            7885:   23(ivec4) ImageSampleImplicitLod 11948 2476
+           15368:         156 Load 3789
+           15714:         508 Load 3305
+           11949:         519 SampledImage 15368 15714
+            7886:   29(fvec4) ImageSampleImplicitLod 11949 1660
+           15369:         157 Load 3805
+           15715:         508 Load 3305
+           11950:         520 SampledImage 15369 15715
+            7887:   26(ivec4) ImageSampleImplicitLod 11950 2174
+           15370:         158 Load 3869
+           15716:         508 Load 3305
+           12016:         521 SampledImage 15370 15716
+            7204:   23(ivec4) ImageSampleImplicitLod 12016 2476
+           20158:    666(ptr) AccessChain 5072 2571
+                              Store 20158 1284
+           19742:    650(ptr) AccessChain 5072 2574
+                              Store 19742 138
+           19848:    666(ptr) AccessChain 5072 2571
+            7967:   29(fvec4) Load 19848
+                              Store 4656 7967
+           16622:    650(ptr) AccessChain 5072 2574
+           11539:   13(float) Load 16622
+                              Store 4112 11539
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.hlsl.sample.basic.none.frag.out b/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
new file mode 100644
index 0000000..b149718
--- /dev/null
+++ b/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
@@ -0,0 +1,305 @@
+remap.hlsl.sample.basic.none.frag
+WARNING: 0:4: 'immediate sampler state' : unimplemented 
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 190
+
+                              Capability Shader
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 180 184
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 7  "MemberTest"
+                              MemberName 7(MemberTest) 0  "Sample"
+                              MemberName 7(MemberTest) 1  "CalculateLevelOfDetail"
+                              MemberName 7(MemberTest) 2  "CalculateLevelOfDetailUnclamped"
+                              MemberName 7(MemberTest) 3  "Gather"
+                              MemberName 7(MemberTest) 4  "GetDimensions"
+                              MemberName 7(MemberTest) 5  "GetSamplePosition"
+                              MemberName 7(MemberTest) 6  "Load"
+                              MemberName 7(MemberTest) 7  "SampleBias"
+                              MemberName 7(MemberTest) 8  "SampleCmp"
+                              MemberName 7(MemberTest) 9  "SampleCmpLevelZero"
+                              MemberName 7(MemberTest) 10  "SampleGrad"
+                              MemberName 7(MemberTest) 11  "SampleLevel"
+                              Name 9  "mtest"
+                              Name 38  "txval10"
+                              Name 41  "g_tTex1df4"
+                              Name 45  "g_sSamp"
+                              Name 53  "txval11"
+                              Name 56  "g_tTex1di4"
+                              Name 66  "txval12"
+                              Name 69  "g_tTex1du4"
+                              Name 76  "txval20"
+                              Name 79  "g_tTex2df4"
+                              Name 87  "txval21"
+                              Name 90  "g_tTex2di4"
+                              Name 98  "txval22"
+                              Name 101  "g_tTex2du4"
+                              Name 110  "txval30"
+                              Name 113  "g_tTex3df4"
+                              Name 121  "txval31"
+                              Name 124  "g_tTex3di4"
+                              Name 131  "txval32"
+                              Name 134  "g_tTex3du4"
+                              Name 144  "txval40"
+                              Name 147  "g_tTexcdf4"
+                              Name 153  "txval41"
+                              Name 156  "g_tTexcdi4"
+                              Name 162  "txval42"
+                              Name 165  "g_tTexcdu4"
+                              Name 171  "PS_OUTPUT"
+                              MemberName 171(PS_OUTPUT) 0  "Color"
+                              MemberName 171(PS_OUTPUT) 1  "Depth"
+                              Name 173  "psout"
+                              Name 180  "Color"
+                              Name 184  "Depth"
+                              Name 187  "g_sSamp2d"
+                              Name 188  "g_sSamp2D_b"
+                              Name 189  "g_tTex1df4a"
+                              Decorate 41(g_tTex1df4) DescriptorSet 0
+                              Decorate 41(g_tTex1df4) Binding 0
+                              Decorate 45(g_sSamp) DescriptorSet 0
+                              Decorate 45(g_sSamp) Binding 0
+                              Decorate 56(g_tTex1di4) DescriptorSet 0
+                              Decorate 69(g_tTex1du4) DescriptorSet 0
+                              Decorate 79(g_tTex2df4) DescriptorSet 0
+                              Decorate 90(g_tTex2di4) DescriptorSet 0
+                              Decorate 101(g_tTex2du4) DescriptorSet 0
+                              Decorate 113(g_tTex3df4) DescriptorSet 0
+                              Decorate 124(g_tTex3di4) DescriptorSet 0
+                              Decorate 134(g_tTex3du4) DescriptorSet 0
+                              Decorate 147(g_tTexcdf4) DescriptorSet 0
+                              Decorate 156(g_tTexcdi4) DescriptorSet 0
+                              Decorate 165(g_tTexcdu4) DescriptorSet 0
+                              Decorate 180(Color) Location 0
+                              Decorate 184(Depth) BuiltIn FragDepth
+                              Decorate 187(g_sSamp2d) DescriptorSet 0
+                              Decorate 188(g_sSamp2D_b) DescriptorSet 0
+                              Decorate 189(g_tTex1df4a) DescriptorSet 0
+                              Decorate 189(g_tTex1df4a) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+   7(MemberTest):             TypeStruct 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int)
+               8:             TypePointer Function 7(MemberTest)
+              10:      6(int) Constant 1
+              11:             TypePointer Function 6(int)
+              13:      6(int) Constant 2
+              15:      6(int) Constant 3
+              17:      6(int) Constant 4
+              19:      6(int) Constant 5
+              21:      6(int) Constant 6
+              23:      6(int) Constant 0
+              25:      6(int) Constant 7
+              27:      6(int) Constant 8
+              29:      6(int) Constant 9
+              31:      6(int) Constant 10
+              33:      6(int) Constant 11
+              35:             TypeFloat 32
+              36:             TypeVector 35(float) 4
+              37:             TypePointer Function 36(fvec4)
+              39:             TypeImage 35(float) 1D sampled format:Unknown
+              40:             TypePointer UniformConstant 39
+  41(g_tTex1df4):     40(ptr) Variable UniformConstant
+              43:             TypeSampler
+              44:             TypePointer UniformConstant 43
+     45(g_sSamp):     44(ptr) Variable UniformConstant
+              47:             TypeSampledImage 39
+              49:   35(float) Constant 1036831949
+              51:             TypeVector 6(int) 4
+              52:             TypePointer Function 51(ivec4)
+              54:             TypeImage 6(int) 1D sampled format:Unknown
+              55:             TypePointer UniformConstant 54
+  56(g_tTex1di4):     55(ptr) Variable UniformConstant
+              59:             TypeSampledImage 54
+              61:   35(float) Constant 1045220557
+              63:             TypeInt 32 0
+              64:             TypeVector 63(int) 4
+              65:             TypePointer Function 64(ivec4)
+              67:             TypeImage 63(int) 1D sampled format:Unknown
+              68:             TypePointer UniformConstant 67
+  69(g_tTex1du4):     68(ptr) Variable UniformConstant
+              72:             TypeSampledImage 67
+              74:   35(float) Constant 1050253722
+              77:             TypeImage 35(float) 2D sampled format:Unknown
+              78:             TypePointer UniformConstant 77
+  79(g_tTex2df4):     78(ptr) Variable UniformConstant
+              82:             TypeSampledImage 77
+              84:             TypeVector 35(float) 2
+              85:   84(fvec2) ConstantComposite 49 61
+              88:             TypeImage 6(int) 2D sampled format:Unknown
+              89:             TypePointer UniformConstant 88
+  90(g_tTex2di4):     89(ptr) Variable UniformConstant
+              93:             TypeSampledImage 88
+              95:   35(float) Constant 1053609165
+              96:   84(fvec2) ConstantComposite 74 95
+              99:             TypeImage 63(int) 2D sampled format:Unknown
+             100:             TypePointer UniformConstant 99
+ 101(g_tTex2du4):    100(ptr) Variable UniformConstant
+             104:             TypeSampledImage 99
+             106:   35(float) Constant 1056964608
+             107:   35(float) Constant 1058642330
+             108:   84(fvec2) ConstantComposite 106 107
+             111:             TypeImage 35(float) 3D sampled format:Unknown
+             112:             TypePointer UniformConstant 111
+ 113(g_tTex3df4):    112(ptr) Variable UniformConstant
+             116:             TypeSampledImage 111
+             118:             TypeVector 35(float) 3
+             119:  118(fvec3) ConstantComposite 49 61 74
+             122:             TypeImage 6(int) 3D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex3di4):    123(ptr) Variable UniformConstant
+             127:             TypeSampledImage 122
+             129:  118(fvec3) ConstantComposite 95 106 107
+             132:             TypeImage 63(int) 3D sampled format:Unknown
+             133:             TypePointer UniformConstant 132
+ 134(g_tTex3du4):    133(ptr) Variable UniformConstant
+             137:             TypeSampledImage 132
+             139:   35(float) Constant 1060320051
+             140:   35(float) Constant 1061997773
+             141:   35(float) Constant 1063675494
+             142:  118(fvec3) ConstantComposite 139 140 141
+             145:             TypeImage 35(float) Cube sampled format:Unknown
+             146:             TypePointer UniformConstant 145
+ 147(g_tTexcdf4):    146(ptr) Variable UniformConstant
+             150:             TypeSampledImage 145
+             154:             TypeImage 6(int) Cube sampled format:Unknown
+             155:             TypePointer UniformConstant 154
+ 156(g_tTexcdi4):    155(ptr) Variable UniformConstant
+             159:             TypeSampledImage 154
+             163:             TypeImage 63(int) Cube sampled format:Unknown
+             164:             TypePointer UniformConstant 163
+ 165(g_tTexcdu4):    164(ptr) Variable UniformConstant
+             168:             TypeSampledImage 163
+  171(PS_OUTPUT):             TypeStruct 36(fvec4) 35(float)
+             172:             TypePointer Function 171(PS_OUTPUT)
+             174:   35(float) Constant 1065353216
+             175:   36(fvec4) ConstantComposite 174 174 174 174
+             177:             TypePointer Function 35(float)
+             179:             TypePointer Output 36(fvec4)
+      180(Color):    179(ptr) Variable Output
+             183:             TypePointer Output 35(float)
+      184(Depth):    183(ptr) Variable Output
+  187(g_sSamp2d):     44(ptr) Variable UniformConstant
+188(g_sSamp2D_b):     44(ptr) Variable UniformConstant
+189(g_tTex1df4a):     40(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+        9(mtest):      8(ptr) Variable Function
+     38(txval10):     37(ptr) Variable Function
+     53(txval11):     52(ptr) Variable Function
+     66(txval12):     65(ptr) Variable Function
+     76(txval20):     37(ptr) Variable Function
+     87(txval21):     52(ptr) Variable Function
+     98(txval22):     65(ptr) Variable Function
+    110(txval30):     37(ptr) Variable Function
+    121(txval31):     52(ptr) Variable Function
+    131(txval32):     65(ptr) Variable Function
+    144(txval40):     37(ptr) Variable Function
+    153(txval41):     52(ptr) Variable Function
+    162(txval42):     65(ptr) Variable Function
+      173(psout):    172(ptr) Variable Function
+              12:     11(ptr) AccessChain 9(mtest) 10
+                              Store 12 10
+              14:     11(ptr) AccessChain 9(mtest) 13
+                              Store 14 10
+              16:     11(ptr) AccessChain 9(mtest) 15
+                              Store 16 10
+              18:     11(ptr) AccessChain 9(mtest) 17
+                              Store 18 10
+              20:     11(ptr) AccessChain 9(mtest) 19
+                              Store 20 10
+              22:     11(ptr) AccessChain 9(mtest) 21
+                              Store 22 10
+              24:     11(ptr) AccessChain 9(mtest) 23
+                              Store 24 10
+              26:     11(ptr) AccessChain 9(mtest) 25
+                              Store 26 10
+              28:     11(ptr) AccessChain 9(mtest) 27
+                              Store 28 10
+              30:     11(ptr) AccessChain 9(mtest) 29
+                              Store 30 10
+              32:     11(ptr) AccessChain 9(mtest) 31
+                              Store 32 10
+              34:     11(ptr) AccessChain 9(mtest) 33
+                              Store 34 10
+              42:          39 Load 41(g_tTex1df4)
+              46:          43 Load 45(g_sSamp)
+              48:          47 SampledImage 42 46
+              50:   36(fvec4) ImageSampleImplicitLod 48 49
+                              Store 38(txval10) 50
+              57:          54 Load 56(g_tTex1di4)
+              58:          43 Load 45(g_sSamp)
+              60:          59 SampledImage 57 58
+              62:   51(ivec4) ImageSampleImplicitLod 60 61
+                              Store 53(txval11) 62
+              70:          67 Load 69(g_tTex1du4)
+              71:          43 Load 45(g_sSamp)
+              73:          72 SampledImage 70 71
+              75:   64(ivec4) ImageSampleImplicitLod 73 74
+                              Store 66(txval12) 75
+              80:          77 Load 79(g_tTex2df4)
+              81:          43 Load 45(g_sSamp)
+              83:          82 SampledImage 80 81
+              86:   36(fvec4) ImageSampleImplicitLod 83 85
+                              Store 76(txval20) 86
+              91:          88 Load 90(g_tTex2di4)
+              92:          43 Load 45(g_sSamp)
+              94:          93 SampledImage 91 92
+              97:   51(ivec4) ImageSampleImplicitLod 94 96
+                              Store 87(txval21) 97
+             102:          99 Load 101(g_tTex2du4)
+             103:          43 Load 45(g_sSamp)
+             105:         104 SampledImage 102 103
+             109:   64(ivec4) ImageSampleImplicitLod 105 108
+                              Store 98(txval22) 109
+             114:         111 Load 113(g_tTex3df4)
+             115:          43 Load 45(g_sSamp)
+             117:         116 SampledImage 114 115
+             120:   36(fvec4) ImageSampleImplicitLod 117 119
+                              Store 110(txval30) 120
+             125:         122 Load 124(g_tTex3di4)
+             126:          43 Load 45(g_sSamp)
+             128:         127 SampledImage 125 126
+             130:   51(ivec4) ImageSampleImplicitLod 128 129
+                              Store 121(txval31) 130
+             135:         132 Load 134(g_tTex3du4)
+             136:          43 Load 45(g_sSamp)
+             138:         137 SampledImage 135 136
+             143:   64(ivec4) ImageSampleImplicitLod 138 142
+                              Store 131(txval32) 143
+             148:         145 Load 147(g_tTexcdf4)
+             149:          43 Load 45(g_sSamp)
+             151:         150 SampledImage 148 149
+             152:   36(fvec4) ImageSampleImplicitLod 151 119
+                              Store 144(txval40) 152
+             157:         154 Load 156(g_tTexcdi4)
+             158:          43 Load 45(g_sSamp)
+             160:         159 SampledImage 157 158
+             161:   51(ivec4) ImageSampleImplicitLod 160 129
+                              Store 153(txval41) 161
+             166:         163 Load 165(g_tTexcdu4)
+             167:          43 Load 45(g_sSamp)
+             169:         168 SampledImage 166 167
+             170:   64(ivec4) ImageSampleImplicitLod 169 142
+                              Store 162(txval42) 170
+             176:     37(ptr) AccessChain 173(psout) 23
+                              Store 176 175
+             178:    177(ptr) AccessChain 173(psout) 10
+                              Store 178 174
+             181:     37(ptr) AccessChain 173(psout) 23
+             182:   36(fvec4) Load 181
+                              Store 180(Color) 182
+             185:    177(ptr) AccessChain 173(psout) 10
+             186:   35(float) Load 185
+                              Store 184(Depth) 186
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out b/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
new file mode 100644
index 0000000..5340767
--- /dev/null
+++ b/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
@@ -0,0 +1,256 @@
+remap.hlsl.sample.basic.strip.frag
+WARNING: 0:4: 'immediate sampler state' : unimplemented 
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 190
+
+                              Capability Shader
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 180 184
+                              ExecutionMode 4 OriginUpperLeft
+                              Decorate 41 DescriptorSet 0
+                              Decorate 41 Binding 0
+                              Decorate 45 DescriptorSet 0
+                              Decorate 45 Binding 0
+                              Decorate 56 DescriptorSet 0
+                              Decorate 69 DescriptorSet 0
+                              Decorate 79 DescriptorSet 0
+                              Decorate 90 DescriptorSet 0
+                              Decorate 101 DescriptorSet 0
+                              Decorate 113 DescriptorSet 0
+                              Decorate 124 DescriptorSet 0
+                              Decorate 134 DescriptorSet 0
+                              Decorate 147 DescriptorSet 0
+                              Decorate 156 DescriptorSet 0
+                              Decorate 165 DescriptorSet 0
+                              Decorate 180 Location 0
+                              Decorate 184 BuiltIn FragDepth
+                              Decorate 187 DescriptorSet 0
+                              Decorate 188 DescriptorSet 0
+                              Decorate 189 DescriptorSet 0
+                              Decorate 189 Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeStruct 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int)
+               8:             TypePointer Function 7(struct)
+              10:      6(int) Constant 1
+              11:             TypePointer Function 6(int)
+              13:      6(int) Constant 2
+              15:      6(int) Constant 3
+              17:      6(int) Constant 4
+              19:      6(int) Constant 5
+              21:      6(int) Constant 6
+              23:      6(int) Constant 0
+              25:      6(int) Constant 7
+              27:      6(int) Constant 8
+              29:      6(int) Constant 9
+              31:      6(int) Constant 10
+              33:      6(int) Constant 11
+              35:             TypeFloat 32
+              36:             TypeVector 35(float) 4
+              37:             TypePointer Function 36(fvec4)
+              39:             TypeImage 35(float) 1D sampled format:Unknown
+              40:             TypePointer UniformConstant 39
+              41:     40(ptr) Variable UniformConstant
+              43:             TypeSampler
+              44:             TypePointer UniformConstant 43
+              45:     44(ptr) Variable UniformConstant
+              47:             TypeSampledImage 39
+              49:   35(float) Constant 1036831949
+              51:             TypeVector 6(int) 4
+              52:             TypePointer Function 51(ivec4)
+              54:             TypeImage 6(int) 1D sampled format:Unknown
+              55:             TypePointer UniformConstant 54
+              56:     55(ptr) Variable UniformConstant
+              59:             TypeSampledImage 54
+              61:   35(float) Constant 1045220557
+              63:             TypeInt 32 0
+              64:             TypeVector 63(int) 4
+              65:             TypePointer Function 64(ivec4)
+              67:             TypeImage 63(int) 1D sampled format:Unknown
+              68:             TypePointer UniformConstant 67
+              69:     68(ptr) Variable UniformConstant
+              72:             TypeSampledImage 67
+              74:   35(float) Constant 1050253722
+              77:             TypeImage 35(float) 2D sampled format:Unknown
+              78:             TypePointer UniformConstant 77
+              79:     78(ptr) Variable UniformConstant
+              82:             TypeSampledImage 77
+              84:             TypeVector 35(float) 2
+              85:   84(fvec2) ConstantComposite 49 61
+              88:             TypeImage 6(int) 2D sampled format:Unknown
+              89:             TypePointer UniformConstant 88
+              90:     89(ptr) Variable UniformConstant
+              93:             TypeSampledImage 88
+              95:   35(float) Constant 1053609165
+              96:   84(fvec2) ConstantComposite 74 95
+              99:             TypeImage 63(int) 2D sampled format:Unknown
+             100:             TypePointer UniformConstant 99
+             101:    100(ptr) Variable UniformConstant
+             104:             TypeSampledImage 99
+             106:   35(float) Constant 1056964608
+             107:   35(float) Constant 1058642330
+             108:   84(fvec2) ConstantComposite 106 107
+             111:             TypeImage 35(float) 3D sampled format:Unknown
+             112:             TypePointer UniformConstant 111
+             113:    112(ptr) Variable UniformConstant
+             116:             TypeSampledImage 111
+             118:             TypeVector 35(float) 3
+             119:  118(fvec3) ConstantComposite 49 61 74
+             122:             TypeImage 6(int) 3D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+             124:    123(ptr) Variable UniformConstant
+             127:             TypeSampledImage 122
+             129:  118(fvec3) ConstantComposite 95 106 107
+             132:             TypeImage 63(int) 3D sampled format:Unknown
+             133:             TypePointer UniformConstant 132
+             134:    133(ptr) Variable UniformConstant
+             137:             TypeSampledImage 132
+             139:   35(float) Constant 1060320051
+             140:   35(float) Constant 1061997773
+             141:   35(float) Constant 1063675494
+             142:  118(fvec3) ConstantComposite 139 140 141
+             145:             TypeImage 35(float) Cube sampled format:Unknown
+             146:             TypePointer UniformConstant 145
+             147:    146(ptr) Variable UniformConstant
+             150:             TypeSampledImage 145
+             154:             TypeImage 6(int) Cube sampled format:Unknown
+             155:             TypePointer UniformConstant 154
+             156:    155(ptr) Variable UniformConstant
+             159:             TypeSampledImage 154
+             163:             TypeImage 63(int) Cube sampled format:Unknown
+             164:             TypePointer UniformConstant 163
+             165:    164(ptr) Variable UniformConstant
+             168:             TypeSampledImage 163
+             171:             TypeStruct 36(fvec4) 35(float)
+             172:             TypePointer Function 171(struct)
+             174:   35(float) Constant 1065353216
+             175:   36(fvec4) ConstantComposite 174 174 174 174
+             177:             TypePointer Function 35(float)
+             179:             TypePointer Output 36(fvec4)
+             180:    179(ptr) Variable Output
+             183:             TypePointer Output 35(float)
+             184:    183(ptr) Variable Output
+             187:     44(ptr) Variable UniformConstant
+             188:     44(ptr) Variable UniformConstant
+             189:     40(ptr) Variable UniformConstant
+               4:           2 Function None 3
+               5:             Label
+               9:      8(ptr) Variable Function
+              38:     37(ptr) Variable Function
+              53:     52(ptr) Variable Function
+              66:     65(ptr) Variable Function
+              76:     37(ptr) Variable Function
+              87:     52(ptr) Variable Function
+              98:     65(ptr) Variable Function
+             110:     37(ptr) Variable Function
+             121:     52(ptr) Variable Function
+             131:     65(ptr) Variable Function
+             144:     37(ptr) Variable Function
+             153:     52(ptr) Variable Function
+             162:     65(ptr) Variable Function
+             173:    172(ptr) Variable Function
+              12:     11(ptr) AccessChain 9 10
+                              Store 12 10
+              14:     11(ptr) AccessChain 9 13
+                              Store 14 10
+              16:     11(ptr) AccessChain 9 15
+                              Store 16 10
+              18:     11(ptr) AccessChain 9 17
+                              Store 18 10
+              20:     11(ptr) AccessChain 9 19
+                              Store 20 10
+              22:     11(ptr) AccessChain 9 21
+                              Store 22 10
+              24:     11(ptr) AccessChain 9 23
+                              Store 24 10
+              26:     11(ptr) AccessChain 9 25
+                              Store 26 10
+              28:     11(ptr) AccessChain 9 27
+                              Store 28 10
+              30:     11(ptr) AccessChain 9 29
+                              Store 30 10
+              32:     11(ptr) AccessChain 9 31
+                              Store 32 10
+              34:     11(ptr) AccessChain 9 33
+                              Store 34 10
+              42:          39 Load 41
+              46:          43 Load 45
+              48:          47 SampledImage 42 46
+              50:   36(fvec4) ImageSampleImplicitLod 48 49
+                              Store 38 50
+              57:          54 Load 56
+              58:          43 Load 45
+              60:          59 SampledImage 57 58
+              62:   51(ivec4) ImageSampleImplicitLod 60 61
+                              Store 53 62
+              70:          67 Load 69
+              71:          43 Load 45
+              73:          72 SampledImage 70 71
+              75:   64(ivec4) ImageSampleImplicitLod 73 74
+                              Store 66 75
+              80:          77 Load 79
+              81:          43 Load 45
+              83:          82 SampledImage 80 81
+              86:   36(fvec4) ImageSampleImplicitLod 83 85
+                              Store 76 86
+              91:          88 Load 90
+              92:          43 Load 45
+              94:          93 SampledImage 91 92
+              97:   51(ivec4) ImageSampleImplicitLod 94 96
+                              Store 87 97
+             102:          99 Load 101
+             103:          43 Load 45
+             105:         104 SampledImage 102 103
+             109:   64(ivec4) ImageSampleImplicitLod 105 108
+                              Store 98 109
+             114:         111 Load 113
+             115:          43 Load 45
+             117:         116 SampledImage 114 115
+             120:   36(fvec4) ImageSampleImplicitLod 117 119
+                              Store 110 120
+             125:         122 Load 124
+             126:          43 Load 45
+             128:         127 SampledImage 125 126
+             130:   51(ivec4) ImageSampleImplicitLod 128 129
+                              Store 121 130
+             135:         132 Load 134
+             136:          43 Load 45
+             138:         137 SampledImage 135 136
+             143:   64(ivec4) ImageSampleImplicitLod 138 142
+                              Store 131 143
+             148:         145 Load 147
+             149:          43 Load 45
+             151:         150 SampledImage 148 149
+             152:   36(fvec4) ImageSampleImplicitLod 151 119
+                              Store 144 152
+             157:         154 Load 156
+             158:          43 Load 45
+             160:         159 SampledImage 157 158
+             161:   51(ivec4) ImageSampleImplicitLod 160 129
+                              Store 153 161
+             166:         163 Load 165
+             167:          43 Load 45
+             169:         168 SampledImage 166 167
+             170:   64(ivec4) ImageSampleImplicitLod 169 142
+                              Store 162 170
+             176:     37(ptr) AccessChain 173 23
+                              Store 176 175
+             178:    177(ptr) AccessChain 173 10
+                              Store 178 174
+             181:     37(ptr) AccessChain 173 23
+             182:   36(fvec4) Load 181
+                              Store 180 182
+             185:    177(ptr) AccessChain 173 10
+             186:   35(float) Load 185
+                              Store 184 186
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out b/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
new file mode 100644
index 0000000..7a40f94
--- /dev/null
+++ b/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
@@ -0,0 +1,30 @@
+remap.hlsl.templatetypes.everything.frag
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 16123
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 4045 4872
+                              ExecutionMode 5663 OriginUpperLeft
+                              Decorate 4045 Location 0
+                              Decorate 4872 Location 0
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              13:             TypeFloat 32
+              29:             TypeVector 13(float) 4
+            2572:   13(float) Constant 0
+             666:             TypePointer Output 29(fvec4)
+            4045:    666(ptr) Variable Output
+             667:             TypePointer Input 29(fvec4)
+            4872:    667(ptr) Variable Input
+            5663:           8 Function None 1282
+           16122:             Label
+                              ReturnValue 2572
+                              FunctionEnd
diff --git a/Test/baseResults/remap.hlsl.templatetypes.none.frag.out b/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
new file mode 100644
index 0000000..340198b
--- /dev/null
+++ b/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
@@ -0,0 +1,225 @@
+remap.hlsl.templatetypes.none.frag
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 149
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 146 148
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 9  "r00"
+                              Name 15  "r01"
+                              Name 20  "r12"
+                              Name 24  "r13"
+                              Name 27  "r14"
+                              Name 30  "r15"
+                              Name 34  "r16"
+                              Name 38  "r20"
+                              Name 43  "r21"
+                              Name 48  "r22"
+                              Name 52  "r23"
+                              Name 57  "r24"
+                              Name 62  "r30"
+                              Name 66  "r31"
+                              Name 71  "r32"
+                              Name 75  "r33"
+                              Name 80  "r34"
+                              Name 85  "r40"
+                              Name 89  "r41"
+                              Name 92  "r42"
+                              Name 95  "r43"
+                              Name 100  "r44"
+                              Name 105  "r50"
+                              Name 122  "r51"
+                              Name 125  "r61"
+                              Name 130  "r62"
+                              Name 136  "r65"
+                              Name 141  "r66"
+                              Name 146  "@entryPointOutput"
+                              Name 148  "input"
+                              Decorate 146(@entryPointOutput) Location 0
+                              Decorate 148(input) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:    6(float) Constant 1065353216
+              11:    6(float) Constant 1073741824
+              12:    6(float) Constant 1077936128
+              13:    6(float) Constant 1082130432
+              14:    7(fvec4) ConstantComposite 10 11 12 13
+              16:    6(float) Constant 1084227584
+              17:    7(fvec4) ConstantComposite 11 12 13 16
+              18:             TypeBool
+              19:             TypePointer Function 18(bool)
+              21:    18(bool) ConstantFalse
+              22:             TypeInt 32 1
+              23:             TypePointer Function 22(int)
+              25:     22(int) Constant 1
+              26:             TypePointer Function 6(float)
+              28:             TypeFloat 64
+              29:             TypePointer Function 28(float)
+              31:   28(float) Constant 0 1072693248
+              32:             TypeInt 32 0
+              33:             TypePointer Function 32(int)
+              35:     32(int) Constant 1
+              36:             TypeVector 18(bool) 2
+              37:             TypePointer Function 36(bvec2)
+              39:    18(bool) ConstantTrue
+              40:   36(bvec2) ConstantComposite 21 39
+              41:             TypeVector 22(int) 2
+              42:             TypePointer Function 41(ivec2)
+              44:     22(int) Constant 2
+              45:   41(ivec2) ConstantComposite 25 44
+              46:             TypeVector 6(float) 2
+              47:             TypePointer Function 46(fvec2)
+              49:   46(fvec2) ConstantComposite 10 11
+              50:             TypeVector 28(float) 2
+              51:             TypePointer Function 50(fvec2)
+              53:   28(float) Constant 0 1073741824
+              54:   50(fvec2) ConstantComposite 31 53
+              55:             TypeVector 32(int) 2
+              56:             TypePointer Function 55(ivec2)
+              58:     32(int) Constant 2
+              59:   55(ivec2) ConstantComposite 35 58
+              60:             TypeVector 18(bool) 3
+              61:             TypePointer Function 60(bvec3)
+              63:   60(bvec3) ConstantComposite 21 39 39
+              64:             TypeVector 22(int) 3
+              65:             TypePointer Function 64(ivec3)
+              67:     22(int) Constant 3
+              68:   64(ivec3) ConstantComposite 25 44 67
+              69:             TypeVector 6(float) 3
+              70:             TypePointer Function 69(fvec3)
+              72:   69(fvec3) ConstantComposite 10 11 12
+              73:             TypeVector 28(float) 3
+              74:             TypePointer Function 73(fvec3)
+              76:   28(float) Constant 0 1074266112
+              77:   73(fvec3) ConstantComposite 31 53 76
+              78:             TypeVector 32(int) 3
+              79:             TypePointer Function 78(ivec3)
+              81:     32(int) Constant 3
+              82:   78(ivec3) ConstantComposite 35 58 81
+              83:             TypeVector 18(bool) 4
+              84:             TypePointer Function 83(bvec4)
+              86:   83(bvec4) ConstantComposite 21 39 39 21
+              87:             TypeVector 22(int) 4
+              88:             TypePointer Function 87(ivec4)
+              90:     22(int) Constant 4
+              91:   87(ivec4) ConstantComposite 25 44 67 90
+              93:             TypeVector 28(float) 4
+              94:             TypePointer Function 93(fvec4)
+              96:   28(float) Constant 0 1074790400
+              97:   93(fvec4) ConstantComposite 31 53 76 96
+              98:             TypeVector 32(int) 4
+              99:             TypePointer Function 98(ivec4)
+             101:     32(int) Constant 4
+             102:   98(ivec4) ConstantComposite 35 58 81 101
+             103:             TypeMatrix 7(fvec4) 4
+             104:             TypePointer Function 103
+             106:    6(float) Constant 0
+             107:    7(fvec4) ConstantComposite 106 10 11 12
+             108:    6(float) Constant 1086324736
+             109:    6(float) Constant 1088421888
+             110:    7(fvec4) ConstantComposite 13 16 108 109
+             111:    6(float) Constant 1090519040
+             112:    6(float) Constant 1091567616
+             113:    6(float) Constant 1092616192
+             114:    6(float) Constant 1093664768
+             115:    7(fvec4) ConstantComposite 111 112 113 114
+             116:    6(float) Constant 1094713344
+             117:    6(float) Constant 1095761920
+             118:    6(float) Constant 1096810496
+             119:    6(float) Constant 1097859072
+             120:    7(fvec4) ConstantComposite 116 117 118 119
+             121:         103 ConstantComposite 107 110 115 120
+             123:             TypeMatrix 69(fvec3) 2
+             124:             TypePointer Function 123
+             126:   69(fvec3) ConstantComposite 13 16 108
+             127:         123 ConstantComposite 72 126
+             128:             TypeMatrix 46(fvec2) 3
+             129:             TypePointer Function 128
+             131:   46(fvec2) ConstantComposite 12 13
+             132:   46(fvec2) ConstantComposite 16 108
+             133:         128 ConstantComposite 49 131 132
+             134:             TypeMatrix 46(fvec2) 4
+             135:             TypePointer Function 134
+             137:   46(fvec2) ConstantComposite 109 111
+             138:         134 ConstantComposite 49 131 132 137
+             139:             TypeMatrix 69(fvec3) 4
+             140:             TypePointer Function 139
+             142:   69(fvec3) ConstantComposite 109 111 112
+             143:   69(fvec3) ConstantComposite 113 114 116
+             144:         139 ConstantComposite 72 126 142 143
+             145:             TypePointer Output 7(fvec4)
+146(@entryPointOutput):    145(ptr) Variable Output
+             147:             TypePointer Input 7(fvec4)
+      148(input):    147(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+          9(r00):      8(ptr) Variable Function
+         15(r01):      8(ptr) Variable Function
+         20(r12):     19(ptr) Variable Function
+         24(r13):     23(ptr) Variable Function
+         27(r14):     26(ptr) Variable Function
+         30(r15):     29(ptr) Variable Function
+         34(r16):     33(ptr) Variable Function
+         38(r20):     37(ptr) Variable Function
+         43(r21):     42(ptr) Variable Function
+         48(r22):     47(ptr) Variable Function
+         52(r23):     51(ptr) Variable Function
+         57(r24):     56(ptr) Variable Function
+         62(r30):     61(ptr) Variable Function
+         66(r31):     65(ptr) Variable Function
+         71(r32):     70(ptr) Variable Function
+         75(r33):     74(ptr) Variable Function
+         80(r34):     79(ptr) Variable Function
+         85(r40):     84(ptr) Variable Function
+         89(r41):     88(ptr) Variable Function
+         92(r42):      8(ptr) Variable Function
+         95(r43):     94(ptr) Variable Function
+        100(r44):     99(ptr) Variable Function
+        105(r50):    104(ptr) Variable Function
+        122(r51):    104(ptr) Variable Function
+        125(r61):    124(ptr) Variable Function
+        130(r62):    129(ptr) Variable Function
+        136(r65):    135(ptr) Variable Function
+        141(r66):    140(ptr) Variable Function
+                              Store 9(r00) 14
+                              Store 15(r01) 17
+                              Store 20(r12) 21
+                              Store 24(r13) 25
+                              Store 27(r14) 10
+                              Store 30(r15) 31
+                              Store 34(r16) 35
+                              Store 38(r20) 40
+                              Store 43(r21) 45
+                              Store 48(r22) 49
+                              Store 52(r23) 54
+                              Store 57(r24) 59
+                              Store 62(r30) 63
+                              Store 66(r31) 68
+                              Store 71(r32) 72
+                              Store 75(r33) 77
+                              Store 80(r34) 82
+                              Store 85(r40) 86
+                              Store 89(r41) 91
+                              Store 92(r42) 14
+                              Store 95(r43) 97
+                              Store 100(r44) 102
+                              Store 105(r50) 121
+                              Store 122(r51) 121
+                              Store 125(r61) 127
+                              Store 130(r62) 133
+                              Store 136(r65) 138
+                              Store 141(r66) 144
+                              ReturnValue 106
+                              FunctionEnd
diff --git a/Test/baseResults/remap.if.everything.frag.out b/Test/baseResults/remap.if.everything.frag.out
new file mode 100644
index 0000000..9f98c18
--- /dev/null
+++ b/Test/baseResults/remap.if.everything.frag.out
@@ -0,0 +1,47 @@
+remap.if.everything.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 22855
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 3773 4539
+                              ExecutionMode 5663 OriginUpperLeft
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              13:             TypeFloat 32
+             650:             TypePointer Input 13(float)
+            3773:    650(ptr) Variable Input
+              24:   13(float) Constant 1073741824
+               9:             TypeBool
+              29:             TypeVector 13(float) 4
+             666:             TypePointer Output 29(fvec4)
+            4539:    666(ptr) Variable Output
+             947:   13(float) Constant 3204448256
+            5663:           8 Function None 1282
+            7911:             Label
+           21734:   13(float) Load 3773
+           13508:     9(bool) FOrdGreaterThan 21734 24
+                              SelectionMerge 19578 None
+                              BranchConditional 13508 13182 10142
+           13182:               Label
+            9496:   13(float)   Load 3773
+           17615:   29(fvec4)   CompositeConstruct 9496 9496 9496 9496
+                                Store 4539 17615
+                                Branch 19578
+           10142:               Label
+           22854:   13(float)   Load 3773
+            9982:   13(float)   FAdd 22854 947
+           12421:   29(fvec4)   CompositeConstruct 9982 9982 9982 9982
+                                Store 4539 12421
+                                Branch 19578
+           19578:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.if.none.frag.out b/Test/baseResults/remap.if.none.frag.out
new file mode 100644
index 0000000..f3113a3
--- /dev/null
+++ b/Test/baseResults/remap.if.none.frag.out
@@ -0,0 +1,51 @@
+remap.if.none.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 25
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 17
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "inf"
+                              Name 17  "outf4"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Input 6(float)
+          8(inf):      7(ptr) Variable Input
+              10:    6(float) Constant 1073741824
+              11:             TypeBool
+              15:             TypeVector 6(float) 4
+              16:             TypePointer Output 15(fvec4)
+       17(outf4):     16(ptr) Variable Output
+              22:    6(float) Constant 3204448256
+         4(main):           2 Function None 3
+               5:             Label
+               9:    6(float) Load 8(inf)
+              12:    11(bool) FOrdGreaterThan 9 10
+                              SelectionMerge 14 None
+                              BranchConditional 12 13 20
+              13:               Label
+              18:    6(float)   Load 8(inf)
+              19:   15(fvec4)   CompositeConstruct 18 18 18 18
+                                Store 17(outf4) 19
+                                Branch 14
+              20:               Label
+              21:    6(float)   Load 8(inf)
+              23:    6(float)   FAdd 21 22
+              24:   15(fvec4)   CompositeConstruct 23 23 23 23
+                                Store 17(outf4) 24
+                                Branch 14
+              14:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.literal64.everything.spv.out b/Test/baseResults/remap.literal64.everything.spv.out
new file mode 100644
index 0000000..7a4f37b
--- /dev/null
+++ b/Test/baseResults/remap.literal64.everything.spv.out
@@ -0,0 +1,7 @@
+remap.literal64.everything.spv
+// Module Version 10100
+// Generated by (magic number): 70000
+// Id's are bound by 0
+
+                              Capability Shader
+                              MemoryModel Logical GLSL450
diff --git a/Test/baseResults/remap.literal64.none.spv.out b/Test/baseResults/remap.literal64.none.spv.out
new file mode 100644
index 0000000..792b13a
--- /dev/null
+++ b/Test/baseResults/remap.literal64.none.spv.out
@@ -0,0 +1,25 @@
+remap.literal64.none.spv
+// Module Version 10100
+// Generated by (magic number): 70000
+// Id's are bound by 10
+
+                              Capability Shader
+                              MemoryModel Logical GLSL450
+               1:             TypeVoid
+               2:             TypeInt 64 1
+               3:             TypeFunction 1
+               4:      2(int) Constant 0 0
+               5:           1 Function None 3
+               6:             Label
+                              SelectionMerge 7 None
+                              Switch 4 7 
+                                     case 0: 0
+                                     case 8: 1
+                                     case 0: 9
+               8:               Label
+                                Branch 7
+               9:               Label
+                                Branch 7
+               7:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.similar_1a.everything.frag.out b/Test/baseResults/remap.similar_1a.everything.frag.out
new file mode 100644
index 0000000..09589f5
--- /dev/null
+++ b/Test/baseResults/remap.similar_1a.everything.frag.out
@@ -0,0 +1,121 @@
+remap.similar_1a.everything.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 24916
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 4201 4539 3773
+                              ExecutionMode 5663 OriginUpperLeft
+                              Decorate 4201 Flat
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              12:             TypeInt 32 1
+             649:             TypePointer Function 12(int)
+              13:             TypeFloat 32
+             204:             TypeFunction 13(float) 649(ptr)
+             650:             TypePointer Function 13(float)
+            2572:   13(float) Constant 0
+            2571:     12(int) Constant 0
+               9:             TypeBool
+             252:   13(float) Constant 1056964608
+            2574:     12(int) Constant 1
+            2577:     12(int) Constant 2
+              26:             TypeVector 12(int) 4
+             663:             TypePointer Input 26(ivec4)
+            4201:    663(ptr) Variable Input
+              11:             TypeInt 32 0
+            2573:     11(int) Constant 1
+             651:             TypePointer Input 12(int)
+            2576:     11(int) Constant 2
+            2570:     11(int) Constant 0
+              29:             TypeVector 13(float) 4
+             666:             TypePointer Output 29(fvec4)
+            4539:    666(ptr) Variable Output
+             652:             TypePointer Input 13(float)
+            3773:    652(ptr) Variable Input
+            5663:           8 Function None 1282
+           24915:             Label
+           18415:    649(ptr) Variable Function
+            5786:    649(ptr) Variable Function
+            8366:   13(float) Load 3773
+            8654:     12(int) ConvertFToS 8366
+                              Store 18415 8654
+           17256:   13(float) FunctionCall 3782 18415
+           14512:   13(float) Load 3773
+            7041:     12(int) ConvertFToS 14512
+                              Store 5786 7041
+           23993:   13(float) FunctionCall 3836 5786
+            9180:   13(float) FAdd 17256 23993
+           15728:   29(fvec4) CompositeConstruct 9180 9180 9180 9180
+                              Store 4539 15728
+                              Return
+                              FunctionEnd
+            3782:   13(float) Function None 204
+            6931:    649(ptr) FunctionParameter
+           12220:             Label
+            4292:    650(ptr) Variable Function
+            4298:    649(ptr) Variable Function
+                              Store 4292 2572
+                              Store 4298 2571
+                              Branch 14924
+           14924:             Label
+                              LoopMerge 8882 6488 None
+                              Branch 11857
+           11857:             Label
+           13755:     12(int) Load 4298
+           22731:     12(int) Load 6931
+           20007:     9(bool) SLessThan 13755 22731
+                              BranchConditional 20007 24750 8882
+           24750:               Label
+           22912:   13(float)   Load 4292
+           19471:   13(float)   FAdd 22912 252
+                                Store 4292 19471
+                                Branch 6488
+            6488:               Label
+           19050:     12(int)   Load 4298
+            8593:     12(int)   IAdd 19050 2574
+                                Store 4298 8593
+                                Branch 14924
+            8882:             Label
+           11601:   13(float) Load 4292
+                              ReturnValue 11601
+                              FunctionEnd
+            3836:   13(float) Function None 204
+            4408:    649(ptr) FunctionParameter
+           12143:             Label
+           22102:    649(ptr) Variable Function
+           24151:     12(int) Load 4408
+           13868:     9(bool) SGreaterThan 24151 2577
+                              SelectionMerge 22309 None
+                              BranchConditional 13868 9492 17416
+            9492:               Label
+           15624:     12(int)   Load 4408
+                                Store 22102 15624
+           17278:   13(float)   FunctionCall 3782 22102
+                                ReturnValue 17278
+           17416:               Label
+           19506:     12(int)   Load 4408
+           22773:     12(int)   IMul 19506 2577
+           13472:    651(ptr)   AccessChain 4201 2573
+           15280:     12(int)   Load 13472
+           18079:    651(ptr)   AccessChain 4201 2576
+           15199:     12(int)   Load 18079
+            9343:     12(int)   IMul 15280 15199
+           11462:     12(int)   IAdd 22773 9343
+           11885:    651(ptr)   AccessChain 4201 2570
+           21176:     12(int)   Load 11885
+           10505:     12(int)   IAdd 11462 21176
+           14626:   13(float)   ConvertSToF 10505
+                                ReturnValue 14626
+           22309:             Label
+            6429:   13(float) Undef
+                              ReturnValue 6429
+                              FunctionEnd
diff --git a/Test/baseResults/remap.similar_1a.none.frag.out b/Test/baseResults/remap.similar_1a.none.frag.out
new file mode 100644
index 0000000..1748451
--- /dev/null
+++ b/Test/baseResults/remap.similar_1a.none.frag.out
@@ -0,0 +1,135 @@
+remap.similar_1a.none.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 82
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 50 69 71
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 11  "Test1(i1;"
+                              Name 10  "bound"
+                              Name 14  "Test2(i1;"
+                              Name 13  "bound"
+                              Name 17  "r"
+                              Name 19  "x"
+                              Name 42  "param"
+                              Name 50  "ini4"
+                              Name 69  "outf4"
+                              Name 71  "inf"
+                              Name 74  "param"
+                              Name 78  "param"
+                              Decorate 50(ini4) Flat
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeFunction 8(float) 7(ptr)
+              16:             TypePointer Function 8(float)
+              18:    8(float) Constant 0
+              20:      6(int) Constant 0
+              28:             TypeBool
+              30:    8(float) Constant 1056964608
+              34:      6(int) Constant 1
+              38:      6(int) Constant 2
+              48:             TypeVector 6(int) 4
+              49:             TypePointer Input 48(ivec4)
+        50(ini4):     49(ptr) Variable Input
+              51:             TypeInt 32 0
+              52:     51(int) Constant 1
+              53:             TypePointer Input 6(int)
+              56:     51(int) Constant 2
+              61:     51(int) Constant 0
+              67:             TypeVector 8(float) 4
+              68:             TypePointer Output 67(fvec4)
+       69(outf4):     68(ptr) Variable Output
+              70:             TypePointer Input 8(float)
+         71(inf):     70(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+       74(param):      7(ptr) Variable Function
+       78(param):      7(ptr) Variable Function
+              72:    8(float) Load 71(inf)
+              73:      6(int) ConvertFToS 72
+                              Store 74(param) 73
+              75:    8(float) FunctionCall 11(Test1(i1;) 74(param)
+              76:    8(float) Load 71(inf)
+              77:      6(int) ConvertFToS 76
+                              Store 78(param) 77
+              79:    8(float) FunctionCall 14(Test2(i1;) 78(param)
+              80:    8(float) FAdd 75 79
+              81:   67(fvec4) CompositeConstruct 80 80 80 80
+                              Store 69(outf4) 81
+                              Return
+                              FunctionEnd
+   11(Test1(i1;):    8(float) Function None 9
+       10(bound):      7(ptr) FunctionParameter
+              12:             Label
+           17(r):     16(ptr) Variable Function
+           19(x):      7(ptr) Variable Function
+                              Store 17(r) 18
+                              Store 19(x) 20
+                              Branch 21
+              21:             Label
+                              LoopMerge 23 24 None
+                              Branch 25
+              25:             Label
+              26:      6(int) Load 19(x)
+              27:      6(int) Load 10(bound)
+              29:    28(bool) SLessThan 26 27
+                              BranchConditional 29 22 23
+              22:               Label
+              31:    8(float)   Load 17(r)
+              32:    8(float)   FAdd 31 30
+                                Store 17(r) 32
+                                Branch 24
+              24:               Label
+              33:      6(int)   Load 19(x)
+              35:      6(int)   IAdd 33 34
+                                Store 19(x) 35
+                                Branch 21
+              23:             Label
+              36:    8(float) Load 17(r)
+                              ReturnValue 36
+                              FunctionEnd
+   14(Test2(i1;):    8(float) Function None 9
+       13(bound):      7(ptr) FunctionParameter
+              15:             Label
+       42(param):      7(ptr) Variable Function
+              37:      6(int) Load 13(bound)
+              39:    28(bool) SGreaterThan 37 38
+                              SelectionMerge 41 None
+                              BranchConditional 39 40 45
+              40:               Label
+              43:      6(int)   Load 13(bound)
+                                Store 42(param) 43
+              44:    8(float)   FunctionCall 11(Test1(i1;) 42(param)
+                                ReturnValue 44
+              45:               Label
+              46:      6(int)   Load 13(bound)
+              47:      6(int)   IMul 46 38
+              54:     53(ptr)   AccessChain 50(ini4) 52
+              55:      6(int)   Load 54
+              57:     53(ptr)   AccessChain 50(ini4) 56
+              58:      6(int)   Load 57
+              59:      6(int)   IMul 55 58
+              60:      6(int)   IAdd 47 59
+              62:     53(ptr)   AccessChain 50(ini4) 61
+              63:      6(int)   Load 62
+              64:      6(int)   IAdd 60 63
+              65:    8(float)   ConvertSToF 64
+                                ReturnValue 65
+              41:             Label
+              66:    8(float) Undef
+                              ReturnValue 66
+                              FunctionEnd
diff --git a/Test/baseResults/remap.similar_1b.everything.frag.out b/Test/baseResults/remap.similar_1b.everything.frag.out
new file mode 100644
index 0000000..d05be11
--- /dev/null
+++ b/Test/baseResults/remap.similar_1b.everything.frag.out
@@ -0,0 +1,127 @@
+remap.similar_1b.everything.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 24916
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 4201 4539 3773
+                              ExecutionMode 5663 OriginUpperLeft
+                              Decorate 4201 Flat
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              12:             TypeInt 32 1
+             649:             TypePointer Function 12(int)
+              13:             TypeFloat 32
+             204:             TypeFunction 13(float) 649(ptr)
+             650:             TypePointer Function 13(float)
+            2572:   13(float) Constant 0
+            2571:     12(int) Constant 0
+               9:             TypeBool
+             252:   13(float) Constant 1056964608
+            2574:     12(int) Constant 1
+            2821:   13(float) Constant 1045220557
+            2577:     12(int) Constant 2
+            2583:     12(int) Constant 4
+              26:             TypeVector 12(int) 4
+             663:             TypePointer Input 26(ivec4)
+            4201:    663(ptr) Variable Input
+              11:             TypeInt 32 0
+            2573:     11(int) Constant 1
+             651:             TypePointer Input 12(int)
+            2576:     11(int) Constant 2
+            2570:     11(int) Constant 0
+              29:             TypeVector 13(float) 4
+             666:             TypePointer Output 29(fvec4)
+            4539:    666(ptr) Variable Output
+             652:             TypePointer Input 13(float)
+            3773:    652(ptr) Variable Input
+            5663:           8 Function None 1282
+           24915:             Label
+           18415:    649(ptr) Variable Function
+            5786:    649(ptr) Variable Function
+            8366:   13(float) Load 3773
+            8654:     12(int) ConvertFToS 8366
+                              Store 18415 8654
+           17256:   13(float) FunctionCall 3782 18415
+           14512:   13(float) Load 3773
+            7041:     12(int) ConvertFToS 14512
+                              Store 5786 7041
+           23993:   13(float) FunctionCall 3836 5786
+            9180:   13(float) FAdd 17256 23993
+           15728:   29(fvec4) CompositeConstruct 9180 9180 9180 9180
+                              Store 4539 15728
+                              Return
+                              FunctionEnd
+            3782:   13(float) Function None 204
+            6931:    649(ptr) FunctionParameter
+           12220:             Label
+            4292:    650(ptr) Variable Function
+            4298:    649(ptr) Variable Function
+                              Store 4292 2572
+                              Store 4298 2571
+                              Branch 14924
+           14924:             Label
+                              LoopMerge 6507 6488 None
+                              Branch 11857
+           11857:             Label
+           13755:     12(int) Load 4298
+           22731:     12(int) Load 6931
+           20007:     9(bool) SLessThan 13755 22731
+                              BranchConditional 20007 24750 6507
+           24750:               Label
+           22912:   13(float)   Load 4292
+           19471:   13(float)   FAdd 22912 252
+                                Store 4292 19471
+                                Branch 6488
+            6488:               Label
+           19050:     12(int)   Load 4298
+            8593:     12(int)   IAdd 19050 2574
+                                Store 4298 8593
+                                Branch 14924
+            6507:             Label
+           18877:   13(float) Load 4292
+           15899:   13(float) FAdd 18877 2821
+                              Store 4292 15899
+           20342:   13(float) Load 4292
+                              ReturnValue 20342
+                              FunctionEnd
+            3836:   13(float) Function None 204
+            4408:    649(ptr) FunctionParameter
+           12143:             Label
+           22102:    649(ptr) Variable Function
+           24151:     12(int) Load 4408
+           13868:     9(bool) SGreaterThan 24151 2577
+                              SelectionMerge 22309 None
+                              BranchConditional 13868 10822 17416
+           10822:               Label
+           22680:     12(int)   Load 4408
+           23216:     12(int)   IMul 22680 2577
+                                Store 22102 23216
+            7042:   13(float)   FunctionCall 3782 22102
+                                ReturnValue 7042
+           17416:               Label
+           19506:     12(int)   Load 4408
+           22773:     12(int)   IMul 19506 2583
+           13472:    651(ptr)   AccessChain 4201 2573
+           15280:     12(int)   Load 13472
+           18079:    651(ptr)   AccessChain 4201 2576
+           15199:     12(int)   Load 18079
+            9343:     12(int)   IMul 15280 15199
+           11462:     12(int)   IAdd 22773 9343
+           11885:    651(ptr)   AccessChain 4201 2570
+           21176:     12(int)   Load 11885
+           10505:     12(int)   IAdd 11462 21176
+           14626:   13(float)   ConvertSToF 10505
+                                ReturnValue 14626
+           22309:             Label
+            6429:   13(float) Undef
+                              ReturnValue 6429
+                              FunctionEnd
diff --git a/Test/baseResults/remap.similar_1b.none.frag.out b/Test/baseResults/remap.similar_1b.none.frag.out
new file mode 100644
index 0000000..f9bf084
--- /dev/null
+++ b/Test/baseResults/remap.similar_1b.none.frag.out
@@ -0,0 +1,141 @@
+remap.similar_1b.none.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 87
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 55 74 76
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 11  "Test1(i1;"
+                              Name 10  "bound"
+                              Name 14  "Test2(i1;"
+                              Name 13  "bound"
+                              Name 17  "r"
+                              Name 19  "x"
+                              Name 47  "param"
+                              Name 55  "ini4"
+                              Name 74  "outf4"
+                              Name 76  "inf"
+                              Name 79  "param"
+                              Name 83  "param"
+                              Decorate 55(ini4) Flat
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeFunction 8(float) 7(ptr)
+              16:             TypePointer Function 8(float)
+              18:    8(float) Constant 0
+              20:      6(int) Constant 0
+              28:             TypeBool
+              30:    8(float) Constant 1056964608
+              34:      6(int) Constant 1
+              36:    8(float) Constant 1045220557
+              41:      6(int) Constant 2
+              51:      6(int) Constant 4
+              53:             TypeVector 6(int) 4
+              54:             TypePointer Input 53(ivec4)
+        55(ini4):     54(ptr) Variable Input
+              56:             TypeInt 32 0
+              57:     56(int) Constant 1
+              58:             TypePointer Input 6(int)
+              61:     56(int) Constant 2
+              66:     56(int) Constant 0
+              72:             TypeVector 8(float) 4
+              73:             TypePointer Output 72(fvec4)
+       74(outf4):     73(ptr) Variable Output
+              75:             TypePointer Input 8(float)
+         76(inf):     75(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+       79(param):      7(ptr) Variable Function
+       83(param):      7(ptr) Variable Function
+              77:    8(float) Load 76(inf)
+              78:      6(int) ConvertFToS 77
+                              Store 79(param) 78
+              80:    8(float) FunctionCall 11(Test1(i1;) 79(param)
+              81:    8(float) Load 76(inf)
+              82:      6(int) ConvertFToS 81
+                              Store 83(param) 82
+              84:    8(float) FunctionCall 14(Test2(i1;) 83(param)
+              85:    8(float) FAdd 80 84
+              86:   72(fvec4) CompositeConstruct 85 85 85 85
+                              Store 74(outf4) 86
+                              Return
+                              FunctionEnd
+   11(Test1(i1;):    8(float) Function None 9
+       10(bound):      7(ptr) FunctionParameter
+              12:             Label
+           17(r):     16(ptr) Variable Function
+           19(x):      7(ptr) Variable Function
+                              Store 17(r) 18
+                              Store 19(x) 20
+                              Branch 21
+              21:             Label
+                              LoopMerge 23 24 None
+                              Branch 25
+              25:             Label
+              26:      6(int) Load 19(x)
+              27:      6(int) Load 10(bound)
+              29:    28(bool) SLessThan 26 27
+                              BranchConditional 29 22 23
+              22:               Label
+              31:    8(float)   Load 17(r)
+              32:    8(float)   FAdd 31 30
+                                Store 17(r) 32
+                                Branch 24
+              24:               Label
+              33:      6(int)   Load 19(x)
+              35:      6(int)   IAdd 33 34
+                                Store 19(x) 35
+                                Branch 21
+              23:             Label
+              37:    8(float) Load 17(r)
+              38:    8(float) FAdd 37 36
+                              Store 17(r) 38
+              39:    8(float) Load 17(r)
+                              ReturnValue 39
+                              FunctionEnd
+   14(Test2(i1;):    8(float) Function None 9
+       13(bound):      7(ptr) FunctionParameter
+              15:             Label
+       47(param):      7(ptr) Variable Function
+              40:      6(int) Load 13(bound)
+              42:    28(bool) SGreaterThan 40 41
+                              SelectionMerge 44 None
+                              BranchConditional 42 43 49
+              43:               Label
+              45:      6(int)   Load 13(bound)
+              46:      6(int)   IMul 45 41
+                                Store 47(param) 46
+              48:    8(float)   FunctionCall 11(Test1(i1;) 47(param)
+                                ReturnValue 48
+              49:               Label
+              50:      6(int)   Load 13(bound)
+              52:      6(int)   IMul 50 51
+              59:     58(ptr)   AccessChain 55(ini4) 57
+              60:      6(int)   Load 59
+              62:     58(ptr)   AccessChain 55(ini4) 61
+              63:      6(int)   Load 62
+              64:      6(int)   IMul 60 63
+              65:      6(int)   IAdd 52 64
+              67:     58(ptr)   AccessChain 55(ini4) 66
+              68:      6(int)   Load 67
+              69:      6(int)   IAdd 65 68
+              70:    8(float)   ConvertSToF 69
+                                ReturnValue 70
+              44:             Label
+              71:    8(float) Undef
+                              ReturnValue 71
+                              FunctionEnd
diff --git a/Test/baseResults/remap.switch.everything.frag.out b/Test/baseResults/remap.switch.everything.frag.out
new file mode 100644
index 0000000..a1d9b0d
--- /dev/null
+++ b/Test/baseResults/remap.switch.everything.frag.out
@@ -0,0 +1,81 @@
+remap.switch.everything.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+WARNING: 0:5: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
+         "precision mediump int; precision highp float;" 
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 23990
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 3719 3994
+                              ExecutionMode 5663 OriginUpperLeft
+                              Decorate 3719 Location 0
+                              Decorate 3994 RelaxedPrecision
+                              Decorate 3994 Location 0
+                              Decorate 12421 RelaxedPrecision
+                              Decorate 12422 RelaxedPrecision
+                              Decorate 12423 RelaxedPrecision
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              13:             TypeFloat 32
+              29:             TypeVector 13(float) 4
+             666:             TypePointer Input 29(fvec4)
+            3719:    666(ptr) Variable Input
+              11:             TypeInt 32 0
+            2579:     11(int) Constant 3
+             650:             TypePointer Input 13(float)
+              12:             TypeInt 32 1
+             667:             TypePointer Output 29(fvec4)
+            3994:    667(ptr) Variable Output
+            2570:     11(int) Constant 0
+            2572:   13(float) Constant 0
+            2573:     11(int) Constant 1
+             138:   13(float) Constant 1065353216
+            2576:     11(int) Constant 2
+              24:   13(float) Constant 1073741824
+             833:   13(float) Constant 3212836864
+            1284:   29(fvec4) ConstantComposite 833 833 833 833
+            5663:           8 Function None 1282
+           23915:             Label
+            7984:    650(ptr) AccessChain 3719 2579
+           11376:   13(float) Load 7984
+           16859:     12(int) ConvertFToS 11376
+                              SelectionMerge 19578 None
+                              Switch 16859 15971 
+                                     case 0: 8158
+                                     case 1: 8159
+                                     case 2: 8160
+           15971:               Label
+                                Store 3994 1284
+                                Branch 19578
+            8158:               Label
+           21848:    650(ptr)   AccessChain 3719 2570
+           23987:   13(float)   Load 21848
+           19989:   13(float)   FAdd 23987 2572
+           12421:   29(fvec4)   CompositeConstruct 19989 19989 19989 19989
+                                Store 3994 12421
+                                Branch 19578
+            8159:               Label
+           21849:    650(ptr)   AccessChain 3719 2573
+           23988:   13(float)   Load 21849
+           19990:   13(float)   FAdd 23988 138
+           12422:   29(fvec4)   CompositeConstruct 19990 19990 19990 19990
+                                Store 3994 12422
+                                Branch 19578
+            8160:               Label
+           21850:    650(ptr)   AccessChain 3719 2576
+           23989:   13(float)   Load 21850
+           19991:   13(float)   FAdd 23989 24
+           12423:   29(fvec4)   CompositeConstruct 19991 19991 19991 19991
+                                Store 3994 12423
+                                Branch 19578
+           19578:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.switch.none.frag.out b/Test/baseResults/remap.switch.none.frag.out
new file mode 100644
index 0000000..7fc8f04
--- /dev/null
+++ b/Test/baseResults/remap.switch.none.frag.out
@@ -0,0 +1,85 @@
+remap.switch.none.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+WARNING: 0:5: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
+         "precision mediump int; precision highp float;" 
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 44
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 23
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "in0"
+                              Name 23  "FragColor"
+                              Decorate 9(in0) Location 0
+                              Decorate 23(FragColor) RelaxedPrecision
+                              Decorate 23(FragColor) Location 0
+                              Decorate 29 RelaxedPrecision
+                              Decorate 35 RelaxedPrecision
+                              Decorate 41 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Input 7(fvec4)
+          9(in0):      8(ptr) Variable Input
+              10:             TypeInt 32 0
+              11:     10(int) Constant 3
+              12:             TypePointer Input 6(float)
+              15:             TypeInt 32 1
+              22:             TypePointer Output 7(fvec4)
+   23(FragColor):     22(ptr) Variable Output
+              24:     10(int) Constant 0
+              27:    6(float) Constant 0
+              30:     10(int) Constant 1
+              33:    6(float) Constant 1065353216
+              36:     10(int) Constant 2
+              39:    6(float) Constant 1073741824
+              42:    6(float) Constant 3212836864
+              43:    7(fvec4) ConstantComposite 42 42 42 42
+         4(main):           2 Function None 3
+               5:             Label
+              13:     12(ptr) AccessChain 9(in0) 11
+              14:    6(float) Load 13
+              16:     15(int) ConvertFToS 14
+                              SelectionMerge 21 None
+                              Switch 16 20 
+                                     case 0: 17
+                                     case 1: 18
+                                     case 2: 19
+              20:               Label
+                                Store 23(FragColor) 43
+                                Branch 21
+              17:               Label
+              25:     12(ptr)   AccessChain 9(in0) 24
+              26:    6(float)   Load 25
+              28:    6(float)   FAdd 26 27
+              29:    7(fvec4)   CompositeConstruct 28 28 28 28
+                                Store 23(FragColor) 29
+                                Branch 21
+              18:               Label
+              31:     12(ptr)   AccessChain 9(in0) 30
+              32:    6(float)   Load 31
+              34:    6(float)   FAdd 32 33
+              35:    7(fvec4)   CompositeConstruct 34 34 34 34
+                                Store 23(FragColor) 35
+                                Branch 21
+              19:               Label
+              37:     12(ptr)   AccessChain 9(in0) 36
+              38:    6(float)   Load 37
+              40:    6(float)   FAdd 38 39
+              41:    7(fvec4)   CompositeConstruct 40 40 40 40
+                                Store 23(FragColor) 41
+                                Branch 21
+              21:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.uniformarray.everything.frag.out b/Test/baseResults/remap.uniformarray.everything.frag.out
new file mode 100644
index 0000000..18defec
--- /dev/null
+++ b/Test/baseResults/remap.uniformarray.everything.frag.out
@@ -0,0 +1,67 @@
+remap.uniformarray.everything.frag
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 25030
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5663  "main" 3608 4957 4339 5139
+                              ExecutionMode 5663 OriginUpperLeft
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              13:             TypeFloat 32
+              29:             TypeVector 13(float) 4
+             666:             TypePointer Function 29(fvec4)
+              11:             TypeInt 32 0
+            2588:     11(int) Constant 6
+             740:             TypeArray 29(fvec4) 2588
+            1377:             TypePointer Input 740
+            3608:   1377(ptr) Variable Input
+              12:             TypeInt 32 1
+            2574:     12(int) Constant 1
+             667:             TypePointer Input 29(fvec4)
+              24:             TypeVector 13(float) 3
+             661:             TypePointer Input 24(fvec3)
+            4957:    661(ptr) Variable Input
+            2618:     11(int) Constant 16
+             669:             TypeArray 13(float) 2618
+            1306:             TypePointer Input 669
+            4339:   1306(ptr) Variable Input
+            2607:     12(int) Constant 12
+             650:             TypePointer Input 13(float)
+            2579:     11(int) Constant 3
+             651:             TypePointer Function 13(float)
+             668:             TypePointer Output 29(fvec4)
+            5139:    668(ptr) Variable Output
+            5663:           8 Function None 1282
+           25029:             Label
+            4902:    666(ptr) Variable Function
+           10645:    667(ptr) AccessChain 3608 2574
+            8181:   29(fvec4) Load 10645
+           21370:    667(ptr) AccessChain 3608 2574
+           11355:   29(fvec4) Load 21370
+           23084:   29(fvec4) FAdd 8181 11355
+                              Store 4902 23084
+           21218:   24(fvec3) Load 4957
+           13695:   29(fvec4) Load 4902
+           23883:   24(fvec3) VectorShuffle 13695 13695 0 1 2
+           15591:   24(fvec3) FAdd 23883 21218
+           17086:   29(fvec4) Load 4902
+            7051:   29(fvec4) VectorShuffle 17086 15591 4 5 6 3
+                              Store 4902 7051
+           18282:    650(ptr) AccessChain 4339 2607
+            7372:   13(float) Load 18282
+           21371:    651(ptr) AccessChain 4902 2579
+           11412:   13(float) Load 21371
+           22584:   13(float) FAdd 11412 7372
+           17318:    651(ptr) AccessChain 4902 2579
+                              Store 17318 22584
+           17934:   29(fvec4) Load 4902
+                              Store 5139 17934
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.uniformarray.none.frag.out b/Test/baseResults/remap.uniformarray.none.frag.out
new file mode 100644
index 0000000..ff2489e
--- /dev/null
+++ b/Test/baseResults/remap.uniformarray.none.frag.out
@@ -0,0 +1,80 @@
+remap.uniformarray.none.frag
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 53
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 14 25 35 47
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 140
+                              Name 4  "main"
+                              Name 9  "texColor"
+                              Name 14  "color"
+                              Name 25  "inColor"
+                              Name 35  "alpha"
+                              Name 47  "gl_FragColor"
+                              Name 52  "texSampler2D"
+                              Decorate 52(texSampler2D) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypeInt 32 0
+              11:     10(int) Constant 6
+              12:             TypeArray 7(fvec4) 11
+              13:             TypePointer Input 12
+       14(color):     13(ptr) Variable Input
+              15:             TypeInt 32 1
+              16:     15(int) Constant 1
+              17:             TypePointer Input 7(fvec4)
+              23:             TypeVector 6(float) 3
+              24:             TypePointer Input 23(fvec3)
+     25(inColor):     24(ptr) Variable Input
+              32:     10(int) Constant 16
+              33:             TypeArray 6(float) 32
+              34:             TypePointer Input 33
+       35(alpha):     34(ptr) Variable Input
+              36:     15(int) Constant 12
+              37:             TypePointer Input 6(float)
+              40:     10(int) Constant 3
+              41:             TypePointer Function 6(float)
+              46:             TypePointer Output 7(fvec4)
+47(gl_FragColor):     46(ptr) Variable Output
+              49:             TypeImage 6(float) 2D sampled format:Unknown
+              50:             TypeSampledImage 49
+              51:             TypePointer UniformConstant 50
+52(texSampler2D):     51(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+     9(texColor):      8(ptr) Variable Function
+              18:     17(ptr) AccessChain 14(color) 16
+              19:    7(fvec4) Load 18
+              20:     17(ptr) AccessChain 14(color) 16
+              21:    7(fvec4) Load 20
+              22:    7(fvec4) FAdd 19 21
+                              Store 9(texColor) 22
+              26:   23(fvec3) Load 25(inColor)
+              27:    7(fvec4) Load 9(texColor)
+              28:   23(fvec3) VectorShuffle 27 27 0 1 2
+              29:   23(fvec3) FAdd 28 26
+              30:    7(fvec4) Load 9(texColor)
+              31:    7(fvec4) VectorShuffle 30 29 4 5 6 3
+                              Store 9(texColor) 31
+              38:     37(ptr) AccessChain 35(alpha) 36
+              39:    6(float) Load 38
+              42:     41(ptr) AccessChain 9(texColor) 40
+              43:    6(float) Load 42
+              44:    6(float) FAdd 43 39
+              45:     41(ptr) AccessChain 9(texColor) 40
+                              Store 45 44
+              48:    7(fvec4) Load 9(texColor)
+                              Store 47(gl_FragColor) 48
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.430.vert.out b/Test/baseResults/spv.430.vert.out
index 5274913..c3ad2b9 100755
--- a/Test/baseResults/spv.430.vert.out
+++ b/Test/baseResults/spv.430.vert.out
@@ -63,6 +63,7 @@
                               Decorate 55(sampb2) Binding 5
                               Decorate 56(sampb4) DescriptorSet 0
                               Decorate 56(sampb4) Binding 31
+                              MemberDecorate 59(S) 0 RelaxedPrecision
                               Decorate 62(var) Flat
                               Decorate 62(var) Location 0
                               MemberDecorate 63(MS) 0 Location 17
diff --git a/Test/baseResults/spv.450.tesc.out b/Test/baseResults/spv.450.tesc.out
index c6c08b2..2900fdf 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 23
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 9 16
+                              EntryPoint TessellationControl 4  "main" 9 16 19 22
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 450
                               Name 4  "main"
@@ -25,12 +25,39 @@
                               MemberName 11(TheBlock) 1  "bMem2"
                               MemberName 11(TheBlock) 2  "s"
                               Name 16  "tcBlock"
+                              Name 17  "SingleBlock"
+                              MemberName 17(SingleBlock) 0  "bMem1"
+                              MemberName 17(SingleBlock) 1  "bMem2"
+                              MemberName 17(SingleBlock) 2  "s"
+                              Name 19  "singleBlock"
+                              Name 20  "bn"
+                              MemberName 20(bn) 0  "v1"
+                              MemberName 20(bn) 1  "v2"
+                              MemberName 20(bn) 2  "v3"
+                              Name 22  ""
                               Decorate 9(patchOut) Patch
                               MemberDecorate 11(TheBlock) 0 Patch
                               MemberDecorate 11(TheBlock) 1 Patch
                               MemberDecorate 11(TheBlock) 2 Patch
                               Decorate 11(TheBlock) Block
                               Decorate 16(tcBlock) Location 12
+                              MemberDecorate 17(SingleBlock) 0 Patch
+                              MemberDecorate 17(SingleBlock) 0 Location 2
+                              MemberDecorate 17(SingleBlock) 1 Patch
+                              MemberDecorate 17(SingleBlock) 1 Location 3
+                              MemberDecorate 17(SingleBlock) 2 Patch
+                              MemberDecorate 17(SingleBlock) 2 Location 4
+                              Decorate 17(SingleBlock) Block
+                              Decorate 19(singleBlock) Location 2
+                              MemberDecorate 20(bn) 0 Patch
+                              MemberDecorate 20(bn) 0 Location 20
+                              MemberDecorate 20(bn) 0 Component 0
+                              MemberDecorate 20(bn) 1 Patch
+                              MemberDecorate 20(bn) 1 Location 24
+                              MemberDecorate 20(bn) 2 Patch
+                              MemberDecorate 20(bn) 2 Location 25
+                              MemberDecorate 20(bn) 2 Component 0
+                              Decorate 20(bn) Block
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -44,6 +71,12 @@
               14:             TypeArray 11(TheBlock) 13
               15:             TypePointer Output 14
      16(tcBlock):     15(ptr) Variable Output
+ 17(SingleBlock):             TypeStruct 6(float) 6(float) 10(S)
+              18:             TypePointer Output 17(SingleBlock)
+ 19(singleBlock):     18(ptr) Variable Output
+          20(bn):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4)
+              21:             TypePointer Output 20(bn)
+              22:     21(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
                               Return
diff --git a/Test/baseResults/spv.accessChain.frag.out b/Test/baseResults/spv.accessChain.frag.out
index e9a9d81..3d391c3 100755
--- a/Test/baseResults/spv.accessChain.frag.out
+++ b/Test/baseResults/spv.accessChain.frag.out
@@ -7,12 +7,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 197
+// Id's are bound by 206
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 65 149
+                              EntryPoint Fragment 4  "main" 65 158
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 420
                               Name 4  "main"
@@ -57,22 +57,22 @@
                               Name 60  "i"
                               Name 61  "comp"
                               Name 65  "OutColor"
-                              Name 144  "s"
-                              Name 149  "u"
-                              Name 150  "param"
-                              Name 154  "param"
-                              Name 158  "param"
-                              Name 162  "param"
-                              Name 166  "param"
-                              Name 170  "param"
-                              Name 174  "param"
-                              Name 178  "param"
-                              Name 182  "param"
-                              Name 186  "param"
-                              Name 190  "param"
-                              Name 194  "param"
+                              Name 153  "s"
+                              Name 158  "u"
+                              Name 159  "param"
+                              Name 163  "param"
+                              Name 167  "param"
+                              Name 171  "param"
+                              Name 175  "param"
+                              Name 179  "param"
+                              Name 183  "param"
+                              Name 187  "param"
+                              Name 191  "param"
+                              Name 195  "param"
+                              Name 199  "param"
+                              Name 203  "param"
                               Decorate 65(OutColor) Location 0
-                              Decorate 149(u) Flat
+                              Decorate 158(u) Flat
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -90,77 +90,77 @@
               95:             TypeVector 6(float) 2
              109:     67(int) Constant 2
              136:             TypePointer Output 6(float)
-             141:    6(float) Constant 0
-             142:    7(fvec3) ConstantComposite 141 141 141
-             143:             TypePointer Function 8(S)
-             148:             TypePointer Input 13(int)
-          149(u):    148(ptr) Variable Input
+             150:    6(float) Constant 0
+             151:    7(fvec3) ConstantComposite 150 150 150
+             152:             TypePointer Function 8(S)
+             157:             TypePointer Input 13(int)
+          158(u):    157(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-          144(s):    143(ptr) Variable Function
-      150(param):     14(ptr) Variable Function
-      154(param):     14(ptr) Variable Function
-      158(param):     14(ptr) Variable Function
-      162(param):     14(ptr) Variable Function
-      166(param):     14(ptr) Variable Function
-      170(param):     14(ptr) Variable Function
-      174(param):     14(ptr) Variable Function
-      178(param):     14(ptr) Variable Function
-      182(param):     14(ptr) Variable Function
-      186(param):     14(ptr) Variable Function
-      190(param):     14(ptr) Variable Function
-      194(param):     14(ptr) Variable Function
-                              Store 65(OutColor) 142
-             145:        8(S) Load 144(s)
-             146:           2 FunctionCall 11(GetColor1(struct-S-vf31;) 145
-             147:        8(S) Load 144(s)
-             151:     13(int) Load 149(u)
-                              Store 150(param) 151
-             152:           2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 147 150(param)
-             153:        8(S) Load 144(s)
-             155:     13(int) Load 149(u)
-                              Store 154(param) 155
-             156:           2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 153 154(param)
-             157:        8(S) Load 144(s)
-             159:     13(int) Load 149(u)
-                              Store 158(param) 159
-             160:           2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 157 158(param)
-             161:        8(S) Load 144(s)
-             163:     13(int) Load 149(u)
-                              Store 162(param) 163
-             164:           2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 161 162(param)
-             165:        8(S) Load 144(s)
-             167:     13(int) Load 149(u)
-                              Store 166(param) 167
-             168:           2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 165 166(param)
-             169:        8(S) Load 144(s)
-             171:     13(int) Load 149(u)
-                              Store 170(param) 171
-             172:           2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 169 170(param)
-             173:        8(S) Load 144(s)
-             175:     13(int) Load 149(u)
-                              Store 174(param) 175
-             176:           2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 173 174(param)
-             177:        8(S) Load 144(s)
-             179:     13(int) Load 149(u)
-                              Store 178(param) 179
-             180:           2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 177 178(param)
-             181:        8(S) Load 144(s)
-             183:     13(int) Load 149(u)
-                              Store 182(param) 183
-             184:           2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 181 182(param)
-             185:        8(S) Load 144(s)
-             187:     13(int) Load 149(u)
-                              Store 186(param) 187
-             188:           2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 185 186(param)
-             189:        8(S) Load 144(s)
-             191:     13(int) Load 149(u)
-                              Store 190(param) 191
-             192:           2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 189 190(param)
-             193:        8(S) Load 144(s)
-             195:     13(int) Load 149(u)
-                              Store 194(param) 195
-             196:           2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 193 194(param)
+          153(s):    152(ptr) Variable Function
+      159(param):     14(ptr) Variable Function
+      163(param):     14(ptr) Variable Function
+      167(param):     14(ptr) Variable Function
+      171(param):     14(ptr) Variable Function
+      175(param):     14(ptr) Variable Function
+      179(param):     14(ptr) Variable Function
+      183(param):     14(ptr) Variable Function
+      187(param):     14(ptr) Variable Function
+      191(param):     14(ptr) Variable Function
+      195(param):     14(ptr) Variable Function
+      199(param):     14(ptr) Variable Function
+      203(param):     14(ptr) Variable Function
+                              Store 65(OutColor) 151
+             154:        8(S) Load 153(s)
+             155:           2 FunctionCall 11(GetColor1(struct-S-vf31;) 154
+             156:        8(S) Load 153(s)
+             160:     13(int) Load 158(u)
+                              Store 159(param) 160
+             161:           2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 156 159(param)
+             162:        8(S) Load 153(s)
+             164:     13(int) Load 158(u)
+                              Store 163(param) 164
+             165:           2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 162 163(param)
+             166:        8(S) Load 153(s)
+             168:     13(int) Load 158(u)
+                              Store 167(param) 168
+             169:           2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 166 167(param)
+             170:        8(S) Load 153(s)
+             172:     13(int) Load 158(u)
+                              Store 171(param) 172
+             173:           2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 170 171(param)
+             174:        8(S) Load 153(s)
+             176:     13(int) Load 158(u)
+                              Store 175(param) 176
+             177:           2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 174 175(param)
+             178:        8(S) Load 153(s)
+             180:     13(int) Load 158(u)
+                              Store 179(param) 180
+             181:           2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 178 179(param)
+             182:        8(S) Load 153(s)
+             184:     13(int) Load 158(u)
+                              Store 183(param) 184
+             185:           2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 182 183(param)
+             186:        8(S) Load 153(s)
+             188:     13(int) Load 158(u)
+                              Store 187(param) 188
+             189:           2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 186 187(param)
+             190:        8(S) Load 153(s)
+             192:     13(int) Load 158(u)
+                              Store 191(param) 192
+             193:           2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 190 191(param)
+             194:        8(S) Load 153(s)
+             196:     13(int) Load 158(u)
+                              Store 195(param) 196
+             197:           2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 194 195(param)
+             198:        8(S) Load 153(s)
+             200:     13(int) Load 158(u)
+                              Store 199(param) 200
+             201:           2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 198 199(param)
+             202:        8(S) Load 153(s)
+             204:     13(int) Load 158(u)
+                              Store 203(param) 204
+             205:           2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 202 203(param)
                               Return
                               FunctionEnd
 11(GetColor1(struct-S-vf31;):           2 Function None 9
@@ -319,5 +319,15 @@
            60(i):        8(S) FunctionParameter
         61(comp):     14(ptr) FunctionParameter
               63:             Label
+             141:     13(int) Load 61(comp)
+             142:    6(float) CompositeExtract 60(i) 0 0
+             143:    7(fvec3) Load 65(OutColor)
+             144:   95(fvec2) VectorShuffle 143 143 2 1
+             145:    6(float) VectorExtractDynamic 144 141
+             146:    6(float) FAdd 145 142
+             147:    7(fvec3) Load 65(OutColor)
+             148:    7(fvec3) VectorShuffle 147 147 2 1 2
+             149:    7(fvec3) VectorInsertDynamic 148 146 141
+                              Store 65(OutColor) 149
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.aggOps.frag.out b/Test/baseResults/spv.aggOps.frag.out
index 4888bea..5a19d2f 100644
--- a/Test/baseResults/spv.aggOps.frag.out
+++ b/Test/baseResults/spv.aggOps.frag.out
@@ -1,5 +1,7 @@
 spv.aggOps.frag
 Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+WARNING: 0:4: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
+         "precision mediump int; precision highp float;" 
 
 
 Linked fragment stage:
@@ -64,6 +66,11 @@
                               Decorate 66(ub2) BufferBlock
                               Decorate 68(uName2) DescriptorSet 0
                               Decorate 97(samp2D) DescriptorSet 0
+                              Decorate 101(coord) RelaxedPrecision
+                              Decorate 102 RelaxedPrecision
+                              Decorate 107 RelaxedPrecision
+                              Decorate 108 RelaxedPrecision
+                              Decorate 129 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.for-complex-condition.vert.out b/Test/baseResults/spv.for-complex-condition.vert.out
index fab7f3d..c5fe438 100644
--- a/Test/baseResults/spv.for-complex-condition.vert.out
+++ b/Test/baseResults/spv.for-complex-condition.vert.out
@@ -18,7 +18,9 @@
                               Name 8  "i"
                               Name 18  "flag"
                               Name 31  "r"
+                              Decorate 18(flag) RelaxedPrecision
                               Decorate 18(flag) Location 0
+                              Decorate 19 RelaxedPrecision
                               Decorate 31(r) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.forwardFun.frag.out b/Test/baseResults/spv.forwardFun.frag.out
index 346523c..a804e1d 100755
--- a/Test/baseResults/spv.forwardFun.frag.out
+++ b/Test/baseResults/spv.forwardFun.frag.out
@@ -25,6 +25,26 @@
                               Name 30  "gl_FragColor"
                               Name 36  "d"
                               Name 59  "bigColor"
+                              Decorate 10(unreachableReturn() RelaxedPrecision
+                              Decorate 16(foo(vf4;) RelaxedPrecision
+                              Decorate 15(bar) RelaxedPrecision
+                              Decorate 18(color) RelaxedPrecision
+                              Decorate 20(BaseColor) RelaxedPrecision
+                              Decorate 22 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
+                              Decorate 24 RelaxedPrecision
+                              Decorate 27(f) RelaxedPrecision
+                              Decorate 28 RelaxedPrecision
+                              Decorate 30(gl_FragColor) RelaxedPrecision
+                              Decorate 31 RelaxedPrecision
+                              Decorate 32 RelaxedPrecision
+                              Decorate 33 RelaxedPrecision
+                              Decorate 36(d) RelaxedPrecision
+                              Decorate 37 RelaxedPrecision
+                              Decorate 52 RelaxedPrecision
+                              Decorate 55 RelaxedPrecision
+                              Decorate 56 RelaxedPrecision
+                              Decorate 59(bigColor) RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
diff --git a/Test/baseResults/spv.int64.frag.out b/Test/baseResults/spv.int64.frag.out
index fe45013..acfee73 100644
--- a/Test/baseResults/spv.int64.frag.out
+++ b/Test/baseResults/spv.int64.frag.out
@@ -5,10 +5,9 @@
 Linked fragment stage:
 
 
-Missing functionality: shader int64
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 455
+// Id's are bound by 480
 
                               Capability Shader
                               Capability Float64
@@ -24,603 +23,635 @@
                               Name 8  "typeCast("
                               Name 10  "operators("
                               Name 12  "builtinFuncs("
-                              Name 16  "i64"
-                              Name 24  "Uniforms"
-                              MemberName 24(Uniforms) 0  "index"
-                              Name 26  ""
-                              Name 33  "indexable"
-                              Name 38  "u64"
-                              Name 47  "indexable"
-                              Name 52  "i64v"
-                              Name 56  "bv"
-                              Name 65  "u64v"
-                              Name 74  "iv"
-                              Name 81  "uv"
-                              Name 89  "fv"
-                              Name 95  "dv"
-                              Name 132  "u64v"
-                              Name 137  "i64"
-                              Name 157  "i"
-                              Name 164  "uv"
-                              Name 216  "b"
-                              Name 276  "i64v"
-                              Name 279  "i64"
-                              Name 289  "u64v"
-                              Name 291  "u64"
-                              Name 363  "dv"
-                              Name 382  "iv"
-                              Name 387  "uv"
-                              Name 391  "bv"
-                              Name 452  "Block"
-                              MemberName 452(Block) 0  "i64v"
-                              MemberName 452(Block) 1  "u64"
-                              Name 454  "block"
-                              MemberDecorate 24(Uniforms) 0 Offset 0
-                              Decorate 24(Uniforms) Block
-                              Decorate 26 DescriptorSet 0
-                              Decorate 26 Binding 0
-                              MemberDecorate 452(Block) 0 Offset 0
-                              MemberDecorate 452(Block) 1 Offset 24
-                              Decorate 452(Block) Block
-                              Decorate 454(block) DescriptorSet 0
-                              Decorate 454(block) Binding 1
+                              Name 16  "u64Max"
+                              Name 20  "i64"
+                              Name 28  "Uniforms"
+                              MemberName 28(Uniforms) 0  "index"
+                              Name 30  ""
+                              Name 37  "indexable"
+                              Name 41  "u64"
+                              Name 49  "indexable"
+                              Name 54  "i64v"
+                              Name 58  "bv"
+                              Name 67  "u64v"
+                              Name 76  "iv"
+                              Name 83  "uv"
+                              Name 91  "fv"
+                              Name 97  "dv"
+                              Name 134  "u64v"
+                              Name 139  "i64"
+                              Name 159  "i"
+                              Name 166  "uv"
+                              Name 218  "b"
+                              Name 278  "i64v"
+                              Name 281  "i64"
+                              Name 291  "u64v"
+                              Name 293  "u64"
+                              Name 365  "dv"
+                              Name 384  "iv"
+                              Name 389  "uv"
+                              Name 393  "bv"
+                              Name 454  "Block"
+                              MemberName 454(Block) 0  "i64v"
+                              MemberName 454(Block) 1  "u64"
+                              Name 456  "block"
+                              MemberDecorate 28(Uniforms) 0 Offset 0
+                              Decorate 28(Uniforms) Block
+                              Decorate 30 DescriptorSet 0
+                              Decorate 30 Binding 0
+                              MemberDecorate 454(Block) 0 Offset 0
+                              MemberDecorate 454(Block) 1 Offset 24
+                              Decorate 454(Block) Block
+                              Decorate 456(block) DescriptorSet 0
+                              Decorate 456(block) Binding 1
+                              Decorate 457 SpecId 100
+                              Decorate 458 SpecId 101
+                              Decorate 459 SpecId 102
+                              Decorate 460 SpecId 103
+                              Decorate 461 SpecId 104
                2:             TypeVoid
                3:             TypeFunction 2
-              14:             TypeInt 64 1
-              15:             TypePointer Function 14(int)
-              17:             TypeInt 32 0
-              18:     17(int) Constant 3
-              19:             TypeArray 14(int) 18
-              20:     14(int) Constant 4008636143 4008636142
-              21:     14(int) Constant 4294967295 4294967295
-              22:     14(int) Constant 0 1
-              23:          19 ConstantComposite 20 21 22
-    24(Uniforms):             TypeStruct 17(int)
-              25:             TypePointer Uniform 24(Uniforms)
-              26:     25(ptr) Variable Uniform
-              27:             TypeInt 32 1
-              28:     27(int) Constant 0
-              29:             TypePointer Uniform 17(int)
-              32:             TypePointer Function 19
-              36:             TypeInt 64 0
-              37:             TypePointer Function 36(int)
-              39:             TypeArray 36(int) 18
-              40:     36(int) Constant 4294967295 4294967295
-              41:     36(int) Constant 0 1
-              42:     36(int) Constant 4294967295 1
-              43:          39 ConstantComposite 40 41 42
-              46:             TypePointer Function 39
-              50:             TypeVector 14(int) 2
-              51:             TypePointer Function 50(ivec2)
-              53:             TypeBool
-              54:             TypeVector 53(bool) 2
-              55:             TypePointer Function 54(bvec2)
-              58:     14(int) Constant 0 0
-              59:     14(int) Constant 1 0
-              60:   50(ivec2) ConstantComposite 58 58
-              61:   50(ivec2) ConstantComposite 59 59
-              63:             TypeVector 36(int) 2
-              64:             TypePointer Function 63(ivec2)
-              67:     36(int) Constant 0 0
-              68:     36(int) Constant 1 0
-              69:   63(ivec2) ConstantComposite 67 67
-              70:   63(ivec2) ConstantComposite 68 68
-              72:             TypeVector 27(int) 2
-              73:             TypePointer Function 72(ivec2)
-              79:             TypeVector 17(int) 2
-              80:             TypePointer Function 79(ivec2)
-              86:             TypeFloat 32
-              87:             TypeVector 86(float) 2
-              88:             TypePointer Function 87(fvec2)
-              92:             TypeFloat 64
-              93:             TypeVector 92(float) 2
-              94:             TypePointer Function 93(fvec2)
-             130:             TypeVector 36(int) 3
-             131:             TypePointer Function 130(ivec3)
-             134:             TypeVector 14(int) 3
-             156:             TypePointer Function 27(int)
-             162:             TypeVector 17(int) 3
-             163:             TypePointer Function 162(ivec3)
-             197:             TypeVector 27(int) 3
-             200:     17(int) Constant 1
-             201:             TypePointer Function 17(int)
-             207:     17(int) Constant 2
-             215:             TypePointer Function 53(bool)
-             217:     17(int) Constant 0
-             287:   50(ivec2) ConstantComposite 21 21
-             296:  130(ivec3) ConstantComposite 67 67 67
-             338:    53(bool) ConstantTrue
-             345:    53(bool) ConstantFalse
-             346:   54(bvec2) ConstantComposite 345 345
-             358:             TypeVector 53(bool) 3
-             359:  358(bvec3) ConstantComposite 345 345 345
-             361:             TypeVector 92(float) 3
-             362:             TypePointer Function 361(fvec3)
-             367:             TypePointer Function 92(float)
-             378:     27(int) Constant 1
-             379:     27(int) Constant 2
-             380:   72(ivec2) ConstantComposite 378 379
-             385:   79(ivec2) ConstantComposite 207 18
-             390:             TypePointer Function 358(bvec3)
-      452(Block):             TypeStruct 134(ivec3) 36(int)
-             453:             TypePointer Uniform 452(Block)
-      454(block):    453(ptr) Variable Uniform
+              14:             TypeInt 64 0
+              15:             TypePointer Private 14(int)
+      16(u64Max):     15(ptr) Variable Private
+              17:     14(int) Constant 4294967295 4294967295
+              18:             TypeInt 64 1
+              19:             TypePointer Function 18(int)
+              21:             TypeInt 32 0
+              22:     21(int) Constant 3
+              23:             TypeArray 18(int) 22
+              24:     18(int) Constant 4008636143 4008636142
+              25:     18(int) Constant 4294967295 4294967295
+              26:     18(int) Constant 0 1
+              27:          23 ConstantComposite 24 25 26
+    28(Uniforms):             TypeStruct 21(int)
+              29:             TypePointer Uniform 28(Uniforms)
+              30:     29(ptr) Variable Uniform
+              31:             TypeInt 32 1
+              32:     31(int) Constant 0
+              33:             TypePointer Uniform 21(int)
+              36:             TypePointer Function 23
+              40:             TypePointer Function 14(int)
+              42:             TypeArray 14(int) 22
+              43:     14(int) Constant 0 1
+              44:     14(int) Constant 4294967295 1
+              45:          42 ConstantComposite 17 43 44
+              48:             TypePointer Function 42
+              52:             TypeVector 18(int) 2
+              53:             TypePointer Function 52(ivec2)
+              55:             TypeBool
+              56:             TypeVector 55(bool) 2
+              57:             TypePointer Function 56(bvec2)
+              60:     18(int) Constant 0 0
+              61:     18(int) Constant 1 0
+              62:   52(ivec2) ConstantComposite 60 60
+              63:   52(ivec2) ConstantComposite 61 61
+              65:             TypeVector 14(int) 2
+              66:             TypePointer Function 65(ivec2)
+              69:     14(int) Constant 0 0
+              70:     14(int) Constant 1 0
+              71:   65(ivec2) ConstantComposite 69 69
+              72:   65(ivec2) ConstantComposite 70 70
+              74:             TypeVector 31(int) 2
+              75:             TypePointer Function 74(ivec2)
+              81:             TypeVector 21(int) 2
+              82:             TypePointer Function 81(ivec2)
+              88:             TypeFloat 32
+              89:             TypeVector 88(float) 2
+              90:             TypePointer Function 89(fvec2)
+              94:             TypeFloat 64
+              95:             TypeVector 94(float) 2
+              96:             TypePointer Function 95(fvec2)
+             132:             TypeVector 14(int) 3
+             133:             TypePointer Function 132(ivec3)
+             136:             TypeVector 18(int) 3
+             158:             TypePointer Function 31(int)
+             164:             TypeVector 21(int) 3
+             165:             TypePointer Function 164(ivec3)
+             199:             TypeVector 31(int) 3
+             202:     21(int) Constant 1
+             203:             TypePointer Function 21(int)
+             209:     21(int) Constant 2
+             217:             TypePointer Function 55(bool)
+             219:     21(int) Constant 0
+             289:   52(ivec2) ConstantComposite 25 25
+             298:  132(ivec3) ConstantComposite 69 69 69
+             340:    55(bool) ConstantTrue
+             347:    55(bool) ConstantFalse
+             348:   56(bvec2) ConstantComposite 347 347
+             360:             TypeVector 55(bool) 3
+             361:  360(bvec3) ConstantComposite 347 347 347
+             363:             TypeVector 94(float) 3
+             364:             TypePointer Function 363(fvec3)
+             369:             TypePointer Function 94(float)
+             380:     31(int) Constant 1
+             381:     31(int) Constant 2
+             382:   74(ivec2) ConstantComposite 380 381
+             387:   81(ivec2) ConstantComposite 209 22
+             392:             TypePointer Function 360(bvec3)
+      454(Block):             TypeStruct 136(ivec3) 14(int)
+             455:             TypePointer Uniform 454(Block)
+      456(block):    455(ptr) Variable Uniform
+             457:     18(int) SpecConstant 4294967286 4294967295
+             458:     14(int) SpecConstant 20 0
+             459:     31(int) SpecConstant 4294967291
+             460:     21(int) SpecConstant 4
+             461:    55(bool) SpecConstantTrue
+             462:    55(bool) SpecConstantOp 171 457 69
+             463:    55(bool) SpecConstantOp 171 458 69
+             464:     18(int) SpecConstantOp 169 461 61 60
+             465:     14(int) SpecConstantOp 169 461 70 69
+             466:     31(int) SpecConstantOp 114 457
+             467:     18(int) SpecConstantOp 114 459
+             468:     21(int) SpecConstantOp 113 458
+             469:     14(int) SpecConstantOp 113 460
+             470:     18(int) SpecConstantOp 128 458 69
+             471:     14(int) SpecConstantOp 128 457 69
+             472:     21(int) SpecConstantOp 113 458
+             473:     31(int) SpecConstantOp 128 472 219
+             474:     18(int) SpecConstantOp 114 459
+             475:     14(int) SpecConstantOp 128 474 69
+             476:     31(int) SpecConstantOp 114 457
+             477:     21(int) SpecConstantOp 128 476 219
+             478:     14(int) SpecConstantOp 113 460
+             479:     18(int) SpecConstantOp 128 478 69
          4(main):           2 Function None 3
                5:             Label
+                              Store 16(u64Max) 17
                               Return
                               FunctionEnd
      6(literal():           2 Function None 3
                7:             Label
-         16(i64):     15(ptr) Variable Function
-   33(indexable):     32(ptr) Variable Function
-         38(u64):     37(ptr) Variable Function
-   47(indexable):     46(ptr) Variable Function
-              30:     29(ptr) AccessChain 26 28
-              31:     17(int) Load 30
-                              Store 33(indexable) 23
-              34:     15(ptr) AccessChain 33(indexable) 31
-              35:     14(int) Load 34
-                              Store 16(i64) 35
-              44:     29(ptr) AccessChain 26 28
-              45:     17(int) Load 44
-                              Store 47(indexable) 43
-              48:     37(ptr) AccessChain 47(indexable) 45
-              49:     36(int) Load 48
-                              Store 38(u64) 49
+         20(i64):     19(ptr) Variable Function
+   37(indexable):     36(ptr) Variable Function
+         41(u64):     40(ptr) Variable Function
+   49(indexable):     48(ptr) Variable Function
+              34:     33(ptr) AccessChain 30 32
+              35:     21(int) Load 34
+                              Store 37(indexable) 27
+              38:     19(ptr) AccessChain 37(indexable) 35
+              39:     18(int) Load 38
+                              Store 20(i64) 39
+              46:     33(ptr) AccessChain 30 32
+              47:     21(int) Load 46
+                              Store 49(indexable) 45
+              50:     40(ptr) AccessChain 49(indexable) 47
+              51:     14(int) Load 50
+                              Store 41(u64) 51
                               Return
                               FunctionEnd
     8(typeCast():           2 Function None 3
                9:             Label
-        52(i64v):     51(ptr) Variable Function
-          56(bv):     55(ptr) Variable Function
-        65(u64v):     64(ptr) Variable Function
-          74(iv):     73(ptr) Variable Function
-          81(uv):     80(ptr) Variable Function
-          89(fv):     88(ptr) Variable Function
-          95(dv):     94(ptr) Variable Function
-              57:   54(bvec2) Load 56(bv)
-              62:   50(ivec2) Select 57 61 60
-                              Store 52(i64v) 62
-              66:   54(bvec2) Load 56(bv)
-              71:   63(ivec2) Select 66 70 69
-                              Store 65(u64v) 71
-              75:   72(ivec2) Load 74(iv)
-              76:   50(ivec2) SConvert 75
-                              Store 52(i64v) 76
-              77:   50(ivec2) Load 52(i64v)
-              78:   72(ivec2) SConvert 77
-                              Store 74(iv) 78
-              82:   79(ivec2) Load 81(uv)
-              83:   63(ivec2) UConvert 82
-                              Store 65(u64v) 83
-              84:   63(ivec2) Load 65(u64v)
-              85:   79(ivec2) UConvert 84
-                              Store 81(uv) 85
-              90:   50(ivec2) Load 52(i64v)
-              91:   87(fvec2) ConvertSToF 90
-                              Store 89(fv) 91
-              96:   50(ivec2) Load 52(i64v)
-              97:   93(fvec2) ConvertSToF 96
-                              Store 95(dv) 97
-              98:   63(ivec2) Load 65(u64v)
-              99:   87(fvec2) ConvertUToF 98
-                              Store 89(fv) 99
-             100:   63(ivec2) Load 65(u64v)
-             101:   93(fvec2) ConvertUToF 100
-                              Store 95(dv) 101
-             102:   87(fvec2) Load 89(fv)
-             103:   50(ivec2) ConvertFToS 102
-                              Store 52(i64v) 103
-             104:   93(fvec2) Load 95(dv)
-             105:   50(ivec2) ConvertFToS 104
-                              Store 52(i64v) 105
-             106:   87(fvec2) Load 89(fv)
-             107:   63(ivec2) ConvertFToU 106
-                              Store 65(u64v) 107
-             108:   93(fvec2) Load 95(dv)
-             109:   63(ivec2) ConvertFToU 108
-                              Store 65(u64v) 109
-             110:   50(ivec2) Load 52(i64v)
-             111:   54(bvec2) INotEqual 110 69
-                              Store 56(bv) 111
-             112:   63(ivec2) Load 65(u64v)
-             113:   54(bvec2) INotEqual 112 69
-                              Store 56(bv) 113
-             114:   50(ivec2) Load 52(i64v)
-             115:   63(ivec2) Bitcast 114
-                              Store 65(u64v) 115
-             116:   63(ivec2) Load 65(u64v)
-             117:   50(ivec2) Bitcast 116
-                              Store 52(i64v) 117
-             118:   50(ivec2) Load 52(i64v)
-             119:   72(ivec2) SConvert 118
-             120:   79(ivec2) Bitcast 119
-                              Store 81(uv) 120
-             121:   79(ivec2) Load 81(uv)
-             122:   63(ivec2) UConvert 121
-             123:   50(ivec2) Bitcast 122
-                              Store 52(i64v) 123
-             124:   63(ivec2) Load 65(u64v)
-             125:   79(ivec2) UConvert 124
-             126:   72(ivec2) Bitcast 125
-                              Store 74(iv) 126
-             127:   72(ivec2) Load 74(iv)
-             128:   50(ivec2) SConvert 127
-             129:   63(ivec2) Bitcast 128
-                              Store 65(u64v) 129
+        54(i64v):     53(ptr) Variable Function
+          58(bv):     57(ptr) Variable Function
+        67(u64v):     66(ptr) Variable Function
+          76(iv):     75(ptr) Variable Function
+          83(uv):     82(ptr) Variable Function
+          91(fv):     90(ptr) Variable Function
+          97(dv):     96(ptr) Variable Function
+              59:   56(bvec2) Load 58(bv)
+              64:   52(ivec2) Select 59 63 62
+                              Store 54(i64v) 64
+              68:   56(bvec2) Load 58(bv)
+              73:   65(ivec2) Select 68 72 71
+                              Store 67(u64v) 73
+              77:   74(ivec2) Load 76(iv)
+              78:   52(ivec2) SConvert 77
+                              Store 54(i64v) 78
+              79:   52(ivec2) Load 54(i64v)
+              80:   74(ivec2) SConvert 79
+                              Store 76(iv) 80
+              84:   81(ivec2) Load 83(uv)
+              85:   65(ivec2) UConvert 84
+                              Store 67(u64v) 85
+              86:   65(ivec2) Load 67(u64v)
+              87:   81(ivec2) UConvert 86
+                              Store 83(uv) 87
+              92:   52(ivec2) Load 54(i64v)
+              93:   89(fvec2) ConvertSToF 92
+                              Store 91(fv) 93
+              98:   52(ivec2) Load 54(i64v)
+              99:   95(fvec2) ConvertSToF 98
+                              Store 97(dv) 99
+             100:   65(ivec2) Load 67(u64v)
+             101:   89(fvec2) ConvertUToF 100
+                              Store 91(fv) 101
+             102:   65(ivec2) Load 67(u64v)
+             103:   95(fvec2) ConvertUToF 102
+                              Store 97(dv) 103
+             104:   89(fvec2) Load 91(fv)
+             105:   52(ivec2) ConvertFToS 104
+                              Store 54(i64v) 105
+             106:   95(fvec2) Load 97(dv)
+             107:   52(ivec2) ConvertFToS 106
+                              Store 54(i64v) 107
+             108:   89(fvec2) Load 91(fv)
+             109:   65(ivec2) ConvertFToU 108
+                              Store 67(u64v) 109
+             110:   95(fvec2) Load 97(dv)
+             111:   65(ivec2) ConvertFToU 110
+                              Store 67(u64v) 111
+             112:   52(ivec2) Load 54(i64v)
+             113:   56(bvec2) INotEqual 112 71
+                              Store 58(bv) 113
+             114:   65(ivec2) Load 67(u64v)
+             115:   56(bvec2) INotEqual 114 71
+                              Store 58(bv) 115
+             116:   52(ivec2) Load 54(i64v)
+             117:   65(ivec2) Bitcast 116
+                              Store 67(u64v) 117
+             118:   65(ivec2) Load 67(u64v)
+             119:   52(ivec2) Bitcast 118
+                              Store 54(i64v) 119
+             120:   52(ivec2) Load 54(i64v)
+             121:   74(ivec2) SConvert 120
+             122:   81(ivec2) Bitcast 121
+                              Store 83(uv) 122
+             123:   81(ivec2) Load 83(uv)
+             124:   65(ivec2) UConvert 123
+             125:   52(ivec2) Bitcast 124
+                              Store 54(i64v) 125
+             126:   65(ivec2) Load 67(u64v)
+             127:   81(ivec2) UConvert 126
+             128:   74(ivec2) Bitcast 127
+                              Store 76(iv) 128
+             129:   74(ivec2) Load 76(iv)
+             130:   52(ivec2) SConvert 129
+             131:   65(ivec2) Bitcast 130
+                              Store 67(u64v) 131
                               Return
                               FunctionEnd
   10(operators():           2 Function None 3
               11:             Label
-       132(u64v):    131(ptr) Variable Function
-        137(i64):     15(ptr) Variable Function
-          157(i):    156(ptr) Variable Function
-         164(uv):    163(ptr) Variable Function
-          216(b):    215(ptr) Variable Function
-             133:  130(ivec3) Load 132(u64v)
-             135:  134(ivec3) CompositeConstruct 59 59 59
-             136:  130(ivec3) IAdd 133 135
-                              Store 132(u64v) 136
-             138:     14(int) Load 137(i64)
-             139:     14(int) ISub 138 59
-                              Store 137(i64) 139
-             140:     14(int) Load 137(i64)
-             141:     14(int) IAdd 140 59
-                              Store 137(i64) 141
-             142:  130(ivec3) Load 132(u64v)
-             143:  134(ivec3) CompositeConstruct 59 59 59
-             144:  130(ivec3) ISub 142 143
-                              Store 132(u64v) 144
-             145:  130(ivec3) Load 132(u64v)
-             146:  130(ivec3) Not 145
-                              Store 132(u64v) 146
-             147:     14(int) Load 137(i64)
-                              Store 137(i64) 147
-             148:  130(ivec3) Load 132(u64v)
-             149:  130(ivec3) SNegate 148
-                              Store 132(u64v) 149
-             150:     14(int) Load 137(i64)
-             151:     14(int) Load 137(i64)
-             152:     14(int) IAdd 151 150
-                              Store 137(i64) 152
-             153:  130(ivec3) Load 132(u64v)
-             154:  130(ivec3) Load 132(u64v)
-             155:  130(ivec3) ISub 154 153
-                              Store 132(u64v) 155
-             158:     27(int) Load 157(i)
-             159:     14(int) SConvert 158
-             160:     14(int) Load 137(i64)
-             161:     14(int) IMul 160 159
-                              Store 137(i64) 161
-             165:  162(ivec3) Load 164(uv)
-             166:  130(ivec3) UConvert 165
-             167:  130(ivec3) Load 132(u64v)
-             168:  130(ivec3) UDiv 167 166
-                              Store 132(u64v) 168
-             169:     27(int) Load 157(i)
-             170:     14(int) SConvert 169
-             171:     36(int) Bitcast 170
-             172:  130(ivec3) Load 132(u64v)
-             173:  130(ivec3) CompositeConstruct 171 171 171
-             174:  130(ivec3) UMod 172 173
-                              Store 132(u64v) 174
-             175:  130(ivec3) Load 132(u64v)
-             176:  162(ivec3) Load 164(uv)
-             177:  130(ivec3) UConvert 176
-             178:  130(ivec3) IAdd 175 177
-                              Store 132(u64v) 178
-             179:     14(int) Load 137(i64)
-             180:     27(int) Load 157(i)
-             181:     14(int) SConvert 180
-             182:     14(int) ISub 179 181
-                              Store 137(i64) 182
-             183:  130(ivec3) Load 132(u64v)
-             184:  162(ivec3) Load 164(uv)
-             185:  130(ivec3) UConvert 184
-             186:  130(ivec3) IMul 183 185
-                              Store 132(u64v) 186
-             187:     14(int) Load 137(i64)
-             188:     27(int) Load 157(i)
-             189:     14(int) SConvert 188
-             190:     14(int) IMul 187 189
-                              Store 137(i64) 190
-             191:     14(int) Load 137(i64)
-             192:     27(int) Load 157(i)
-             193:     14(int) SConvert 192
-             194:     14(int) SMod 191 193
-                              Store 137(i64) 194
-             195:     27(int) Load 157(i)
-             196:  130(ivec3) Load 132(u64v)
-             198:  197(ivec3) CompositeConstruct 195 195 195
-             199:  130(ivec3) ShiftLeftLogical 196 198
-                              Store 132(u64v) 199
-             202:    201(ptr) AccessChain 164(uv) 200
-             203:     17(int) Load 202
-             204:     14(int) Load 137(i64)
-             205:     14(int) ShiftRightArithmetic 204 203
-                              Store 137(i64) 205
-             206:     14(int) Load 137(i64)
-             208:     37(ptr) AccessChain 132(u64v) 207
-             209:     36(int) Load 208
-             210:     14(int) ShiftLeftLogical 206 209
-                              Store 137(i64) 210
-             211:  130(ivec3) Load 132(u64v)
-             212:     14(int) Load 137(i64)
-             213:  134(ivec3) CompositeConstruct 212 212 212
-             214:  130(ivec3) ShiftLeftLogical 211 213
-                              Store 132(u64v) 214
-             218:     37(ptr) AccessChain 132(u64v) 217
-             219:     36(int) Load 218
-             220:     14(int) Load 137(i64)
-             221:     36(int) Bitcast 220
-             222:    53(bool) INotEqual 219 221
-                              Store 216(b) 222
-             223:     14(int) Load 137(i64)
-             224:     36(int) Bitcast 223
-             225:     37(ptr) AccessChain 132(u64v) 217
-             226:     36(int) Load 225
-             227:    53(bool) IEqual 224 226
-                              Store 216(b) 227
-             228:     37(ptr) AccessChain 132(u64v) 217
-             229:     36(int) Load 228
-             230:    201(ptr) AccessChain 164(uv) 200
-             231:     17(int) Load 230
-             232:     36(int) UConvert 231
-             233:    53(bool) UGreaterThan 229 232
-                              Store 216(b) 233
-             234:     14(int) Load 137(i64)
-             235:     27(int) Load 157(i)
-             236:     14(int) SConvert 235
-             237:    53(bool) SLessThan 234 236
-                              Store 216(b) 237
-             238:     37(ptr) AccessChain 132(u64v) 200
-             239:     36(int) Load 238
-             240:    201(ptr) AccessChain 164(uv) 217
-             241:     17(int) Load 240
-             242:     36(int) UConvert 241
-             243:    53(bool) UGreaterThanEqual 239 242
-                              Store 216(b) 243
-             244:     14(int) Load 137(i64)
-             245:     27(int) Load 157(i)
-             246:     14(int) SConvert 245
-             247:    53(bool) SLessThanEqual 244 246
-                              Store 216(b) 247
-             248:     27(int) Load 157(i)
-             249:     14(int) SConvert 248
-             250:     36(int) Bitcast 249
-             251:  130(ivec3) Load 132(u64v)
-             252:  130(ivec3) CompositeConstruct 250 250 250
-             253:  130(ivec3) BitwiseOr 251 252
-                              Store 132(u64v) 253
-             254:     14(int) Load 137(i64)
-             255:     27(int) Load 157(i)
-             256:     14(int) SConvert 255
-             257:     14(int) BitwiseOr 254 256
-                              Store 137(i64) 257
-             258:     27(int) Load 157(i)
-             259:     14(int) SConvert 258
-             260:     14(int) Load 137(i64)
-             261:     14(int) BitwiseAnd 260 259
-                              Store 137(i64) 261
-             262:  130(ivec3) Load 132(u64v)
-             263:  162(ivec3) Load 164(uv)
-             264:  130(ivec3) UConvert 263
-             265:  130(ivec3) BitwiseAnd 262 264
-                              Store 132(u64v) 265
-             266:     14(int) Load 137(i64)
-             267:     36(int) Bitcast 266
-             268:  130(ivec3) Load 132(u64v)
-             269:  130(ivec3) CompositeConstruct 267 267 267
-             270:  130(ivec3) BitwiseXor 268 269
-                              Store 132(u64v) 270
-             271:  130(ivec3) Load 132(u64v)
-             272:     14(int) Load 137(i64)
-             273:     36(int) Bitcast 272
-             274:  130(ivec3) CompositeConstruct 273 273 273
-             275:  130(ivec3) BitwiseXor 271 274
-                              Store 132(u64v) 275
+       134(u64v):    133(ptr) Variable Function
+        139(i64):     19(ptr) Variable Function
+          159(i):    158(ptr) Variable Function
+         166(uv):    165(ptr) Variable Function
+          218(b):    217(ptr) Variable Function
+             135:  132(ivec3) Load 134(u64v)
+             137:  136(ivec3) CompositeConstruct 61 61 61
+             138:  132(ivec3) IAdd 135 137
+                              Store 134(u64v) 138
+             140:     18(int) Load 139(i64)
+             141:     18(int) ISub 140 61
+                              Store 139(i64) 141
+             142:     18(int) Load 139(i64)
+             143:     18(int) IAdd 142 61
+                              Store 139(i64) 143
+             144:  132(ivec3) Load 134(u64v)
+             145:  136(ivec3) CompositeConstruct 61 61 61
+             146:  132(ivec3) ISub 144 145
+                              Store 134(u64v) 146
+             147:  132(ivec3) Load 134(u64v)
+             148:  132(ivec3) Not 147
+                              Store 134(u64v) 148
+             149:     18(int) Load 139(i64)
+                              Store 139(i64) 149
+             150:  132(ivec3) Load 134(u64v)
+             151:  132(ivec3) SNegate 150
+                              Store 134(u64v) 151
+             152:     18(int) Load 139(i64)
+             153:     18(int) Load 139(i64)
+             154:     18(int) IAdd 153 152
+                              Store 139(i64) 154
+             155:  132(ivec3) Load 134(u64v)
+             156:  132(ivec3) Load 134(u64v)
+             157:  132(ivec3) ISub 156 155
+                              Store 134(u64v) 157
+             160:     31(int) Load 159(i)
+             161:     18(int) SConvert 160
+             162:     18(int) Load 139(i64)
+             163:     18(int) IMul 162 161
+                              Store 139(i64) 163
+             167:  164(ivec3) Load 166(uv)
+             168:  132(ivec3) UConvert 167
+             169:  132(ivec3) Load 134(u64v)
+             170:  132(ivec3) UDiv 169 168
+                              Store 134(u64v) 170
+             171:     31(int) Load 159(i)
+             172:     18(int) SConvert 171
+             173:     14(int) Bitcast 172
+             174:  132(ivec3) Load 134(u64v)
+             175:  132(ivec3) CompositeConstruct 173 173 173
+             176:  132(ivec3) UMod 174 175
+                              Store 134(u64v) 176
+             177:  132(ivec3) Load 134(u64v)
+             178:  164(ivec3) Load 166(uv)
+             179:  132(ivec3) UConvert 178
+             180:  132(ivec3) IAdd 177 179
+                              Store 134(u64v) 180
+             181:     18(int) Load 139(i64)
+             182:     31(int) Load 159(i)
+             183:     18(int) SConvert 182
+             184:     18(int) ISub 181 183
+                              Store 139(i64) 184
+             185:  132(ivec3) Load 134(u64v)
+             186:  164(ivec3) Load 166(uv)
+             187:  132(ivec3) UConvert 186
+             188:  132(ivec3) IMul 185 187
+                              Store 134(u64v) 188
+             189:     18(int) Load 139(i64)
+             190:     31(int) Load 159(i)
+             191:     18(int) SConvert 190
+             192:     18(int) IMul 189 191
+                              Store 139(i64) 192
+             193:     18(int) Load 139(i64)
+             194:     31(int) Load 159(i)
+             195:     18(int) SConvert 194
+             196:     18(int) SMod 193 195
+                              Store 139(i64) 196
+             197:     31(int) Load 159(i)
+             198:  132(ivec3) Load 134(u64v)
+             200:  199(ivec3) CompositeConstruct 197 197 197
+             201:  132(ivec3) ShiftLeftLogical 198 200
+                              Store 134(u64v) 201
+             204:    203(ptr) AccessChain 166(uv) 202
+             205:     21(int) Load 204
+             206:     18(int) Load 139(i64)
+             207:     18(int) ShiftRightArithmetic 206 205
+                              Store 139(i64) 207
+             208:     18(int) Load 139(i64)
+             210:     40(ptr) AccessChain 134(u64v) 209
+             211:     14(int) Load 210
+             212:     18(int) ShiftLeftLogical 208 211
+                              Store 139(i64) 212
+             213:  132(ivec3) Load 134(u64v)
+             214:     18(int) Load 139(i64)
+             215:  136(ivec3) CompositeConstruct 214 214 214
+             216:  132(ivec3) ShiftLeftLogical 213 215
+                              Store 134(u64v) 216
+             220:     40(ptr) AccessChain 134(u64v) 219
+             221:     14(int) Load 220
+             222:     18(int) Load 139(i64)
+             223:     14(int) Bitcast 222
+             224:    55(bool) INotEqual 221 223
+                              Store 218(b) 224
+             225:     18(int) Load 139(i64)
+             226:     14(int) Bitcast 225
+             227:     40(ptr) AccessChain 134(u64v) 219
+             228:     14(int) Load 227
+             229:    55(bool) IEqual 226 228
+                              Store 218(b) 229
+             230:     40(ptr) AccessChain 134(u64v) 219
+             231:     14(int) Load 230
+             232:    203(ptr) AccessChain 166(uv) 202
+             233:     21(int) Load 232
+             234:     14(int) UConvert 233
+             235:    55(bool) UGreaterThan 231 234
+                              Store 218(b) 235
+             236:     18(int) Load 139(i64)
+             237:     31(int) Load 159(i)
+             238:     18(int) SConvert 237
+             239:    55(bool) SLessThan 236 238
+                              Store 218(b) 239
+             240:     40(ptr) AccessChain 134(u64v) 202
+             241:     14(int) Load 240
+             242:    203(ptr) AccessChain 166(uv) 219
+             243:     21(int) Load 242
+             244:     14(int) UConvert 243
+             245:    55(bool) UGreaterThanEqual 241 244
+                              Store 218(b) 245
+             246:     18(int) Load 139(i64)
+             247:     31(int) Load 159(i)
+             248:     18(int) SConvert 247
+             249:    55(bool) SLessThanEqual 246 248
+                              Store 218(b) 249
+             250:     31(int) Load 159(i)
+             251:     18(int) SConvert 250
+             252:     14(int) Bitcast 251
+             253:  132(ivec3) Load 134(u64v)
+             254:  132(ivec3) CompositeConstruct 252 252 252
+             255:  132(ivec3) BitwiseOr 253 254
+                              Store 134(u64v) 255
+             256:     18(int) Load 139(i64)
+             257:     31(int) Load 159(i)
+             258:     18(int) SConvert 257
+             259:     18(int) BitwiseOr 256 258
+                              Store 139(i64) 259
+             260:     31(int) Load 159(i)
+             261:     18(int) SConvert 260
+             262:     18(int) Load 139(i64)
+             263:     18(int) BitwiseAnd 262 261
+                              Store 139(i64) 263
+             264:  132(ivec3) Load 134(u64v)
+             265:  164(ivec3) Load 166(uv)
+             266:  132(ivec3) UConvert 265
+             267:  132(ivec3) BitwiseAnd 264 266
+                              Store 134(u64v) 267
+             268:     18(int) Load 139(i64)
+             269:     14(int) Bitcast 268
+             270:  132(ivec3) Load 134(u64v)
+             271:  132(ivec3) CompositeConstruct 269 269 269
+             272:  132(ivec3) BitwiseXor 270 271
+                              Store 134(u64v) 272
+             273:  132(ivec3) Load 134(u64v)
+             274:     18(int) Load 139(i64)
+             275:     14(int) Bitcast 274
+             276:  132(ivec3) CompositeConstruct 275 275 275
+             277:  132(ivec3) BitwiseXor 273 276
+                              Store 134(u64v) 277
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-       276(i64v):     51(ptr) Variable Function
-        279(i64):     15(ptr) Variable Function
-       289(u64v):    131(ptr) Variable Function
-        291(u64):     37(ptr) Variable Function
-         363(dv):    362(ptr) Variable Function
-         382(iv):     73(ptr) Variable Function
-         387(uv):     80(ptr) Variable Function
-         391(bv):    390(ptr) Variable Function
-             277:   50(ivec2) Load 276(i64v)
-             278:   50(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 277
-                              Store 276(i64v) 278
-             280:     14(int) Load 279(i64)
-             281:     14(int) ExtInst 1(GLSL.std.450) 7(SSign) 280
-                              Store 279(i64) 281
-             282:   50(ivec2) Load 276(i64v)
-             283:     14(int) Load 279(i64)
-             284:   50(ivec2) CompositeConstruct 283 283
-             285:   50(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 282 284
-                              Store 276(i64v) 285
-             286:   50(ivec2) Load 276(i64v)
-             288:   50(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 286 287
-                              Store 276(i64v) 288
-             290:  130(ivec3) Load 289(u64v)
-             292:     36(int) Load 291(u64)
-             293:  130(ivec3) CompositeConstruct 292 292 292
-             294:  130(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 290 293
-                              Store 289(u64v) 294
-             295:  130(ivec3) Load 289(u64v)
-             297:  130(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 295 296
-                              Store 289(u64v) 297
-             298:   50(ivec2) Load 276(i64v)
-             299:     14(int) Load 279(i64)
-             300:   50(ivec2) CompositeConstruct 299 299
-             301:   50(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 298 300
-                              Store 276(i64v) 301
-             302:   50(ivec2) Load 276(i64v)
-             303:   50(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 302 287
-                              Store 276(i64v) 303
-             304:  130(ivec3) Load 289(u64v)
-             305:     36(int) Load 291(u64)
-             306:  130(ivec3) CompositeConstruct 305 305 305
-             307:  130(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 304 306
-                              Store 289(u64v) 307
-             308:  130(ivec3) Load 289(u64v)
-             309:  130(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 308 296
-                              Store 289(u64v) 309
-             310:   50(ivec2) Load 276(i64v)
-             311:     14(int) Load 279(i64)
-             312:     14(int) SNegate 311
-             313:     14(int) Load 279(i64)
-             314:   50(ivec2) CompositeConstruct 312 312
-             315:   50(ivec2) CompositeConstruct 313 313
-             316:   50(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 310 314 315
-                              Store 276(i64v) 316
-             317:   50(ivec2) Load 276(i64v)
-             318:   50(ivec2) Load 276(i64v)
-             319:   50(ivec2) SNegate 318
-             320:   50(ivec2) Load 276(i64v)
-             321:   50(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 317 319 320
-                              Store 276(i64v) 321
-             322:  130(ivec3) Load 289(u64v)
-             323:     36(int) Load 291(u64)
-             324:     36(int) SNegate 323
-             325:     36(int) Load 291(u64)
-             326:  130(ivec3) CompositeConstruct 324 324 324
-             327:  130(ivec3) CompositeConstruct 325 325 325
-             328:  130(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 322 326 327
-                              Store 289(u64v) 328
-             329:  130(ivec3) Load 289(u64v)
-             330:  130(ivec3) Load 289(u64v)
-             331:  130(ivec3) SNegate 330
-             332:  130(ivec3) Load 289(u64v)
-             333:  130(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 329 331 332
-                              Store 289(u64v) 333
-             334:     15(ptr) AccessChain 276(i64v) 217
-             335:     14(int) Load 334
-             336:     15(ptr) AccessChain 276(i64v) 200
-             337:     14(int) Load 336
-             339:     14(int) Select 338 337 335
-                              Store 279(i64) 339
-             340:     14(int) Load 279(i64)
-             341:   50(ivec2) CompositeConstruct 340 340
-             342:     14(int) Load 279(i64)
-             343:     14(int) SNegate 342
-             344:   50(ivec2) CompositeConstruct 343 343
-             347:   50(ivec2) Select 346 344 341
-                              Store 276(i64v) 347
-             348:     37(ptr) AccessChain 289(u64v) 217
-             349:     36(int) Load 348
-             350:     37(ptr) AccessChain 289(u64v) 200
-             351:     36(int) Load 350
-             352:     36(int) Select 338 351 349
-                              Store 291(u64) 352
-             353:     36(int) Load 291(u64)
-             354:  130(ivec3) CompositeConstruct 353 353 353
-             355:     36(int) Load 291(u64)
-             356:     36(int) SNegate 355
-             357:  130(ivec3) CompositeConstruct 356 356 356
-             360:  130(ivec3) Select 359 357 354
-                              Store 289(u64v) 360
-             364:  361(fvec3) Load 363(dv)
-             365:   93(fvec2) VectorShuffle 364 364 0 1
-             366:   50(ivec2) Bitcast 365
-                              Store 276(i64v) 366
-             368:    367(ptr) AccessChain 363(dv) 207
-             369:   92(float) Load 368
-             370:     36(int) Bitcast 369
-             371:     37(ptr) AccessChain 289(u64v) 217
-                              Store 371 370
-             372:   50(ivec2) Load 276(i64v)
-             373:   93(fvec2) Bitcast 372
-             374:  361(fvec3) Load 363(dv)
-             375:  361(fvec3) VectorShuffle 374 373 3 4 2
-                              Store 363(dv) 375
-             376:  130(ivec3) Load 289(u64v)
-             377:  361(fvec3) Bitcast 376
-                              Store 363(dv) 377
-             381:     14(int) ExtInst 1(GLSL.std.450) 0(Unknown) 380
-                              Store 279(i64) 381
-             383:     14(int) Load 279(i64)
-             384:   72(ivec2) ExtInst 1(GLSL.std.450) 0(Unknown) 383
-                              Store 382(iv) 384
-             386:     36(int) ExtInst 1(GLSL.std.450) 0(Unknown) 385
-                              Store 291(u64) 386
-             388:     36(int) Load 291(u64)
-             389:   79(ivec2) ExtInst 1(GLSL.std.450) 0(Unknown) 388
-                              Store 387(uv) 389
-             392:  130(ivec3) Load 289(u64v)
-             393:     36(int) Load 291(u64)
-             394:  130(ivec3) CompositeConstruct 393 393 393
-             395:  358(bvec3) ULessThan 392 394
-                              Store 391(bv) 395
-             396:   50(ivec2) Load 276(i64v)
-             397:     14(int) Load 279(i64)
-             398:   50(ivec2) CompositeConstruct 397 397
-             399:   54(bvec2) SLessThan 396 398
-             400:  358(bvec3) Load 391(bv)
-             401:  358(bvec3) VectorShuffle 400 399 3 4 2
-                              Store 391(bv) 401
-             402:  130(ivec3) Load 289(u64v)
-             403:     36(int) Load 291(u64)
-             404:  130(ivec3) CompositeConstruct 403 403 403
-             405:  358(bvec3) ULessThanEqual 402 404
-                              Store 391(bv) 405
-             406:   50(ivec2) Load 276(i64v)
-             407:     14(int) Load 279(i64)
-             408:   50(ivec2) CompositeConstruct 407 407
-             409:   54(bvec2) SLessThanEqual 406 408
-             410:  358(bvec3) Load 391(bv)
-             411:  358(bvec3) VectorShuffle 410 409 3 4 2
-                              Store 391(bv) 411
-             412:  130(ivec3) Load 289(u64v)
-             413:     36(int) Load 291(u64)
-             414:  130(ivec3) CompositeConstruct 413 413 413
-             415:  358(bvec3) UGreaterThan 412 414
-                              Store 391(bv) 415
-             416:   50(ivec2) Load 276(i64v)
-             417:     14(int) Load 279(i64)
-             418:   50(ivec2) CompositeConstruct 417 417
-             419:   54(bvec2) SGreaterThan 416 418
-             420:  358(bvec3) Load 391(bv)
-             421:  358(bvec3) VectorShuffle 420 419 3 4 2
-                              Store 391(bv) 421
-             422:  130(ivec3) Load 289(u64v)
-             423:     36(int) Load 291(u64)
-             424:  130(ivec3) CompositeConstruct 423 423 423
-             425:  358(bvec3) UGreaterThanEqual 422 424
-                              Store 391(bv) 425
-             426:   50(ivec2) Load 276(i64v)
-             427:     14(int) Load 279(i64)
-             428:   50(ivec2) CompositeConstruct 427 427
-             429:   54(bvec2) SGreaterThanEqual 426 428
-             430:  358(bvec3) Load 391(bv)
-             431:  358(bvec3) VectorShuffle 430 429 3 4 2
-                              Store 391(bv) 431
-             432:  130(ivec3) Load 289(u64v)
-             433:     36(int) Load 291(u64)
-             434:  130(ivec3) CompositeConstruct 433 433 433
-             435:  358(bvec3) IEqual 432 434
-                              Store 391(bv) 435
-             436:   50(ivec2) Load 276(i64v)
-             437:     14(int) Load 279(i64)
-             438:   50(ivec2) CompositeConstruct 437 437
-             439:   54(bvec2) IEqual 436 438
-             440:  358(bvec3) Load 391(bv)
-             441:  358(bvec3) VectorShuffle 440 439 3 4 2
-                              Store 391(bv) 441
-             442:  130(ivec3) Load 289(u64v)
-             443:     36(int) Load 291(u64)
-             444:  130(ivec3) CompositeConstruct 443 443 443
-             445:  358(bvec3) INotEqual 442 444
-                              Store 391(bv) 445
-             446:   50(ivec2) Load 276(i64v)
-             447:     14(int) Load 279(i64)
-             448:   50(ivec2) CompositeConstruct 447 447
-             449:   54(bvec2) INotEqual 446 448
-             450:  358(bvec3) Load 391(bv)
-             451:  358(bvec3) VectorShuffle 450 449 3 4 2
-                              Store 391(bv) 451
+       278(i64v):     53(ptr) Variable Function
+        281(i64):     19(ptr) Variable Function
+       291(u64v):    133(ptr) Variable Function
+        293(u64):     40(ptr) Variable Function
+         365(dv):    364(ptr) Variable Function
+         384(iv):     75(ptr) Variable Function
+         389(uv):     82(ptr) Variable Function
+         393(bv):    392(ptr) Variable Function
+             279:   52(ivec2) Load 278(i64v)
+             280:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 279
+                              Store 278(i64v) 280
+             282:     18(int) Load 281(i64)
+             283:     18(int) ExtInst 1(GLSL.std.450) 7(SSign) 282
+                              Store 281(i64) 283
+             284:   52(ivec2) Load 278(i64v)
+             285:     18(int) Load 281(i64)
+             286:   52(ivec2) CompositeConstruct 285 285
+             287:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 284 286
+                              Store 278(i64v) 287
+             288:   52(ivec2) Load 278(i64v)
+             290:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 288 289
+                              Store 278(i64v) 290
+             292:  132(ivec3) Load 291(u64v)
+             294:     14(int) Load 293(u64)
+             295:  132(ivec3) CompositeConstruct 294 294 294
+             296:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 292 295
+                              Store 291(u64v) 296
+             297:  132(ivec3) Load 291(u64v)
+             299:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 297 298
+                              Store 291(u64v) 299
+             300:   52(ivec2) Load 278(i64v)
+             301:     18(int) Load 281(i64)
+             302:   52(ivec2) CompositeConstruct 301 301
+             303:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 300 302
+                              Store 278(i64v) 303
+             304:   52(ivec2) Load 278(i64v)
+             305:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 304 289
+                              Store 278(i64v) 305
+             306:  132(ivec3) Load 291(u64v)
+             307:     14(int) Load 293(u64)
+             308:  132(ivec3) CompositeConstruct 307 307 307
+             309:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 306 308
+                              Store 291(u64v) 309
+             310:  132(ivec3) Load 291(u64v)
+             311:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 310 298
+                              Store 291(u64v) 311
+             312:   52(ivec2) Load 278(i64v)
+             313:     18(int) Load 281(i64)
+             314:     18(int) SNegate 313
+             315:     18(int) Load 281(i64)
+             316:   52(ivec2) CompositeConstruct 314 314
+             317:   52(ivec2) CompositeConstruct 315 315
+             318:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 312 316 317
+                              Store 278(i64v) 318
+             319:   52(ivec2) Load 278(i64v)
+             320:   52(ivec2) Load 278(i64v)
+             321:   52(ivec2) SNegate 320
+             322:   52(ivec2) Load 278(i64v)
+             323:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 319 321 322
+                              Store 278(i64v) 323
+             324:  132(ivec3) Load 291(u64v)
+             325:     14(int) Load 293(u64)
+             326:     14(int) SNegate 325
+             327:     14(int) Load 293(u64)
+             328:  132(ivec3) CompositeConstruct 326 326 326
+             329:  132(ivec3) CompositeConstruct 327 327 327
+             330:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 324 328 329
+                              Store 291(u64v) 330
+             331:  132(ivec3) Load 291(u64v)
+             332:  132(ivec3) Load 291(u64v)
+             333:  132(ivec3) SNegate 332
+             334:  132(ivec3) Load 291(u64v)
+             335:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 331 333 334
+                              Store 291(u64v) 335
+             336:     19(ptr) AccessChain 278(i64v) 219
+             337:     18(int) Load 336
+             338:     19(ptr) AccessChain 278(i64v) 202
+             339:     18(int) Load 338
+             341:     18(int) Select 340 339 337
+                              Store 281(i64) 341
+             342:     18(int) Load 281(i64)
+             343:   52(ivec2) CompositeConstruct 342 342
+             344:     18(int) Load 281(i64)
+             345:     18(int) SNegate 344
+             346:   52(ivec2) CompositeConstruct 345 345
+             349:   52(ivec2) Select 348 346 343
+                              Store 278(i64v) 349
+             350:     40(ptr) AccessChain 291(u64v) 219
+             351:     14(int) Load 350
+             352:     40(ptr) AccessChain 291(u64v) 202
+             353:     14(int) Load 352
+             354:     14(int) Select 340 353 351
+                              Store 293(u64) 354
+             355:     14(int) Load 293(u64)
+             356:  132(ivec3) CompositeConstruct 355 355 355
+             357:     14(int) Load 293(u64)
+             358:     14(int) SNegate 357
+             359:  132(ivec3) CompositeConstruct 358 358 358
+             362:  132(ivec3) Select 361 359 356
+                              Store 291(u64v) 362
+             366:  363(fvec3) Load 365(dv)
+             367:   95(fvec2) VectorShuffle 366 366 0 1
+             368:   52(ivec2) Bitcast 367
+                              Store 278(i64v) 368
+             370:    369(ptr) AccessChain 365(dv) 209
+             371:   94(float) Load 370
+             372:     14(int) Bitcast 371
+             373:     40(ptr) AccessChain 291(u64v) 219
+                              Store 373 372
+             374:   52(ivec2) Load 278(i64v)
+             375:   95(fvec2) Bitcast 374
+             376:  363(fvec3) Load 365(dv)
+             377:  363(fvec3) VectorShuffle 376 375 3 4 2
+                              Store 365(dv) 377
+             378:  132(ivec3) Load 291(u64v)
+             379:  363(fvec3) Bitcast 378
+                              Store 365(dv) 379
+             383:     18(int) Bitcast 382
+                              Store 281(i64) 383
+             385:     18(int) Load 281(i64)
+             386:   74(ivec2) Bitcast 385
+                              Store 384(iv) 386
+             388:     14(int) Bitcast 387
+                              Store 293(u64) 388
+             390:     14(int) Load 293(u64)
+             391:   81(ivec2) Bitcast 390
+                              Store 389(uv) 391
+             394:  132(ivec3) Load 291(u64v)
+             395:     14(int) Load 293(u64)
+             396:  132(ivec3) CompositeConstruct 395 395 395
+             397:  360(bvec3) ULessThan 394 396
+                              Store 393(bv) 397
+             398:   52(ivec2) Load 278(i64v)
+             399:     18(int) Load 281(i64)
+             400:   52(ivec2) CompositeConstruct 399 399
+             401:   56(bvec2) SLessThan 398 400
+             402:  360(bvec3) Load 393(bv)
+             403:  360(bvec3) VectorShuffle 402 401 3 4 2
+                              Store 393(bv) 403
+             404:  132(ivec3) Load 291(u64v)
+             405:     14(int) Load 293(u64)
+             406:  132(ivec3) CompositeConstruct 405 405 405
+             407:  360(bvec3) ULessThanEqual 404 406
+                              Store 393(bv) 407
+             408:   52(ivec2) Load 278(i64v)
+             409:     18(int) Load 281(i64)
+             410:   52(ivec2) CompositeConstruct 409 409
+             411:   56(bvec2) SLessThanEqual 408 410
+             412:  360(bvec3) Load 393(bv)
+             413:  360(bvec3) VectorShuffle 412 411 3 4 2
+                              Store 393(bv) 413
+             414:  132(ivec3) Load 291(u64v)
+             415:     14(int) Load 293(u64)
+             416:  132(ivec3) CompositeConstruct 415 415 415
+             417:  360(bvec3) UGreaterThan 414 416
+                              Store 393(bv) 417
+             418:   52(ivec2) Load 278(i64v)
+             419:     18(int) Load 281(i64)
+             420:   52(ivec2) CompositeConstruct 419 419
+             421:   56(bvec2) SGreaterThan 418 420
+             422:  360(bvec3) Load 393(bv)
+             423:  360(bvec3) VectorShuffle 422 421 3 4 2
+                              Store 393(bv) 423
+             424:  132(ivec3) Load 291(u64v)
+             425:     14(int) Load 293(u64)
+             426:  132(ivec3) CompositeConstruct 425 425 425
+             427:  360(bvec3) UGreaterThanEqual 424 426
+                              Store 393(bv) 427
+             428:   52(ivec2) Load 278(i64v)
+             429:     18(int) Load 281(i64)
+             430:   52(ivec2) CompositeConstruct 429 429
+             431:   56(bvec2) SGreaterThanEqual 428 430
+             432:  360(bvec3) Load 393(bv)
+             433:  360(bvec3) VectorShuffle 432 431 3 4 2
+                              Store 393(bv) 433
+             434:  132(ivec3) Load 291(u64v)
+             435:     14(int) Load 293(u64)
+             436:  132(ivec3) CompositeConstruct 435 435 435
+             437:  360(bvec3) IEqual 434 436
+                              Store 393(bv) 437
+             438:   52(ivec2) Load 278(i64v)
+             439:     18(int) Load 281(i64)
+             440:   52(ivec2) CompositeConstruct 439 439
+             441:   56(bvec2) IEqual 438 440
+             442:  360(bvec3) Load 393(bv)
+             443:  360(bvec3) VectorShuffle 442 441 3 4 2
+                              Store 393(bv) 443
+             444:  132(ivec3) Load 291(u64v)
+             445:     14(int) Load 293(u64)
+             446:  132(ivec3) CompositeConstruct 445 445 445
+             447:  360(bvec3) INotEqual 444 446
+                              Store 393(bv) 447
+             448:   52(ivec2) Load 278(i64v)
+             449:     18(int) Load 281(i64)
+             450:   52(ivec2) CompositeConstruct 449 449
+             451:   56(bvec2) INotEqual 448 450
+             452:  360(bvec3) Load 393(bv)
+             453:  360(bvec3) VectorShuffle 452 451 3 4 2
+                              Store 393(bv) 453
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.layoutNested.vert.out b/Test/baseResults/spv.layoutNested.vert.out
index d778fbb..fd785ab 100644
--- a/Test/baseResults/spv.layoutNested.vert.out
+++ b/Test/baseResults/spv.layoutNested.vert.out
@@ -91,13 +91,17 @@
                               Decorate 13 ArrayStride 32
                               MemberDecorate 14(S) 0 Offset 0
                               MemberDecorate 14(S) 1 ColMajor
+                              MemberDecorate 14(S) 1 RelaxedPrecision
                               MemberDecorate 14(S) 1 Offset 16
                               MemberDecorate 14(S) 1 MatrixStride 16
+                              MemberDecorate 14(S) 2 RelaxedPrecision
                               MemberDecorate 14(S) 2 Offset 144
                               Decorate 16 ArrayStride 160
                               Decorate 18 ArrayStride 480
+                              MemberDecorate 19(Block140) 0 RelaxedPrecision
                               MemberDecorate 19(Block140) 0 Offset 0
                               MemberDecorate 19(Block140) 1 Offset 16
+                              MemberDecorate 19(Block140) 2 RelaxedPrecision
                               MemberDecorate 19(Block140) 2 Offset 976
                               Decorate 19(Block140) Block
                               Decorate 21(inst140) DescriptorSet 0
@@ -105,17 +109,23 @@
                               Decorate 22 ArrayStride 16
                               MemberDecorate 23(S) 0 Offset 0
                               MemberDecorate 23(S) 1 ColMajor
+                              MemberDecorate 23(S) 1 RelaxedPrecision
                               MemberDecorate 23(S) 1 Offset 16
                               MemberDecorate 23(S) 1 MatrixStride 8
+                              MemberDecorate 23(S) 2 RelaxedPrecision
                               MemberDecorate 23(S) 2 Offset 80
                               Decorate 24 ArrayStride 96
                               Decorate 25 ArrayStride 288
+                              MemberDecorate 26(Block430) 0 RelaxedPrecision
                               MemberDecorate 26(Block430) 0 Offset 0
                               MemberDecorate 26(Block430) 1 Offset 16
+                              MemberDecorate 26(Block430) 2 RelaxedPrecision
                               MemberDecorate 26(Block430) 2 Offset 592
                               Decorate 26(Block430) BufferBlock
                               Decorate 28(inst430) DescriptorSet 0
                               Decorate 28(inst430) Binding 1
+                              MemberDecorate 29(S) 1 RelaxedPrecision
+                              MemberDecorate 29(S) 2 RelaxedPrecision
                               MemberDecorate 35(T) 0 RowMajor
                               MemberDecorate 35(T) 0 Offset 0
                               MemberDecorate 35(T) 0 MatrixStride 16
@@ -164,7 +174,9 @@
                               Decorate 60(bBtn3) Binding 0
                               Decorate 62(sout) Flat
                               MemberDecorate 63(S) 0 Invariant
+                              MemberDecorate 63(S) 1 RelaxedPrecision
                               MemberDecorate 63(S) 1 Invariant
+                              MemberDecorate 63(S) 2 RelaxedPrecision
                               MemberDecorate 63(S) 2 Invariant
                               Decorate 65(soutinv) Invariant
                2:             TypeVoid
diff --git a/Test/baseResults/spv.multiStruct.comp.out b/Test/baseResults/spv.multiStruct.comp.out
new file mode 100755
index 0000000..28402ce
--- /dev/null
+++ b/Test/baseResults/spv.multiStruct.comp.out
@@ -0,0 +1,268 @@
+spv.multiStruct.comp
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked compute stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 157
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 12  "MyStruct"
+                              MemberName 12(MyStruct) 0  "foo"
+                              MemberName 12(MyStruct) 1  "sb"
+                              Name 14  "t"
+                              Name 16  "MyStruct"
+                              MemberName 16(MyStruct) 0  "foo"
+                              MemberName 16(MyStruct) 1  "sb"
+                              Name 17  "SSBO0"
+                              MemberName 17(SSBO0) 0  "a"
+                              Name 19  "inBuf"
+                              Name 37  "SSBO1"
+                              MemberName 37(SSBO1) 0  "b"
+                              Name 39  "outBuf"
+                              Name 57  "MyStruct"
+                              MemberName 57(MyStruct) 0  "foo"
+                              MemberName 57(MyStruct) 1  "sb"
+                              Name 58  "UBO"
+                              MemberName 58(UBO) 0  "c"
+                              Name 60  "uBuf"
+                              Name 84  "Nested"
+                              MemberName 84(Nested) 0  "f"
+                              MemberName 84(Nested) 1  "S"
+                              Name 86  "n"
+                              Name 88  "Nested"
+                              MemberName 88(Nested) 0  "f"
+                              MemberName 88(Nested) 1  "S"
+                              Name 89  "UBON"
+                              MemberName 89(UBON) 0  "N1"
+                              Name 91  "uBufN"
+                              Name 122  "Nested"
+                              MemberName 122(Nested) 0  "f"
+                              MemberName 122(Nested) 1  "S"
+                              Name 123  "SSBO1N"
+                              MemberName 123(SSBO1N) 0  "N2"
+                              Name 125  "outBufN"
+                              Decorate 15 ArrayStride 8
+                              MemberDecorate 16(MyStruct) 0 Offset 0
+                              MemberDecorate 16(MyStruct) 1 Offset 16
+                              MemberDecorate 17(SSBO0) 0 Offset 0
+                              Decorate 17(SSBO0) BufferBlock
+                              Decorate 19(inBuf) DescriptorSet 0
+                              Decorate 19(inBuf) Binding 0
+                              MemberDecorate 37(SSBO1) 0 Offset 0
+                              Decorate 37(SSBO1) BufferBlock
+                              Decorate 39(outBuf) DescriptorSet 0
+                              Decorate 39(outBuf) Binding 1
+                              Decorate 56 ArrayStride 16
+                              MemberDecorate 57(MyStruct) 0 Offset 0
+                              MemberDecorate 57(MyStruct) 1 Offset 32
+                              MemberDecorate 58(UBO) 0 Offset 0
+                              Decorate 58(UBO) Block
+                              Decorate 60(uBuf) DescriptorSet 0
+                              Decorate 60(uBuf) Binding 2
+                              Decorate 87 ArrayStride 48
+                              MemberDecorate 88(Nested) 0 Offset 0
+                              MemberDecorate 88(Nested) 1 Offset 16
+                              MemberDecorate 89(UBON) 0 Offset 0
+                              Decorate 89(UBON) Block
+                              Decorate 91(uBufN) DescriptorSet 0
+                              Decorate 91(uBufN) Binding 2
+                              Decorate 121 ArrayStride 24
+                              MemberDecorate 122(Nested) 0 Offset 0
+                              MemberDecorate 122(Nested) 1 Offset 8
+                              MemberDecorate 123(SSBO1N) 0 Offset 0
+                              Decorate 123(SSBO1N) BufferBlock
+                              Decorate 125(outBufN) DescriptorSet 0
+                              Decorate 125(outBufN) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeInt 32 0
+               9:      8(int) Constant 2
+              10:             TypeArray 7(fvec2) 9
+              11:             TypeBool
+    12(MyStruct):             TypeStruct 10 11(bool)
+              13:             TypePointer Function 12(MyStruct)
+              15:             TypeArray 7(fvec2) 9
+    16(MyStruct):             TypeStruct 15 8(int)
+       17(SSBO0):             TypeStruct 16(MyStruct)
+              18:             TypePointer Uniform 17(SSBO0)
+       19(inBuf):     18(ptr) Variable Uniform
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypePointer Uniform 16(MyStruct)
+              26:             TypePointer Function 10
+              29:             TypePointer Function 7(fvec2)
+              32:     20(int) Constant 1
+              35:             TypePointer Function 11(bool)
+       37(SSBO1):             TypeStruct 16(MyStruct)
+              38:             TypePointer Uniform 37(SSBO1)
+      39(outBuf):     38(ptr) Variable Uniform
+              43:             TypePointer Uniform 15
+              46:             TypePointer Uniform 7(fvec2)
+              51:      8(int) Constant 0
+              52:      8(int) Constant 1
+              54:             TypePointer Uniform 8(int)
+              56:             TypeArray 7(fvec2) 9
+    57(MyStruct):             TypeStruct 56 8(int)
+         58(UBO):             TypeStruct 57(MyStruct)
+              59:             TypePointer Uniform 58(UBO)
+        60(uBuf):     59(ptr) Variable Uniform
+              61:             TypePointer Uniform 57(MyStruct)
+              83:             TypeArray 12(MyStruct) 9
+      84(Nested):             TypeStruct 6(float) 83
+              85:             TypePointer Function 84(Nested)
+              87:             TypeArray 57(MyStruct) 9
+      88(Nested):             TypeStruct 6(float) 87
+        89(UBON):             TypeStruct 88(Nested)
+              90:             TypePointer Uniform 89(UBON)
+       91(uBufN):     90(ptr) Variable Uniform
+              92:             TypePointer Uniform 88(Nested)
+              96:             TypePointer Function 6(float)
+              99:             TypePointer Function 83
+             121:             TypeArray 16(MyStruct) 9
+     122(Nested):             TypeStruct 6(float) 121
+     123(SSBO1N):             TypeStruct 122(Nested)
+             124:             TypePointer Uniform 123(SSBO1N)
+    125(outBufN):    124(ptr) Variable Uniform
+             127:             TypePointer Uniform 122(Nested)
+             130:             TypePointer Uniform 6(float)
+             133:             TypePointer Uniform 121
+         4(main):           2 Function None 3
+               5:             Label
+           14(t):     13(ptr) Variable Function
+           86(n):     85(ptr) Variable Function
+              23:     22(ptr) AccessChain 19(inBuf) 21
+              24:16(MyStruct) Load 23
+              25:          15 CompositeExtract 24 0
+              27:     26(ptr) AccessChain 14(t) 21
+              28:    7(fvec2) CompositeExtract 25 0
+              30:     29(ptr) AccessChain 27 21
+                              Store 30 28
+              31:    7(fvec2) CompositeExtract 25 1
+              33:     29(ptr) AccessChain 27 32
+                              Store 33 31
+              34:      8(int) CompositeExtract 24 1
+              36:     35(ptr) AccessChain 14(t) 32
+                              Store 36 34
+              40:12(MyStruct) Load 14(t)
+              41:     22(ptr) AccessChain 39(outBuf) 21
+              42:          10 CompositeExtract 40 0
+              44:     43(ptr) AccessChain 41 21
+              45:    7(fvec2) CompositeExtract 42 0
+              47:     46(ptr) AccessChain 44 21
+                              Store 47 45
+              48:    7(fvec2) CompositeExtract 42 1
+              49:     46(ptr) AccessChain 44 32
+                              Store 49 48
+              50:    11(bool) CompositeExtract 40 1
+              53:      8(int) Select 50 52 51
+              55:     54(ptr) AccessChain 41 32
+                              Store 55 53
+              62:     61(ptr) AccessChain 60(uBuf) 21
+              63:57(MyStruct) Load 62
+              64:          56 CompositeExtract 63 0
+              65:     26(ptr) AccessChain 14(t) 21
+              66:    7(fvec2) CompositeExtract 64 0
+              67:     29(ptr) AccessChain 65 21
+                              Store 67 66
+              68:    7(fvec2) CompositeExtract 64 1
+              69:     29(ptr) AccessChain 65 32
+                              Store 69 68
+              70:      8(int) CompositeExtract 63 1
+              71:     35(ptr) AccessChain 14(t) 32
+                              Store 71 70
+              72:12(MyStruct) Load 14(t)
+              73:     22(ptr) AccessChain 39(outBuf) 21
+              74:          10 CompositeExtract 72 0
+              75:     43(ptr) AccessChain 73 21
+              76:    7(fvec2) CompositeExtract 74 0
+              77:     46(ptr) AccessChain 75 21
+                              Store 77 76
+              78:    7(fvec2) CompositeExtract 74 1
+              79:     46(ptr) AccessChain 75 32
+                              Store 79 78
+              80:    11(bool) CompositeExtract 72 1
+              81:      8(int) Select 80 52 51
+              82:     54(ptr) AccessChain 73 32
+                              Store 82 81
+              93:     92(ptr) AccessChain 91(uBufN) 21
+              94:  88(Nested) Load 93
+              95:    6(float) CompositeExtract 94 0
+              97:     96(ptr) AccessChain 86(n) 21
+                              Store 97 95
+              98:          87 CompositeExtract 94 1
+             100:     99(ptr) AccessChain 86(n) 32
+             101:57(MyStruct) CompositeExtract 98 0
+             102:     13(ptr) AccessChain 100 21
+             103:          56 CompositeExtract 101 0
+             104:     26(ptr) AccessChain 102 21
+             105:    7(fvec2) CompositeExtract 103 0
+             106:     29(ptr) AccessChain 104 21
+                              Store 106 105
+             107:    7(fvec2) CompositeExtract 103 1
+             108:     29(ptr) AccessChain 104 32
+                              Store 108 107
+             109:      8(int) CompositeExtract 101 1
+             110:     35(ptr) AccessChain 102 32
+                              Store 110 109
+             111:57(MyStruct) CompositeExtract 98 1
+             112:     13(ptr) AccessChain 100 32
+             113:          56 CompositeExtract 111 0
+             114:     26(ptr) AccessChain 112 21
+             115:    7(fvec2) CompositeExtract 113 0
+             116:     29(ptr) AccessChain 114 21
+                              Store 116 115
+             117:    7(fvec2) CompositeExtract 113 1
+             118:     29(ptr) AccessChain 114 32
+                              Store 118 117
+             119:      8(int) CompositeExtract 111 1
+             120:     35(ptr) AccessChain 112 32
+                              Store 120 119
+             126:  84(Nested) Load 86(n)
+             128:    127(ptr) AccessChain 125(outBufN) 21
+             129:    6(float) CompositeExtract 126 0
+             131:    130(ptr) AccessChain 128 21
+                              Store 131 129
+             132:          83 CompositeExtract 126 1
+             134:    133(ptr) AccessChain 128 32
+             135:12(MyStruct) CompositeExtract 132 0
+             136:     22(ptr) AccessChain 134 21
+             137:          10 CompositeExtract 135 0
+             138:     43(ptr) AccessChain 136 21
+             139:    7(fvec2) CompositeExtract 137 0
+             140:     46(ptr) AccessChain 138 21
+                              Store 140 139
+             141:    7(fvec2) CompositeExtract 137 1
+             142:     46(ptr) AccessChain 138 32
+                              Store 142 141
+             143:    11(bool) CompositeExtract 135 1
+             144:      8(int) Select 143 52 51
+             145:     54(ptr) AccessChain 136 32
+                              Store 145 144
+             146:12(MyStruct) CompositeExtract 132 1
+             147:     22(ptr) AccessChain 134 32
+             148:          10 CompositeExtract 146 0
+             149:     43(ptr) AccessChain 147 21
+             150:    7(fvec2) CompositeExtract 148 0
+             151:     46(ptr) AccessChain 149 21
+                              Store 151 150
+             152:    7(fvec2) CompositeExtract 148 1
+             153:     46(ptr) AccessChain 149 32
+                              Store 153 152
+             154:    11(bool) CompositeExtract 146 1
+             155:      8(int) Select 154 52 51
+             156:     54(ptr) AccessChain 147 32
+                              Store 156 155
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.multiStructFuncall.frag.out b/Test/baseResults/spv.multiStructFuncall.frag.out
new file mode 100755
index 0000000..dcbcfa0
--- /dev/null
+++ b/Test/baseResults/spv.multiStructFuncall.frag.out
@@ -0,0 +1,120 @@
+spv.multiStructFuncall.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// 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 Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "S"
+                              MemberName 9(S) 0  "m"
+                              Name 12  "fooConst(struct-S-mf441;"
+                              Name 11  "s"
+                              Name 17  "foo(struct-S-mf441;"
+                              Name 16  "s"
+                              Name 20  "fooOut(struct-S-mf441;"
+                              Name 19  "s"
+                              Name 22  "S"
+                              MemberName 22(S) 0  "m"
+                              Name 23  "blockName"
+                              MemberName 23(blockName) 0  "s1"
+                              Name 25  ""
+                              Name 33  "s2"
+                              Name 36  "S"
+                              MemberName 36(S) 0  "m"
+                              Name 38  "param"
+                              Name 45  "param"
+                              Name 48  "param"
+                              Name 59  "param"
+                              MemberDecorate 22(S) 0 ColMajor
+                              MemberDecorate 22(S) 0 Offset 0
+                              MemberDecorate 22(S) 0 MatrixStride 16
+                              MemberDecorate 23(blockName) 0 Offset 0
+                              Decorate 23(blockName) BufferBlock
+                              Decorate 25 DescriptorSet 0
+                              MemberDecorate 36(S) 0 ColMajor
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeMatrix 7(fvec4) 4
+            9(S):             TypeStruct 8
+              10:             TypeFunction 2 9(S)
+              14:             TypePointer Function 9(S)
+              15:             TypeFunction 2 14(ptr)
+           22(S):             TypeStruct 8
+   23(blockName):             TypeStruct 22(S)
+              24:             TypePointer Uniform 23(blockName)
+              25:     24(ptr) Variable Uniform
+              26:             TypeInt 32 1
+              27:     26(int) Constant 0
+              28:             TypePointer Uniform 22(S)
+              32:             TypePointer Private 9(S)
+          33(s2):     32(ptr) Variable Private
+           36(S):             TypeStruct 8
+              37:             TypePointer Function 36(S)
+              42:             TypePointer Function 8
+              57:             TypePointer Uniform 8
+         4(main):           2 Function None 3
+               5:             Label
+       38(param):     37(ptr) Variable Function
+       45(param):     14(ptr) Variable Function
+       48(param):     37(ptr) Variable Function
+       59(param):     14(ptr) Variable Function
+              29:     28(ptr) AccessChain 25 27
+              30:       22(S) Load 29
+              31:           2 FunctionCall 12(fooConst(struct-S-mf441;) 30
+              34:        9(S) Load 33(s2)
+              35:           2 FunctionCall 12(fooConst(struct-S-mf441;) 34
+              39:     28(ptr) AccessChain 25 27
+              40:       22(S) Load 39
+              41:           8 CompositeExtract 40 0
+              43:     42(ptr) AccessChain 38(param) 27
+                              Store 43 41
+              44:           2 FunctionCall 17(foo(struct-S-mf441;) 38(param)
+              46:        9(S) Load 33(s2)
+                              Store 45(param) 46
+              47:           2 FunctionCall 17(foo(struct-S-mf441;) 45(param)
+              49:     28(ptr) AccessChain 25 27
+              50:       22(S) Load 49
+              51:           8 CompositeExtract 50 0
+              52:     42(ptr) AccessChain 48(param) 27
+                              Store 52 51
+              53:           2 FunctionCall 20(fooOut(struct-S-mf441;) 48(param)
+              54:       36(S) Load 48(param)
+              55:     28(ptr) AccessChain 25 27
+              56:           8 CompositeExtract 54 0
+              58:     57(ptr) AccessChain 55 27
+                              Store 58 56
+              60:        9(S) Load 33(s2)
+                              Store 59(param) 60
+              61:           2 FunctionCall 20(fooOut(struct-S-mf441;) 59(param)
+              62:        9(S) Load 59(param)
+                              Store 33(s2) 62
+                              Return
+                              FunctionEnd
+12(fooConst(struct-S-mf441;):           2 Function None 10
+           11(s):        9(S) FunctionParameter
+              13:             Label
+                              Return
+                              FunctionEnd
+17(foo(struct-S-mf441;):           2 Function None 15
+           16(s):     14(ptr) FunctionParameter
+              18:             Label
+                              Return
+                              FunctionEnd
+20(fooOut(struct-S-mf441;):           2 Function None 15
+           19(s):     14(ptr) FunctionParameter
+              21:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.specConstant.vert.out b/Test/baseResults/spv.specConstant.vert.out
index fb7c70a..edda4a7 100644
--- a/Test/baseResults/spv.specConstant.vert.out
+++ b/Test/baseResults/spv.specConstant.vert.out
@@ -61,6 +61,7 @@
               38:             TypeFloat 64
               39:   38(float) SpecConstant 1413754136 1074340347
               40:    6(float) SpecConstant 1078523331
+              41:   38(float) SpecConstantOp 115 40
               50:      8(int) SpecConstant 12
               51:             TypeArray 7(fvec4) 50
               52:             TypePointer Input 51
@@ -69,6 +70,7 @@
               63:     33(int) SpecConstant 2
               67:   38(float) SpecConstant 1413754136 1074340347
               68:    6(float) SpecConstant 1078523331
+              69:   38(float) SpecConstantOp 115 68
               75:             TypePointer Function 8(int)
               77:      8(int) SpecConstant 8
          4(main):           2 Function None 3
@@ -87,7 +89,6 @@
                                 Store 20(color) 37
                                 Branch 32
               32:             Label
-              41:   38(float) FConvert 40
               42:   38(float) FDiv 39 41
               43:    6(float) FConvert 42
               44:    7(fvec4) Load 20(color)
@@ -119,7 +120,6 @@
                                 Store 20(color) 66
                                 Branch 62
               62:             Label
-              69:   38(float) FConvert 68
               70:   38(float) FDiv 67 69
               71:    6(float) FConvert 70
               72:    7(fvec4) Load 20(color)
diff --git a/Test/baseResults/spv.specConstantOperations.vert.out b/Test/baseResults/spv.specConstantOperations.vert.out
index ea4c69a..ab42558 100644
--- a/Test/baseResults/spv.specConstantOperations.vert.out
+++ b/Test/baseResults/spv.specConstantOperations.vert.out
@@ -7,9 +7,10 @@
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 131
+// Id's are bound by 135
 
                               Capability Shader
+                              Capability Float64
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Vertex 4  "main"
@@ -22,6 +23,7 @@
                               Decorate 40 SpecId 200
                               Decorate 42 SpecId 202
                               Decorate 43 SpecId 203
+                              Decorate 45 SpecId 204
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -43,93 +45,97 @@
               41:             TypeInt 32 0
               42:     41(int) SpecConstant 100
               43:      6(int) SpecConstant 4294967286
-              44:     41(int) Constant 0
-              45:    22(bool) SpecConstantOp 171 19 44
-              46:    22(bool) SpecConstantOp 171 42 44
-              47:      6(int) SpecConstantOp 169 45 32 12
-              48:     41(int) Constant 1
-              49:     41(int) SpecConstantOp 169 45 48 44
-              50:     41(int) SpecConstantOp 128 43 44
-              51:      6(int) SpecConstantOp 128 42 44
-              52:      6(int) SpecConstantOp 126 19
-              53:      6(int) SpecConstantOp 200 19
-              54:      6(int) SpecConstantOp 128 19 20
-              55:      6(int) SpecConstantOp 128 19 20
-              56:      6(int) Constant 3
-              57:      6(int) SpecConstantOp 130 55 56
-              58:      6(int) Constant 4
-              59:      6(int) SpecConstantOp 130 54 58
-              60:      6(int) SpecConstantOp 132 43 20
-              61:     41(int) Constant 2
-              62:     41(int) SpecConstantOp 132 42 61
-              63:      6(int) Constant 5
-              64:      6(int) SpecConstantOp 135 60 63
-              65:     41(int) Constant 5
-              66:     41(int) SpecConstantOp 134 62 65
-              67:      6(int) SpecConstantOp 139 43 58
-              68:     41(int) Constant 4
-              69:     41(int) SpecConstantOp 137 42 68
-              70:      6(int) SpecConstantOp 132 43 56
-              71:      6(int) SpecConstantOp 135 70 63
-              72:      6(int) Constant 10
-              73:      6(int) SpecConstantOp 195 43 72
-              74:      6(int) Constant 20
-              75:     41(int) SpecConstantOp 194 42 74
-              76:      6(int) SpecConstantOp 196 43 32
-              77:     41(int) SpecConstantOp 196 42 20
-              78:      6(int) Constant 256
-              79:      6(int) SpecConstantOp 197 43 78
-              80:     41(int) Constant 512
-              81:     41(int) SpecConstantOp 198 42 80
-              82:    22(bool) SpecConstantOp 177 19 43
-              83:    22(bool) SpecConstantOp 170 42 42
-              84:    22(bool) SpecConstantOp 173 19 43
-              85:      6(int) Constant 30
-              86:             TypeVector 6(int) 4
-              87:   86(ivec4) SpecConstantComposite 74 85 19 19
-              88:     41(int) Constant 4294967295
-              89:     41(int) Constant 4294967294
-              90:             TypeVector 41(int) 4
-              91:   90(ivec4) SpecConstantComposite 42 42 88 89
-              92:             TypeVector 22(bool) 4
-              93:   90(ivec4) ConstantComposite 44 44 44 44
-              94:   92(bvec4) SpecConstantOp 171 87 93
-              95:   92(bvec4) SpecConstantOp 171 91 93
-              96:   86(ivec4) ConstantComposite 12 12 12 12
-              97:   86(ivec4) ConstantComposite 32 32 32 32
-              98:   86(ivec4) SpecConstantOp 169 94 97 96
-              99:   90(ivec4) ConstantComposite 48 48 48 48
-             100:   90(ivec4) SpecConstantOp 169 94 99 93
-             101:   90(ivec4) SpecConstantOp 128 87 93
-             102:   86(ivec4) SpecConstantOp 128 91 93
-             103:   86(ivec4) SpecConstantOp 200 87
-             104:   86(ivec4) SpecConstantOp 126 87
-             105:   86(ivec4) ConstantComposite 20 20 20 20
-             106:   86(ivec4) SpecConstantOp 128 87 105
-             107:   86(ivec4) SpecConstantOp 128 87 105
-             108:   86(ivec4) ConstantComposite 56 56 56 56
-             109:   86(ivec4) SpecConstantOp 130 107 108
-             110:   86(ivec4) ConstantComposite 58 58 58 58
-             111:   86(ivec4) SpecConstantOp 130 109 110
-             112:   86(ivec4) SpecConstantOp 132 87 105
-             113:   86(ivec4) ConstantComposite 63 63 63 63
-             114:   86(ivec4) SpecConstantOp 135 112 113
-             115:   86(ivec4) SpecConstantOp 139 87 110
-             116:   86(ivec4) ConstantComposite 72 72 72 72
-             117:   86(ivec4) SpecConstantOp 195 87 116
-             118:   86(ivec4) SpecConstantOp 196 87 105
-             119:      6(int) Constant 1024
-             120:   86(ivec4) ConstantComposite 119 119 119 119
-             121:   86(ivec4) SpecConstantOp 197 87 120
-             122:     41(int) Constant 2048
-             123:   90(ivec4) ConstantComposite 122 122 122 122
-             124:   90(ivec4) SpecConstantOp 198 91 123
-             125:      6(int) SpecConstantOp 81 87 0
-             126:             TypeVector 6(int) 2
-             127:  126(ivec2) SpecConstantOp 79 87 87 1(GLSL.std.450) 0
-             128:             TypeVector 6(int) 3
-             129:  128(ivec3) SpecConstantOp 79 87 87 2 1(GLSL.std.450) 0
-             130:   86(ivec4) SpecConstantOp 79 87 87 1(GLSL.std.450) 2 0 3
+              44:             TypeFloat 64
+              45:   44(float) SpecConstant 2333366019 1074118410
+              46:   39(float) SpecConstantOp 115 45
+              47:   44(float) SpecConstantOp 115 40
+              48:     41(int) Constant 0
+              49:    22(bool) SpecConstantOp 171 19 48
+              50:    22(bool) SpecConstantOp 171 42 48
+              51:      6(int) SpecConstantOp 169 49 32 12
+              52:     41(int) Constant 1
+              53:     41(int) SpecConstantOp 169 49 52 48
+              54:     41(int) SpecConstantOp 128 43 48
+              55:      6(int) SpecConstantOp 128 42 48
+              56:      6(int) SpecConstantOp 126 19
+              57:      6(int) SpecConstantOp 200 19
+              58:      6(int) SpecConstantOp 128 19 20
+              59:      6(int) SpecConstantOp 128 19 20
+              60:      6(int) Constant 3
+              61:      6(int) SpecConstantOp 130 59 60
+              62:      6(int) Constant 4
+              63:      6(int) SpecConstantOp 130 58 62
+              64:      6(int) SpecConstantOp 132 43 20
+              65:     41(int) Constant 2
+              66:     41(int) SpecConstantOp 132 42 65
+              67:      6(int) Constant 5
+              68:      6(int) SpecConstantOp 135 64 67
+              69:     41(int) Constant 5
+              70:     41(int) SpecConstantOp 134 66 69
+              71:      6(int) SpecConstantOp 139 43 62
+              72:     41(int) Constant 4
+              73:     41(int) SpecConstantOp 137 42 72
+              74:      6(int) SpecConstantOp 132 43 60
+              75:      6(int) SpecConstantOp 135 74 67
+              76:      6(int) Constant 10
+              77:      6(int) SpecConstantOp 195 43 76
+              78:      6(int) Constant 20
+              79:     41(int) SpecConstantOp 194 42 78
+              80:      6(int) SpecConstantOp 196 43 32
+              81:     41(int) SpecConstantOp 196 42 20
+              82:      6(int) Constant 256
+              83:      6(int) SpecConstantOp 197 43 82
+              84:     41(int) Constant 512
+              85:     41(int) SpecConstantOp 198 42 84
+              86:    22(bool) SpecConstantOp 177 19 43
+              87:    22(bool) SpecConstantOp 170 42 42
+              88:    22(bool) SpecConstantOp 173 19 43
+              89:      6(int) Constant 30
+              90:             TypeVector 6(int) 4
+              91:   90(ivec4) SpecConstantComposite 78 89 19 19
+              92:     41(int) Constant 4294967295
+              93:     41(int) Constant 4294967294
+              94:             TypeVector 41(int) 4
+              95:   94(ivec4) SpecConstantComposite 42 42 92 93
+              96:             TypeVector 22(bool) 4
+              97:   94(ivec4) ConstantComposite 48 48 48 48
+              98:   96(bvec4) SpecConstantOp 171 91 97
+              99:   96(bvec4) SpecConstantOp 171 95 97
+             100:   90(ivec4) ConstantComposite 12 12 12 12
+             101:   90(ivec4) ConstantComposite 32 32 32 32
+             102:   90(ivec4) SpecConstantOp 169 98 101 100
+             103:   94(ivec4) ConstantComposite 52 52 52 52
+             104:   94(ivec4) SpecConstantOp 169 98 103 97
+             105:   94(ivec4) SpecConstantOp 128 91 97
+             106:   90(ivec4) SpecConstantOp 128 95 97
+             107:   90(ivec4) SpecConstantOp 200 91
+             108:   90(ivec4) SpecConstantOp 126 91
+             109:   90(ivec4) ConstantComposite 20 20 20 20
+             110:   90(ivec4) SpecConstantOp 128 91 109
+             111:   90(ivec4) SpecConstantOp 128 91 109
+             112:   90(ivec4) ConstantComposite 60 60 60 60
+             113:   90(ivec4) SpecConstantOp 130 111 112
+             114:   90(ivec4) ConstantComposite 62 62 62 62
+             115:   90(ivec4) SpecConstantOp 130 113 114
+             116:   90(ivec4) SpecConstantOp 132 91 109
+             117:   90(ivec4) ConstantComposite 67 67 67 67
+             118:   90(ivec4) SpecConstantOp 135 116 117
+             119:   90(ivec4) SpecConstantOp 139 91 114
+             120:   90(ivec4) ConstantComposite 76 76 76 76
+             121:   90(ivec4) SpecConstantOp 195 91 120
+             122:   90(ivec4) SpecConstantOp 196 91 109
+             123:      6(int) Constant 1024
+             124:   90(ivec4) ConstantComposite 123 123 123 123
+             125:   90(ivec4) SpecConstantOp 197 91 124
+             126:     41(int) Constant 2048
+             127:   94(ivec4) ConstantComposite 126 126 126 126
+             128:   94(ivec4) SpecConstantOp 198 95 127
+             129:      6(int) SpecConstantOp 81 91 0
+             130:             TypeVector 6(int) 2
+             131:  130(ivec2) SpecConstantOp 79 91 91 1(GLSL.std.450) 0
+             132:             TypeVector 6(int) 3
+             133:  132(ivec3) SpecConstantOp 79 91 91 2 1(GLSL.std.450) 0
+             134:   90(ivec4) SpecConstantOp 79 91 91 1(GLSL.std.450) 2 0 3
          4(main):           2 Function None 3
                5:             Label
                               Return
diff --git a/Test/baseResults/spv.structAssignment.frag.out b/Test/baseResults/spv.structAssignment.frag.out
index 7c28e10..abff683 100755
--- a/Test/baseResults/spv.structAssignment.frag.out
+++ b/Test/baseResults/spv.structAssignment.frag.out
@@ -1,4 +1,7 @@
 spv.structAssignment.frag
+WARNING: 0:6: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
+         "precision mediump int; precision highp float;" 
+
 
 Linked fragment stage:
 
@@ -33,7 +36,13 @@
                               Name 40  "samp2D"
                               Name 44  "coord"
                               Name 49  "foo"
+                              MemberDecorate 8(lunarStruct1) 0 RelaxedPrecision
+                              MemberDecorate 9(lunarStruct2) 0 RelaxedPrecision
+                              MemberDecorate 10(lunarStruct3) 1 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
                               Decorate 40(samp2D) DescriptorSet 0
+                              Decorate 44(coord) RelaxedPrecision
+                              Decorate 45 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.uint.frag.out b/Test/baseResults/spv.uint.frag.out
index 7d934ff..6682e7c 100755
--- a/Test/baseResults/spv.uint.frag.out
+++ b/Test/baseResults/spv.uint.frag.out
@@ -7,12 +7,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 207
+// Id's are bound by 213
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 15 68 77 200 202 204
+                              EntryPoint Fragment 4  "main" 15 68 77 206 208 210
                               ExecutionMode 4 OriginUpperLeft
                               Source ESSL 310
                               Name 4  "main"
@@ -33,10 +33,10 @@
                               Name 154  "mask2"
                               Name 156  "mask3"
                               Name 160  "mask4"
-                              Name 200  "f"
-                              Name 202  "v"
-                              Name 204  "i"
-                              Name 206  "b"
+                              Name 206  "f"
+                              Name 208  "v"
+                              Name 210  "i"
+                              Name 212  "b"
                               Decorate 8(count) RelaxedPrecision
                               Decorate 12(u) RelaxedPrecision
                               Decorate 15(t) RelaxedPrecision
@@ -138,11 +138,13 @@
                               Decorate 196 RelaxedPrecision
                               Decorate 197 RelaxedPrecision
                               Decorate 198 RelaxedPrecision
-                              Decorate 200(f) RelaxedPrecision
-                              Decorate 202(v) RelaxedPrecision
-                              Decorate 202(v) Flat
-                              Decorate 204(i) RelaxedPrecision
-                              Decorate 204(i) Flat
+                              Decorate 202 RelaxedPrecision
+                              Decorate 203 RelaxedPrecision
+                              Decorate 206(f) RelaxedPrecision
+                              Decorate 208(v) RelaxedPrecision
+                              Decorate 208(v) Flat
+                              Decorate 210(i) RelaxedPrecision
+                              Decorate 210(i) Flat
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -193,14 +195,16 @@
              155:     10(int) Constant 2576
              158:      6(int) Constant 4
              161:     10(int) Constant 2737
-             199:             TypePointer Input 74(float)
-          200(f):    199(ptr) Variable Input
-             201:             TypePointer Input 66(ivec4)
-          202(v):    201(ptr) Variable Input
-             203:             TypePointer Input 6(int)
-          204(i):    203(ptr) Variable Input
-             205:             TypePointer Private 22(bool)
-          206(b):    205(ptr) Variable Private
+             199:     10(int) Constant 4294967295
+             200:             TypePointer Output 10(int)
+             205:             TypePointer Input 74(float)
+          206(f):    205(ptr) Variable Input
+             207:             TypePointer Input 66(ivec4)
+          208(v):    207(ptr) Variable Input
+             209:             TypePointer Input 6(int)
+          210(i):    209(ptr) Variable Input
+             211:             TypePointer Private 22(bool)
+          212(b):    211(ptr) Variable Private
          4(main):           2 Function None 3
                5:             Label
         8(count):      7(ptr) Variable Function
@@ -434,5 +438,10 @@
              197:   66(ivec4) Load 68(c)
              198:   66(ivec4) IAdd 197 196
                               Store 68(c) 198
+             201:    200(ptr) AccessChain 68(c) 103
+             202:     10(int) Load 201
+             203:     10(int) IAdd 202 199
+             204:    200(ptr) AccessChain 68(c) 103
+                              Store 204 203
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/vulkan.ast.vert.out b/Test/baseResults/vulkan.ast.vert.out
index 31ac494..f245585 100755
--- a/Test/baseResults/vulkan.ast.vert.out
+++ b/Test/baseResults/vulkan.ast.vert.out
@@ -7,76 +7,76 @@
 0:7    Function Parameters: 
 0:9    Sequence
 0:9      Convert float to bool (temp bool)
-0:9        'scf1' (specialization-constant const float)
+0:9        'scf1' (specialization-constant const highp float)
 0:9          1.000000
 0:10      Construct bool (specialization-constant const bool)
 0:10        'scbt' (specialization-constant const bool)
 0:10          true (const bool)
 0:11      Convert int to bool (specialization-constant const bool)
-0:11        'sci2' (specialization-constant const int)
+0:11        'sci2' (specialization-constant const highp int)
 0:11          2 (const int)
 0:13      Construct float (temp float)
-0:13        'scf1' (specialization-constant const float)
+0:13        'scf1' (specialization-constant const highp float)
 0:13          1.000000
 0:14      Convert bool to float (temp float)
 0:14        'scbt' (specialization-constant const bool)
 0:14          true (const bool)
 0:15      Convert int to float (temp float)
-0:15        'sci2' (specialization-constant const int)
+0:15        'sci2' (specialization-constant const highp int)
 0:15          2 (const int)
 0:17      Convert float to int (temp int)
-0:17        'scf1' (specialization-constant const float)
+0:17        'scf1' (specialization-constant const highp float)
 0:17          1.000000
 0:18      Convert bool to int (specialization-constant const int)
 0:18        'scbt' (specialization-constant const bool)
 0:18          true (const bool)
 0:19      Construct int (specialization-constant const int)
-0:19        'sci2' (specialization-constant const int)
+0:19        'sci2' (specialization-constant const highp int)
 0:19          2 (const int)
-0:21      component-wise multiply (temp float)
-0:21        'scf1' (specialization-constant const float)
+0:21      component-wise multiply (temp highp float)
+0:21        'scf1' (specialization-constant const highp float)
 0:21          1.000000
-0:21        'scf1' (specialization-constant const float)
+0:21        'scf1' (specialization-constant const highp float)
 0:21          1.000000
 0:22      logical-or (specialization-constant const bool)
 0:22        'scbt' (specialization-constant const bool)
 0:22          true (const bool)
 0:22        'scbt' (specialization-constant const bool)
 0:22          true (const bool)
-0:23      component-wise multiply (specialization-constant const int)
-0:23        'sci2' (specialization-constant const int)
+0:23      component-wise multiply (specialization-constant const highp int)
+0:23        'sci2' (specialization-constant const highp int)
 0:23          2 (const int)
-0:23        'sci2' (specialization-constant const int)
+0:23        'sci2' (specialization-constant const highp int)
 0:23          2 (const int)
-0:24      add (temp float)
-0:24        'scf1' (specialization-constant const float)
+0:24      add (temp highp float)
+0:24        'scf1' (specialization-constant const highp float)
 0:24          1.000000
-0:24        Convert int to float (temp float)
-0:24          'sci2' (specialization-constant const int)
+0:24        Convert int to float (temp highp float)
+0:24          'sci2' (specialization-constant const highp int)
 0:24            2 (const int)
-0:26      Negate value (temp float)
-0:26        'scf1' (specialization-constant const float)
+0:26      Negate value (temp highp float)
+0:26        'scf1' (specialization-constant const highp float)
 0:26          1.000000
 0:27      Negate conditional (specialization-constant const bool)
 0:27        'scbt' (specialization-constant const bool)
 0:27          true (const bool)
-0:28      Negate value (specialization-constant const int)
-0:28        'sci2' (specialization-constant const int)
+0:28      Negate value (specialization-constant const highp int)
+0:28        'sci2' (specialization-constant const highp int)
 0:28          2 (const int)
 0:30      Compare Greater Than (temp bool)
-0:30        'scf1' (specialization-constant const float)
+0:30        'scf1' (specialization-constant const highp float)
 0:30          1.000000
-0:30        'scf1' (specialization-constant const float)
+0:30        'scf1' (specialization-constant const highp float)
 0:30          1.000000
 0:31      Compare Greater Than (specialization-constant const bool)
-0:31        'sci2' (specialization-constant const int)
+0:31        'sci2' (specialization-constant const highp int)
 0:31          2 (const int)
-0:31        'sci2' (specialization-constant const int)
+0:31        'sci2' (specialization-constant const highp int)
 0:31          2 (const int)
 0:33      Compare Not Equal (temp bool)
-0:33        'scf1' (specialization-constant const float)
+0:33        'scf1' (specialization-constant const highp float)
 0:33          1.000000
-0:33        'scf1' (specialization-constant const float)
+0:33        'scf1' (specialization-constant const highp float)
 0:33          1.000000
 0:34      Compare Not Equal (specialization-constant const bool)
 0:34        'scbt' (specialization-constant const bool)
@@ -84,48 +84,48 @@
 0:34        'scbt' (specialization-constant const bool)
 0:34          true (const bool)
 0:35      Compare Not Equal (specialization-constant const bool)
-0:35        'sci2' (specialization-constant const int)
+0:35        'sci2' (specialization-constant const highp int)
 0:35          2 (const int)
-0:35        'sci2' (specialization-constant const int)
+0:35        'sci2' (specialization-constant const highp int)
 0:35          2 (const int)
 0:37      Construct ivec2 (specialization-constant const 2-component vector of int)
-0:37        'sci2' (specialization-constant const int)
+0:37        'sci2' (specialization-constant const highp int)
 0:37          2 (const int)
-0:37        'sci2' (specialization-constant const int)
+0:37        'sci2' (specialization-constant const highp int)
 0:37          2 (const int)
 0:38      Construct ivec2 (temp 2-element array of 2-component vector of int)
 0:38        Construct ivec2 (specialization-constant const 2-component vector of int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
 0:38        Construct ivec2 (specialization-constant const 2-component vector of int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
 0:40      Construct vec2 (temp 2-component vector of float)
-0:40        'scf1' (specialization-constant const float)
+0:40        'scf1' (specialization-constant const highp float)
 0:40          1.000000
-0:40        'scf1' (specialization-constant const float)
+0:40        'scf1' (specialization-constant const highp float)
 0:40          1.000000
 0:41      Construct vec2 (temp 2-element array of 2-component vector of float)
 0:41        Construct vec2 (temp 2-component vector of float)
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
 0:41        Construct vec2 (temp 2-component vector of float)
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
 0:?   Linker Objects
-0:?     'scf1' (specialization-constant const float)
+0:?     'scf1' (specialization-constant const highp float)
 0:?       1.000000
 0:?     'scbt' (specialization-constant const bool)
 0:?       true (const bool)
-0:?     'sci2' (specialization-constant const int)
+0:?     'sci2' (specialization-constant const highp int)
 0:?       2 (const int)
 
 
@@ -138,76 +138,76 @@
 0:7    Function Parameters: 
 0:9    Sequence
 0:9      Convert float to bool (temp bool)
-0:9        'scf1' (specialization-constant const float)
+0:9        'scf1' (specialization-constant const highp float)
 0:9          1.000000
 0:10      Construct bool (specialization-constant const bool)
 0:10        'scbt' (specialization-constant const bool)
 0:10          true (const bool)
 0:11      Convert int to bool (specialization-constant const bool)
-0:11        'sci2' (specialization-constant const int)
+0:11        'sci2' (specialization-constant const highp int)
 0:11          2 (const int)
 0:13      Construct float (temp float)
-0:13        'scf1' (specialization-constant const float)
+0:13        'scf1' (specialization-constant const highp float)
 0:13          1.000000
 0:14      Convert bool to float (temp float)
 0:14        'scbt' (specialization-constant const bool)
 0:14          true (const bool)
 0:15      Convert int to float (temp float)
-0:15        'sci2' (specialization-constant const int)
+0:15        'sci2' (specialization-constant const highp int)
 0:15          2 (const int)
 0:17      Convert float to int (temp int)
-0:17        'scf1' (specialization-constant const float)
+0:17        'scf1' (specialization-constant const highp float)
 0:17          1.000000
 0:18      Convert bool to int (specialization-constant const int)
 0:18        'scbt' (specialization-constant const bool)
 0:18          true (const bool)
 0:19      Construct int (specialization-constant const int)
-0:19        'sci2' (specialization-constant const int)
+0:19        'sci2' (specialization-constant const highp int)
 0:19          2 (const int)
-0:21      component-wise multiply (temp float)
-0:21        'scf1' (specialization-constant const float)
+0:21      component-wise multiply (temp highp float)
+0:21        'scf1' (specialization-constant const highp float)
 0:21          1.000000
-0:21        'scf1' (specialization-constant const float)
+0:21        'scf1' (specialization-constant const highp float)
 0:21          1.000000
 0:22      logical-or (specialization-constant const bool)
 0:22        'scbt' (specialization-constant const bool)
 0:22          true (const bool)
 0:22        'scbt' (specialization-constant const bool)
 0:22          true (const bool)
-0:23      component-wise multiply (specialization-constant const int)
-0:23        'sci2' (specialization-constant const int)
+0:23      component-wise multiply (specialization-constant const highp int)
+0:23        'sci2' (specialization-constant const highp int)
 0:23          2 (const int)
-0:23        'sci2' (specialization-constant const int)
+0:23        'sci2' (specialization-constant const highp int)
 0:23          2 (const int)
-0:24      add (temp float)
-0:24        'scf1' (specialization-constant const float)
+0:24      add (temp highp float)
+0:24        'scf1' (specialization-constant const highp float)
 0:24          1.000000
-0:24        Convert int to float (temp float)
-0:24          'sci2' (specialization-constant const int)
+0:24        Convert int to float (temp highp float)
+0:24          'sci2' (specialization-constant const highp int)
 0:24            2 (const int)
-0:26      Negate value (temp float)
-0:26        'scf1' (specialization-constant const float)
+0:26      Negate value (temp highp float)
+0:26        'scf1' (specialization-constant const highp float)
 0:26          1.000000
 0:27      Negate conditional (specialization-constant const bool)
 0:27        'scbt' (specialization-constant const bool)
 0:27          true (const bool)
-0:28      Negate value (specialization-constant const int)
-0:28        'sci2' (specialization-constant const int)
+0:28      Negate value (specialization-constant const highp int)
+0:28        'sci2' (specialization-constant const highp int)
 0:28          2 (const int)
 0:30      Compare Greater Than (temp bool)
-0:30        'scf1' (specialization-constant const float)
+0:30        'scf1' (specialization-constant const highp float)
 0:30          1.000000
-0:30        'scf1' (specialization-constant const float)
+0:30        'scf1' (specialization-constant const highp float)
 0:30          1.000000
 0:31      Compare Greater Than (specialization-constant const bool)
-0:31        'sci2' (specialization-constant const int)
+0:31        'sci2' (specialization-constant const highp int)
 0:31          2 (const int)
-0:31        'sci2' (specialization-constant const int)
+0:31        'sci2' (specialization-constant const highp int)
 0:31          2 (const int)
 0:33      Compare Not Equal (temp bool)
-0:33        'scf1' (specialization-constant const float)
+0:33        'scf1' (specialization-constant const highp float)
 0:33          1.000000
-0:33        'scf1' (specialization-constant const float)
+0:33        'scf1' (specialization-constant const highp float)
 0:33          1.000000
 0:34      Compare Not Equal (specialization-constant const bool)
 0:34        'scbt' (specialization-constant const bool)
@@ -215,48 +215,48 @@
 0:34        'scbt' (specialization-constant const bool)
 0:34          true (const bool)
 0:35      Compare Not Equal (specialization-constant const bool)
-0:35        'sci2' (specialization-constant const int)
+0:35        'sci2' (specialization-constant const highp int)
 0:35          2 (const int)
-0:35        'sci2' (specialization-constant const int)
+0:35        'sci2' (specialization-constant const highp int)
 0:35          2 (const int)
 0:37      Construct ivec2 (specialization-constant const 2-component vector of int)
-0:37        'sci2' (specialization-constant const int)
+0:37        'sci2' (specialization-constant const highp int)
 0:37          2 (const int)
-0:37        'sci2' (specialization-constant const int)
+0:37        'sci2' (specialization-constant const highp int)
 0:37          2 (const int)
 0:38      Construct ivec2 (temp 2-element array of 2-component vector of int)
 0:38        Construct ivec2 (specialization-constant const 2-component vector of int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
 0:38        Construct ivec2 (specialization-constant const 2-component vector of int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
-0:38          'sci2' (specialization-constant const int)
+0:38          'sci2' (specialization-constant const highp int)
 0:38            2 (const int)
 0:40      Construct vec2 (temp 2-component vector of float)
-0:40        'scf1' (specialization-constant const float)
+0:40        'scf1' (specialization-constant const highp float)
 0:40          1.000000
-0:40        'scf1' (specialization-constant const float)
+0:40        'scf1' (specialization-constant const highp float)
 0:40          1.000000
 0:41      Construct vec2 (temp 2-element array of 2-component vector of float)
 0:41        Construct vec2 (temp 2-component vector of float)
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
 0:41        Construct vec2 (temp 2-component vector of float)
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
-0:41          'scf1' (specialization-constant const float)
+0:41          'scf1' (specialization-constant const highp float)
 0:41            1.000000
 0:?   Linker Objects
-0:?     'scf1' (specialization-constant const float)
+0:?     'scf1' (specialization-constant const highp float)
 0:?       1.000000
 0:?     'scbt' (specialization-constant const bool)
 0:?       true (const bool)
-0:?     'sci2' (specialization-constant const int)
+0:?     'sci2' (specialization-constant const highp int)
 0:?       2 (const int)
 
 // Module Version 10000
diff --git a/Test/baseResults/vulkan.frag.out b/Test/baseResults/vulkan.frag.out
index 0132759..d4da919 100644
--- a/Test/baseResults/vulkan.frag.out
+++ b/Test/baseResults/vulkan.frag.out
@@ -14,7 +14,7 @@
 ERROR: 0:28: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: s2D
 ERROR: 0:29: 'sampler3D' : sampler-constructor cannot make an array of samplers 
 ERROR: 0:29: 'sampler3D' : sampler/image types can only be used in uniform variables or function parameters: s3d
-ERROR: 0:29: '=' :  cannot convert from 'const float' to 'global 4-element array of sampler3D'
+ERROR: 0:29: '=' :  cannot convert from 'const float' to 'global 4-element array of highp sampler3D'
 ERROR: 0:39: 'push_constant' : can only be used with a uniform 
 ERROR: 0:43: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan 
 ERROR: 0:43: 'push_constant' : can only be used with a block 
@@ -33,6 +33,8 @@
 ERROR: 0:69: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan 
 ERROR: 0:73: 'texture' : no matching overloaded function found 
 ERROR: 0:74: 'imageStore' : no matching overloaded function found 
+WARNING: 0:82: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
+         "precision mediump int; precision highp float;" 
 ERROR: 0:91: 'call argument' : sampler constructor must appear at point of use 
 ERROR: 0:92: 'call argument' : sampler constructor must appear at point of use 
 ERROR: 0:93: ',' : sampler constructor must appear at point of use 
diff --git a/Test/baseResults/vulkan.vert.out b/Test/baseResults/vulkan.vert.out
index 351e6f1..5aeaa74 100644
--- a/Test/baseResults/vulkan.vert.out
+++ b/Test/baseResults/vulkan.vert.out
@@ -15,7 +15,7 @@
 ERROR: 0:16: 'constant_id' : specialization-constant id already used 
 ERROR: 0:16: 'constant_id' : cannot declare a default, can only be used on a scalar 
 ERROR: 0:20: 'subpassLoad' : no matching overloaded function found 
-ERROR: 0:20: 'assign' :  cannot convert from 'const float' to 'smooth out 4-component vector of float'
+ERROR: 0:20: 'assign' :  cannot convert from 'const float' to 'smooth out highp 4-component vector of float'
 ERROR: 0:23: 'atomic counter types' : not allowed when using GLSL for Vulkan 
 ERROR: 0:24: 'shared' : not allowed when generating SPIR-V 
 ERROR: 0:25: 'packed' : not allowed when generating SPIR-V 
diff --git a/Test/hlsl.attribute.frag b/Test/hlsl.attribute.frag
index 25c72d4..9ff8541 100644
--- a/Test/hlsl.attribute.frag
+++ b/Test/hlsl.attribute.frag
@@ -1,4 +1,4 @@
-float4 PixelShaderFunction(float4 input) : COLOR0
+void PixelShaderFunction(float4 input) : COLOR0
 {
     [unroll];
     [];
diff --git a/Test/hlsl.buffer.frag b/Test/hlsl.buffer.frag
index e01e4fc..4e28043 100644
--- a/Test/hlsl.buffer.frag
+++ b/Test/hlsl.buffer.frag
@@ -6,7 +6,7 @@
     float4 v2;
 };
 
-cbuffer cbufName : register(b2) {
+cbuffer cbufName : register(b2, space10) {
     float4 v3;
     int i3 : packoffset(c1.y);
 };
diff --git a/Test/hlsl.depthGreater.frag b/Test/hlsl.depthGreater.frag
new file mode 100644
index 0000000..ca41f08
--- /dev/null
+++ b/Test/hlsl.depthGreater.frag
@@ -0,0 +1,4 @@
+void PixelShaderFunction(out float depth : SV_DepthGreaterEqual)
+{
+    depth = 0.2;
+}
diff --git a/Test/hlsl.depthLess.frag b/Test/hlsl.depthLess.frag
new file mode 100644
index 0000000..aca7dbb
--- /dev/null
+++ b/Test/hlsl.depthLess.frag
@@ -0,0 +1,4 @@
+float PixelShaderFunction() : SV_DepthLessEqual
+{
+    return 0.2;
+}
diff --git a/Test/hlsl.discard.frag b/Test/hlsl.discard.frag
index e8b5267..7d9271c 100644
--- a/Test/hlsl.discard.frag
+++ b/Test/hlsl.discard.frag
@@ -4,7 +4,7 @@
 		discard;
 }
 
-float4 PixelShaderFunction(float4 input) : COLOR0
+void PixelShaderFunction(float4 input) : COLOR0
 {
     foo(input.z);
 	if (input.x)
diff --git a/Test/hlsl.entry-in.frag b/Test/hlsl.entry-in.frag
new file mode 100644
index 0000000..e15955d
--- /dev/null
+++ b/Test/hlsl.entry-in.frag
@@ -0,0 +1,20 @@
+struct InParam {
+    float2 v;
+    float4 fragCoord : SV_POSITION;
+    int2 i2;
+};
+
+float fun(InParam p)
+{
+    return p.v.y + p.fragCoord.x;
+}
+
+float4 PixelShaderFunction(InParam i) : COLOR0
+{
+    InParam local;
+    local = i;
+    float ret1 = fun(local);
+    float ret2 = fun(i);
+
+    return local.fragCoord * ret1 * ret2;
+}
diff --git a/Test/hlsl.entry-out.frag b/Test/hlsl.entry-out.frag
new file mode 100644
index 0000000..14f0e45
--- /dev/null
+++ b/Test/hlsl.entry-out.frag
@@ -0,0 +1,17 @@
+struct OutParam {
+    float2 v;
+    int2 i;
+};
+
+float4 PixelShaderFunction(float4 input, out float4 out1, out OutParam out2, out OutParam out3) : COLOR0
+{
+    out1 = input;
+    out2.v = 2.0;
+    out2.i = 3;
+    OutParam local;
+    local.v = 12.0;
+    local.i = 13;
+    out3 = local;
+
+    return out1;
+}
diff --git a/Test/hlsl.intrinsics.frag b/Test/hlsl.intrinsics.frag
index b55c242..c04acae 100644
--- a/Test/hlsl.intrinsics.frag
+++ b/Test/hlsl.intrinsics.frag
@@ -482,3 +482,12 @@
     float2x4 r15 = mul(inFM2x3, inFM3x4);
     float3x4 r16 = mul(inFM3x2, inFM2x4);
 }
+
+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.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.layout.frag b/Test/hlsl.layout.frag
new file mode 100644
index 0000000..4c2f7ce
--- /dev/null
+++ b/Test/hlsl.layout.frag
@@ -0,0 +1,18 @@
+layout(set=3,binding=5) tbuffer tbufName {
+    layout(offset = 16) float4 v1;
+};
+
+layout(push_constant) tbuffer tbufName2 {
+    float4 v5;
+};
+
+layout(constant_id=17) const int specConst = 10;
+
+tbuffer tbufName2 : layout(set=4,binding=7) {
+    layout(offset = 16) float4 v1PostLayout;
+};
+
+float4 PixelShaderFunction(float4 input) : COLOR0
+{
+    return input + v1 + v5 + v1PostLayout;
+}
diff --git a/Test/hlsl.matType.frag b/Test/hlsl.matType.frag
index 36d71e3..ee7c047 100644
--- a/Test/hlsl.matType.frag
+++ b/Test/hlsl.matType.frag
@@ -7,4 +7,5 @@
 
 float1 ShaderFunction(float1 inFloat1, float inScalar) : COLOR0
 {
+    return inFloat1;
 }
diff --git a/Test/hlsl.matrixindex.frag b/Test/hlsl.matrixindex.frag
new file mode 100644
index 0000000..f352c0e
--- /dev/null
+++ b/Test/hlsl.matrixindex.frag
@@ -0,0 +1,49 @@
+uniform int      idx;
+uniform float3x2 um;
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+};
+
+PS_OUTPUT main()
+{
+    // matrices of 3 rows, 2 columns (regardless of row vs col major storage)
+    const float3x2 m1 = { { 10, 11 },  // row-wise initialization
+                          { 12, 13 },
+                          { 14, 15 } }; 
+
+    const float3x2 m2 = { 20, 21, 22, 23, 24, 25 };  // component-wise matrix initialization is allowed
+    const float3x2 m3 = { 30, 31, 33, 33, 34, 35 };  // component-wise matrix initialization is allowed
+
+    // These can be observed in the AST post-const folding to ensure we obtain the right value,
+    // as given in comments to the right of each line.  Note that the first indirection into a
+    // matrix returns a row vector.
+    float e1_00 = m1[0][0]; // 10
+    float e1_01 = m1[0][1]; // 11
+    float e1_10 = m1[1][0]; // 12
+    float e1_11 = m1[1][1]; // 13
+    float e1_20 = m1[2][0]; // 14
+    float e1_21 = m1[2][1]; // 15
+
+    float e2_00 = m2[0][0]; // 20
+    float e2_01 = m2[0][1]; // 21
+    float e2_10 = m2[1][0]; // 22
+    float e2_11 = m2[1][1]; // 23
+    float e2_20 = m2[2][0]; // 24
+    float e2_21 = m2[2][1]; // 25
+
+    // float e3a_00 = m3._m00; // TODO... also as an lvalue for a non-const matrix
+    // float e3b_00 = m3._11;  // TODO... also as an lvalue for a non-const matrix
+
+    float2 r0a = m1[0];  // row0: 10,11: types must match: constant index into constant
+    float2 r1a = m1[1];  // row1: 12,13: ...
+    float2 r2a = m1[2];  // row2: 14,15: ...
+
+    float2 r0b = m2[idx]; // types should match: variable index into constant
+    float2 r0c = um[idx]; // types should match: variable index into variable
+
+    PS_OUTPUT psout;
+    psout.Color = e2_11; // 23
+    return psout;
+}
diff --git a/Test/hlsl.multiEntry.vert b/Test/hlsl.multiEntry.vert
new file mode 100755
index 0000000..d155c26
--- /dev/null
+++ b/Test/hlsl.multiEntry.vert
@@ -0,0 +1,11 @@
+Buffer<float4> Position;

+

+float4 FakeEntrypoint(uint Index : SV_VERTEXID) : SV_POSITION

+{ 

+    return Position.Load(Index);

+}

+

+float4 RealEntrypoint(uint Index : SV_VERTEXID) : SV_POSITION

+{ 

+    return FakeEntrypoint(Index);

+}
\ No newline at end of file
diff --git a/Test/hlsl.overload.frag b/Test/hlsl.overload.frag
new file mode 100644
index 0000000..b5ddf49
--- /dev/null
+++ b/Test/hlsl.overload.frag
@@ -0,0 +1,142 @@
+// function selection under type conversion
+void foo1(double a, bool b)  {}
+void foo1(double a, uint b)  {}
+void foo1(double a, int b)   {}
+void foo1(double a, float b) {}
+void foo1(double a, double b){}
+
+// uint -> int
+void foo2(int a, bool b)  {}
+void foo2(int a, uint b)  {}
+void foo2(int a, int b)   {}
+void foo2(int a, float b) {}
+void foo2(int a, double b){}
+
+// everything can promote
+void foo3(bool b)  {}
+void foo4(uint b)  {}
+void foo5(int b)   {}
+void foo6(float b) {}
+void foo7(double b){}
+
+// shorter forward chain better than longer or backward chain
+void foo8(float)  {}
+void foo8(double) {}
+void foo9(int)    {}
+void foo9(uint)   {}
+void foo10(bool)  {}
+void foo10(int)   {}
+
+// shape change is worse
+void foo11(float3)  {}
+void foo11(double)  {}
+void foo11(int3)    {}
+void foo11(uint)    {}
+void foo12(float1)  {}
+void foo12(double3) {}
+void foo16(uint)    {}
+void foo16(uint2)   {}
+
+// shape change
+void foo13(float3)  {}
+void foo14(int1)     {}
+void foo15(bool1)   {}
+
+float4 PixelShaderFunction(float4 input) : COLOR0
+{
+    bool b;
+    double d;
+    uint u;
+    int i;
+    float f;
+
+    foo1(d, b);
+    foo1(d, d);
+    foo1(d, u);
+    foo1(d, i);
+    foo1(d, f);
+
+    foo1(f, b);
+    foo1(f, d);
+    foo1(f, u);
+    foo1(f, i);
+    foo1(f, f);
+
+    foo1(u, b);
+    foo1(u, d);
+    foo1(u, u);
+    foo1(u, i);
+    foo1(u, f);
+
+    foo1(i, b);
+    foo1(i, d);
+    foo1(i, u);
+    foo1(i, i);
+    foo1(i, f);
+
+    foo2(u, b);
+    foo2(u, d);
+    foo2(u, u);
+    foo2(u, i);
+    foo2(u, f);
+
+    foo2(i, b);
+    foo2(i, d);
+    foo2(i, u);
+    foo2(i, i);
+    foo2(i, f);
+
+    foo3(b);
+    foo3(d);
+    foo3(u);
+    foo3(i);
+    foo3(f);
+
+    foo4(b);
+    foo4(d);
+    foo4(u);
+    foo4(i);
+    foo4(f);
+
+    foo5(b);
+    foo5(d);
+    foo5(u);
+    foo5(i);
+    foo5(f);
+
+    foo6(b);
+    foo6(d);
+    foo6(u);
+    foo6(i);
+    foo6(f);
+
+    foo7(b);
+    foo7(d);
+    foo7(u);
+    foo7(i);
+    foo7(f);
+
+    foo8(b);
+    foo8(u);
+    foo8(i);
+
+    foo9(b);
+    foo9(f);
+    foo9(d);
+
+    foo10(u);
+    foo10(f);
+    foo10(d);
+
+    foo11(b);
+    foo11(f);
+    foo12(float3(f));
+    foo16(int2(i,i));
+
+    foo13(f);
+    foo14(int4(i));
+    foo15(b);
+    foo15(bool3(b));
+
+    return input;
+}
diff --git a/Test/hlsl.precise.frag b/Test/hlsl.precise.frag
new file mode 100644
index 0000000..7518de5
--- /dev/null
+++ b/Test/hlsl.precise.frag
@@ -0,0 +1,14 @@
+
+struct PS_OUTPUT { precise float4 color : SV_Target0; };
+
+precise float precisefloat;
+
+void MyFunction(in precise float myfloat, out precise float3 myfloat3) { }
+
+PS_OUTPUT main()
+{
+    PS_OUTPUT ps_output;
+    ps_output.color = 1.0;
+    return ps_output;
+}
+
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.reflection.vert b/Test/hlsl.reflection.vert
new file mode 100644
index 0000000..21cc810
--- /dev/null
+++ b/Test/hlsl.reflection.vert
@@ -0,0 +1,165 @@
+

+cbuffer nameless {

+    float3 anonMember1;

+    float3x2 m23;

+    int scalarAfterm23;

+    float4 anonDeadMember2;

+    float4 anonMember3;

+    int scalarBeforeArray;

+    float floatArray[5];

+    int scalarAfterArray;

+    float2x2 m22[9];

+};

+

+cbuffer c_nameless {

+    float3 c_anonMember1;

+    float3x2 c_m23;

+    int c_scalarAfterm23;

+    float4 c_anonDeadMember2;

+    float4 c_anonMember3;

+};

+

+cbuffer named {

+    float3 deadMember1;

+    int scalar;

+    float4 member2;

+    float4 member3;

+    float2 memfloat2;

+    float memf1;

+    bool  memf2;

+    int   memf3;

+    float2 memfloat2a;

+    float2x2 m22[7];

+} ablock;

+

+cbuffer namelessdead {

+    int a;

+};

+

+cbuffer namedDead {

+    int b;

+} bblock;

+

+struct N1 {

+    float a;

+};

+

+struct N2 {

+    float b;

+    float c;

+    float d;

+};

+

+struct N3 {

+    N1 n1;

+    N2 n2;

+};

+

+cbuffer nested {

+    N3 foo;

+} nest;

+

+struct TS {

+    int a;

+    int dead;

+};

+

+uniform TS s;

+

+uniform float uf1;

+uniform float uf2;

+uniform float ufDead3;

+uniform float ufDead4;

+

+uniform float2x2 dm22[10];

+

+struct deep1 {

+    float2 va[3];

+    bool b;

+};

+

+struct deep2 {

+    int i;

+    deep1 d1[4];

+};

+

+struct deep3 {

+    float4 iv4;

+    deep2 d2;

+    int3 v3;

+};

+

+

+

+

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

+

+const bool control = true;

+

+void deadFunction()

+{

+    float3 v3 = ablock.deadMember1;

+    float4 v = anonDeadMember2;

+    float f = ufDead4;

+}

+

+void liveFunction2()

+{

+    float3 v = anonMember1;

+    float f = uf1;

+}

+

+tbuffer abl {

+    float foo;

+} arrBl;

+

+tbuffer abl2 {

+    float foo;

+} arrBl2;

+

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

+{

+    liveFunction2();

+

+    if (! control)

+        deadFunction();

+

+    float f;

+    int i;

+    if (control) {

+        liveFunction2();

+        f = anonMember3.z;

+        f = s.a;

+        f = ablock.scalar;

+        f = m23[1].y + scalarAfterm23;

+        f = c_m23[1].y + c_scalarAfterm23;

+        f += scalarBeforeArray;

+        f += floatArray[2];

+        f += floatArray[4];

+        f += scalarAfterArray;

+        f += ablock.memfloat2.x;

+        f += ablock.memf1;

+        f += float(ablock.memf2);

+        f += ablock.memf3;

+        f += ablock.memfloat2a.y;

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

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

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

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

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

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

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

+        deep3 d = deepC[1];

+        deep3 da[2] = deepD;

+    } else

+        f = ufDead3;

+

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

+    f += arrBl2.foo;

+

+    f += attributeFloat;

+    f += attributeFloat2.x;

+    f += attributeFloat3.x;

+    f += attributeFloat4.x;

+    f += attributeMat4[0][1];

+}

diff --git a/Test/hlsl.scope.frag b/Test/hlsl.scope.frag
index 0d8cc1a..a5309ca 100644
--- a/Test/hlsl.scope.frag
+++ b/Test/hlsl.scope.frag
@@ -1,4 +1,4 @@
-float4 PixelShaderFunction(float4 input) : COLOR0
+void PixelShaderFunction(float4 input) : COLOR0
 {
     int x;
     x;
diff --git a/Test/hlsl.shapeConv.frag b/Test/hlsl.shapeConv.frag
index 1e6dec6..0485b4a 100644
--- a/Test/hlsl.shapeConv.frag
+++ b/Test/hlsl.shapeConv.frag
@@ -8,6 +8,25 @@
     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;
+
+    v.x == v;
+    f != v;
+
+    float1 f1;
+
+    f1 == v;
+    v < f1;
+    f1.x;
+    f1.xxx;
 
     return input;
 }
diff --git a/Test/hlsl.string.frag b/Test/hlsl.string.frag
new file mode 100755
index 0000000..09885ff
--- /dev/null
+++ b/Test/hlsl.string.frag
@@ -0,0 +1,12 @@
+string s = "string1";
+string e = "";
+string bracket < string a = "nested" ; > ; 
+string brackets < string b = "nest1" ; string c = "nest2" ; string d = "nest3" ; > ;
+string brackete1 <  > ;
+string brackete2 < ; > ;
+string brackete3 < ; ; > ;
+
+float main(float f)
+{
+    return f;
+}
\ No newline at end of file
diff --git a/Test/hlsl.stringtoken.frag b/Test/hlsl.stringtoken.frag
new file mode 100644
index 0000000..fe785e6
--- /dev/null
+++ b/Test/hlsl.stringtoken.frag
@@ -0,0 +1,20 @@
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+};
+
+Texture2D TestTexture <
+    string TestAttribute1 = "TestAttribute";
+    string TestAttribute2 = "false";
+    int    TestAttribute3 = 3;
+>;
+
+uniform float4 TestUF <string StrValue = "foo";>;
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+   psout.Color = float4(0,0,0,1);
+   return psout;
+}
diff --git a/Test/hlsl.struct.frag b/Test/hlsl.struct.frag
index c76f334..58cd524 100644
--- a/Test/hlsl.struct.frag
+++ b/Test/hlsl.struct.frag
@@ -16,7 +16,7 @@
     float4 i;
 } s2;
 
-struct {
+struct IN_S {
     linear float4 a;
     nointerpolation bool b;
     noperspective centroid float1 c;
@@ -25,19 +25,19 @@
     bool ff2 : packoffset(c0.y);
     bool ff3 : packoffset(c0.y) : register(ps_5_0, s0) ;
     float4 ff4 : VPOS : packoffset(c0.y) : register(ps_5_0, s0) <int bambam=30;> ;
-} s4;
+};
 
 float3 ff5 : packoffset(c1.y) : register(ps_5_0, s[5]);
 float3 ff6 : packoffset(c2.y) : register(s3[5]);
 
-float4 PixelShaderFunction(float4 input) : COLOR0
+float4 PixelShaderFunction(float4 input, IN_S s) : COLOR0
 {
     struct FS {
         bool3 b3;
     } s3;
 
     s3 == s3;
-    s2.i = s4.ff4;
+    s2.i = s.ff4;
 
     return input;
 }
\ No newline at end of file
diff --git a/Test/hlsl.structin.vert b/Test/hlsl.structin.vert
new file mode 100644
index 0000000..7eba552
--- /dev/null
+++ b/Test/hlsl.structin.vert
@@ -0,0 +1,14 @@
+struct VI {
+    float4 m[2];
+    uint2 coord;
+    linear float4 b;
+};
+
+VI main(float4 d, VI vi, float4 e) : SV_POSITION
+{
+    VI local;
+
+    local.b = vi.m[1] + vi.m[0] + float4(vi.coord.x) + d + e;
+
+    return local;
+}
\ No newline at end of file
diff --git a/Test/hlsl.void.frag b/Test/hlsl.void.frag
index 9bf06b7..950bbd7 100644
--- a/Test/hlsl.void.frag
+++ b/Test/hlsl.void.frag
@@ -1,8 +1,9 @@
 void foo1() {}
 void foo2(void) {}
 
-float4 PixelShaderFunction(float4 input) : COLOR0
+void PixelShaderFunction(float4 input) : COLOR0
 {
     foo1();
     foo2();
+    return;
 }
\ No newline at end of file
diff --git a/Test/remap.basic.dcefunc.frag b/Test/remap.basic.dcefunc.frag
new file mode 100644
index 0000000..714120a
--- /dev/null
+++ b/Test/remap.basic.dcefunc.frag
@@ -0,0 +1,11 @@
+#version 450
+
+in float  inf;
+out vec4  outf4;
+
+vec3 dead_fn() { return vec3(0); }
+
+void main()
+{
+    outf4 = vec4(inf);
+}
diff --git a/Test/remap.basic.everything.frag b/Test/remap.basic.everything.frag
new file mode 100644
index 0000000..714120a
--- /dev/null
+++ b/Test/remap.basic.everything.frag
@@ -0,0 +1,11 @@
+#version 450
+
+in float  inf;
+out vec4  outf4;
+
+vec3 dead_fn() { return vec3(0); }
+
+void main()
+{
+    outf4 = vec4(inf);
+}
diff --git a/Test/remap.basic.none.frag b/Test/remap.basic.none.frag
new file mode 100644
index 0000000..714120a
--- /dev/null
+++ b/Test/remap.basic.none.frag
@@ -0,0 +1,11 @@
+#version 450
+
+in float  inf;
+out vec4  outf4;
+
+vec3 dead_fn() { return vec3(0); }
+
+void main()
+{
+    outf4 = vec4(inf);
+}
diff --git a/Test/remap.basic.strip.frag b/Test/remap.basic.strip.frag
new file mode 100644
index 0000000..714120a
--- /dev/null
+++ b/Test/remap.basic.strip.frag
@@ -0,0 +1,11 @@
+#version 450
+
+in float  inf;
+out vec4  outf4;
+
+vec3 dead_fn() { return vec3(0); }
+
+void main()
+{
+    outf4 = vec4(inf);
+}
diff --git a/Test/remap.hlsl.sample.basic.everything.frag b/Test/remap.hlsl.sample.basic.everything.frag
new file mode 100644
index 0000000..03e83ef
--- /dev/null
+++ b/Test/remap.hlsl.sample.basic.everything.frag
@@ -0,0 +1,90 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d
+{
+    AddressU = MIRROR;
+    AddressV = WRAP;
+    MinLOD = 0;
+    MaxLOD = 10;
+    MaxAnisotropy = 2;
+    MipLodBias = 0.2;
+}, g_sSamp2D_b;
+
+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 MemberTest
+{
+    int Sample;                          // in HLSL, method names are valid struct members.
+    int CalculateLevelOfDetail;          // ...
+    int CalculateLevelOfDetailUnclamped; // ...
+    int Gather;                          // ...
+    int GetDimensions;                   // ...
+    int GetSamplePosition;               // ...
+    int Load;                            // ...
+    int SampleBias;                      // ...
+    int SampleCmp;                       // ...
+    int SampleCmpLevelZero;              // ...
+    int SampleGrad;                      // ...
+    int SampleLevel;                     // ...
+};
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   MemberTest mtest;
+   mtest.CalculateLevelOfDetail = 1;          // in HLSL, method names are valid struct members.
+   mtest.CalculateLevelOfDetailUnclamped = 1; // ...
+   mtest.Gather = 1;                          // ...
+   mtest.GetDimensions = 1;                   // ...
+   mtest.GetSamplePosition = 1;               // ...
+   mtest.Load = 1;                            // ...
+   mtest.Sample = 1;                          // ...
+   mtest.SampleBias = 1;                      // ...
+   mtest.SampleCmp = 1;                       // ...
+   mtest.SampleCmpLevelZero = 1;              // ...
+   mtest.SampleGrad = 1;                      // ...
+   mtest.SampleLevel = 1;                     // ...
+
+   float4 txval10 = g_tTex1df4 . Sample(g_sSamp, 0.1);
+   int4   txval11 = g_tTex1di4 . Sample(g_sSamp, 0.2);
+   uint4  txval12 = g_tTex1du4 . Sample(g_sSamp, 0.3);
+
+   float4 txval20 = g_tTex2df4 . Sample(g_sSamp, float2(0.1, 0.2));
+   int4   txval21 = g_tTex2di4 . Sample(g_sSamp, float2(0.3, 0.4));
+   uint4  txval22 = g_tTex2du4 . Sample(g_sSamp, float2(0.5, 0.6));
+
+   float4 txval30 = g_tTex3df4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval31 = g_tTex3di4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval32 = g_tTex3du4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   float4 txval40 = g_tTexcdf4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval41 = g_tTexcdi4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval42 = g_tTexcdu4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/remap.hlsl.sample.basic.none.frag b/Test/remap.hlsl.sample.basic.none.frag
new file mode 100644
index 0000000..03e83ef
--- /dev/null
+++ b/Test/remap.hlsl.sample.basic.none.frag
@@ -0,0 +1,90 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d
+{
+    AddressU = MIRROR;
+    AddressV = WRAP;
+    MinLOD = 0;
+    MaxLOD = 10;
+    MaxAnisotropy = 2;
+    MipLodBias = 0.2;
+}, g_sSamp2D_b;
+
+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 MemberTest
+{
+    int Sample;                          // in HLSL, method names are valid struct members.
+    int CalculateLevelOfDetail;          // ...
+    int CalculateLevelOfDetailUnclamped; // ...
+    int Gather;                          // ...
+    int GetDimensions;                   // ...
+    int GetSamplePosition;               // ...
+    int Load;                            // ...
+    int SampleBias;                      // ...
+    int SampleCmp;                       // ...
+    int SampleCmpLevelZero;              // ...
+    int SampleGrad;                      // ...
+    int SampleLevel;                     // ...
+};
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   MemberTest mtest;
+   mtest.CalculateLevelOfDetail = 1;          // in HLSL, method names are valid struct members.
+   mtest.CalculateLevelOfDetailUnclamped = 1; // ...
+   mtest.Gather = 1;                          // ...
+   mtest.GetDimensions = 1;                   // ...
+   mtest.GetSamplePosition = 1;               // ...
+   mtest.Load = 1;                            // ...
+   mtest.Sample = 1;                          // ...
+   mtest.SampleBias = 1;                      // ...
+   mtest.SampleCmp = 1;                       // ...
+   mtest.SampleCmpLevelZero = 1;              // ...
+   mtest.SampleGrad = 1;                      // ...
+   mtest.SampleLevel = 1;                     // ...
+
+   float4 txval10 = g_tTex1df4 . Sample(g_sSamp, 0.1);
+   int4   txval11 = g_tTex1di4 . Sample(g_sSamp, 0.2);
+   uint4  txval12 = g_tTex1du4 . Sample(g_sSamp, 0.3);
+
+   float4 txval20 = g_tTex2df4 . Sample(g_sSamp, float2(0.1, 0.2));
+   int4   txval21 = g_tTex2di4 . Sample(g_sSamp, float2(0.3, 0.4));
+   uint4  txval22 = g_tTex2du4 . Sample(g_sSamp, float2(0.5, 0.6));
+
+   float4 txval30 = g_tTex3df4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval31 = g_tTex3di4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval32 = g_tTex3du4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   float4 txval40 = g_tTexcdf4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval41 = g_tTexcdi4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval42 = g_tTexcdu4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/remap.hlsl.sample.basic.strip.frag b/Test/remap.hlsl.sample.basic.strip.frag
new file mode 100644
index 0000000..03e83ef
--- /dev/null
+++ b/Test/remap.hlsl.sample.basic.strip.frag
@@ -0,0 +1,90 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d
+{
+    AddressU = MIRROR;
+    AddressV = WRAP;
+    MinLOD = 0;
+    MaxLOD = 10;
+    MaxAnisotropy = 2;
+    MipLodBias = 0.2;
+}, g_sSamp2D_b;
+
+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 MemberTest
+{
+    int Sample;                          // in HLSL, method names are valid struct members.
+    int CalculateLevelOfDetail;          // ...
+    int CalculateLevelOfDetailUnclamped; // ...
+    int Gather;                          // ...
+    int GetDimensions;                   // ...
+    int GetSamplePosition;               // ...
+    int Load;                            // ...
+    int SampleBias;                      // ...
+    int SampleCmp;                       // ...
+    int SampleCmpLevelZero;              // ...
+    int SampleGrad;                      // ...
+    int SampleLevel;                     // ...
+};
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   MemberTest mtest;
+   mtest.CalculateLevelOfDetail = 1;          // in HLSL, method names are valid struct members.
+   mtest.CalculateLevelOfDetailUnclamped = 1; // ...
+   mtest.Gather = 1;                          // ...
+   mtest.GetDimensions = 1;                   // ...
+   mtest.GetSamplePosition = 1;               // ...
+   mtest.Load = 1;                            // ...
+   mtest.Sample = 1;                          // ...
+   mtest.SampleBias = 1;                      // ...
+   mtest.SampleCmp = 1;                       // ...
+   mtest.SampleCmpLevelZero = 1;              // ...
+   mtest.SampleGrad = 1;                      // ...
+   mtest.SampleLevel = 1;                     // ...
+
+   float4 txval10 = g_tTex1df4 . Sample(g_sSamp, 0.1);
+   int4   txval11 = g_tTex1di4 . Sample(g_sSamp, 0.2);
+   uint4  txval12 = g_tTex1du4 . Sample(g_sSamp, 0.3);
+
+   float4 txval20 = g_tTex2df4 . Sample(g_sSamp, float2(0.1, 0.2));
+   int4   txval21 = g_tTex2di4 . Sample(g_sSamp, float2(0.3, 0.4));
+   uint4  txval22 = g_tTex2du4 . Sample(g_sSamp, float2(0.5, 0.6));
+
+   float4 txval30 = g_tTex3df4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval31 = g_tTex3di4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval32 = g_tTex3du4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   float4 txval40 = g_tTexcdf4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval41 = g_tTexcdi4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval42 = g_tTexcdu4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
diff --git a/Test/remap.hlsl.templatetypes.everything.frag b/Test/remap.hlsl.templatetypes.everything.frag
new file mode 100644
index 0000000..bacd6f5
--- /dev/null
+++ b/Test/remap.hlsl.templatetypes.everything.frag
@@ -0,0 +1,47 @@
+
+float4 main(float4 input) : COLOR0
+{
+    vector r00 = float4(1,2,3,4);  // vector means float4
+    float4 r01 = vector(2,3,4,5);  // vector means float4
+
+    vector<bool, 1>   r12 = bool1(false);
+    vector<int, 1>    r13 = int1(1);
+    vector<float, 1>  r14 = float1(1);
+    vector<double, 1> r15 = double1(1);
+    vector<uint, 1>   r16 = uint1(1);
+
+    vector<bool, 2>   r20 = bool2(false, true);
+    vector<int, 2>    r21 = int2(1,2);
+    vector<float, 2>  r22 = float2(1,2);
+    vector<double, 2> r23 = double2(1,2);
+    vector<uint, 2>   r24 = uint2(1,2);
+    
+    vector<bool, 3>   r30 = bool3(false, true, true);
+    vector<int, 3>    r31 = int3(1,2,3);
+    vector<float, 3>  r32 = float3(1,2,3);
+    vector<double, 3> r33 = double3(1,2,3);
+    vector<uint, 3>   r34 = uint3(1,2,3);
+
+    vector<bool, 4>   r40 = bool4(false, true, true, false);
+    vector<int, 4>    r41 = int4(1,2,3,4);
+    vector<float, 4>  r42 = float4(1,2,3,4);
+    vector<double, 4> r43 = double4(1,2,3,4);
+    vector<uint, 4>   r44 = uint4(1,2,3,4);
+
+    matrix   r50 = float4x4(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); // matrix means float4x4
+    float4x4 r51 = matrix(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);   // matrix means float4x4
+
+    // matrix<bool, 2, 3>  r60 = bool2x3(false, true, false, true, false, true);   // TODO: 
+    matrix<float, 2, 3> r61 = float2x3(1,2,3,4,5,6);
+    matrix<float, 3, 2> r62 = float3x2(1,2,3,4,5,6);
+    // matrix<float, 4, 1> r63 = float4x1(1,2,3,4);  // TODO: 
+    // matrix<float, 1, 4> r64 = float1x4(1,2,3,4);  // TODO: 
+    matrix<float, 4, 2> r65 = float4x2(1,2,3,4,5,6,7,8);
+    matrix<float, 4, 3> r66 = float4x3(1,2,3,4,5,6,7,8,9,10,11,12);
+
+    // TODO: bool mats
+    // TODO: int mats
+    
+    return 0.0;
+}
+
diff --git a/Test/remap.hlsl.templatetypes.none.frag b/Test/remap.hlsl.templatetypes.none.frag
new file mode 100644
index 0000000..bacd6f5
--- /dev/null
+++ b/Test/remap.hlsl.templatetypes.none.frag
@@ -0,0 +1,47 @@
+
+float4 main(float4 input) : COLOR0
+{
+    vector r00 = float4(1,2,3,4);  // vector means float4
+    float4 r01 = vector(2,3,4,5);  // vector means float4
+
+    vector<bool, 1>   r12 = bool1(false);
+    vector<int, 1>    r13 = int1(1);
+    vector<float, 1>  r14 = float1(1);
+    vector<double, 1> r15 = double1(1);
+    vector<uint, 1>   r16 = uint1(1);
+
+    vector<bool, 2>   r20 = bool2(false, true);
+    vector<int, 2>    r21 = int2(1,2);
+    vector<float, 2>  r22 = float2(1,2);
+    vector<double, 2> r23 = double2(1,2);
+    vector<uint, 2>   r24 = uint2(1,2);
+    
+    vector<bool, 3>   r30 = bool3(false, true, true);
+    vector<int, 3>    r31 = int3(1,2,3);
+    vector<float, 3>  r32 = float3(1,2,3);
+    vector<double, 3> r33 = double3(1,2,3);
+    vector<uint, 3>   r34 = uint3(1,2,3);
+
+    vector<bool, 4>   r40 = bool4(false, true, true, false);
+    vector<int, 4>    r41 = int4(1,2,3,4);
+    vector<float, 4>  r42 = float4(1,2,3,4);
+    vector<double, 4> r43 = double4(1,2,3,4);
+    vector<uint, 4>   r44 = uint4(1,2,3,4);
+
+    matrix   r50 = float4x4(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); // matrix means float4x4
+    float4x4 r51 = matrix(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);   // matrix means float4x4
+
+    // matrix<bool, 2, 3>  r60 = bool2x3(false, true, false, true, false, true);   // TODO: 
+    matrix<float, 2, 3> r61 = float2x3(1,2,3,4,5,6);
+    matrix<float, 3, 2> r62 = float3x2(1,2,3,4,5,6);
+    // matrix<float, 4, 1> r63 = float4x1(1,2,3,4);  // TODO: 
+    // matrix<float, 1, 4> r64 = float1x4(1,2,3,4);  // TODO: 
+    matrix<float, 4, 2> r65 = float4x2(1,2,3,4,5,6,7,8);
+    matrix<float, 4, 3> r66 = float4x3(1,2,3,4,5,6,7,8,9,10,11,12);
+
+    // TODO: bool mats
+    // TODO: int mats
+    
+    return 0.0;
+}
+
diff --git a/Test/remap.if.everything.frag b/Test/remap.if.everything.frag
new file mode 100644
index 0000000..3fedfc4
--- /dev/null
+++ b/Test/remap.if.everything.frag
@@ -0,0 +1,12 @@
+#version 450
+
+in float  inf;
+out vec4  outf4;
+
+void main()
+{
+    if (inf > 2.0)
+        outf4 = vec4(inf);
+    else
+        outf4 = vec4(inf + -.5);
+}
diff --git a/Test/remap.if.none.frag b/Test/remap.if.none.frag
new file mode 100644
index 0000000..3fedfc4
--- /dev/null
+++ b/Test/remap.if.none.frag
@@ -0,0 +1,12 @@
+#version 450
+
+in float  inf;
+out vec4  outf4;
+
+void main()
+{
+    if (inf > 2.0)
+        outf4 = vec4(inf);
+    else
+        outf4 = vec4(inf + -.5);
+}
diff --git a/Test/remap.literal64.everything.spv b/Test/remap.literal64.everything.spv
new file mode 100644
index 0000000..88103c4
--- /dev/null
+++ b/Test/remap.literal64.everything.spv
Binary files differ
diff --git a/Test/remap.literal64.none.spv b/Test/remap.literal64.none.spv
new file mode 100644
index 0000000..88103c4
--- /dev/null
+++ b/Test/remap.literal64.none.spv
Binary files differ
diff --git a/Test/remap.similar_1a.everything.frag b/Test/remap.similar_1a.everything.frag
new file mode 100644
index 0000000..6eddbc5
--- /dev/null
+++ b/Test/remap.similar_1a.everything.frag
@@ -0,0 +1,29 @@
+#version 450
+
+in float  inf;
+in flat ivec4  ini4;
+out vec4  outf4;
+
+float Test1(int bound)
+{
+    float r = 0;
+    for (int x=0; x<bound; ++x)
+        r += 0.5;
+    return r;
+}
+
+float Test2(int bound)
+{
+    if (bound > 2)
+        return Test1(bound);
+    else
+        return float(bound * 2 +
+                     ini4.y * ini4.z +
+                     ini4.x);
+}
+
+void main()
+{
+    outf4 = vec4(Test1(int(inf)) + 
+                 Test2(int(inf)));
+}
diff --git a/Test/remap.similar_1a.none.frag b/Test/remap.similar_1a.none.frag
new file mode 100644
index 0000000..6eddbc5
--- /dev/null
+++ b/Test/remap.similar_1a.none.frag
@@ -0,0 +1,29 @@
+#version 450
+
+in float  inf;
+in flat ivec4  ini4;
+out vec4  outf4;
+
+float Test1(int bound)
+{
+    float r = 0;
+    for (int x=0; x<bound; ++x)
+        r += 0.5;
+    return r;
+}
+
+float Test2(int bound)
+{
+    if (bound > 2)
+        return Test1(bound);
+    else
+        return float(bound * 2 +
+                     ini4.y * ini4.z +
+                     ini4.x);
+}
+
+void main()
+{
+    outf4 = vec4(Test1(int(inf)) + 
+                 Test2(int(inf)));
+}
diff --git a/Test/remap.similar_1b.everything.frag b/Test/remap.similar_1b.everything.frag
new file mode 100644
index 0000000..4600945
--- /dev/null
+++ b/Test/remap.similar_1b.everything.frag
@@ -0,0 +1,30 @@
+#version 450
+
+out vec4  outf4;
+in flat ivec4  ini4;
+in float  inf;
+
+float Test1(int bound)
+{
+    float r = 0;
+    for (int x=0; x<bound; ++x)
+        r += 0.5;
+    r += 0.2;
+    return r;
+}
+
+float Test2(int bound)
+{
+    if (bound > 2) {
+        return Test1(bound * 2);
+    } else
+        return float(bound * 4 +
+                     ini4.y * ini4.z +
+                     ini4.x);
+}
+
+void main()
+{
+    outf4 = vec4(Test1(int(inf)) + 
+                 Test2(int(inf)));
+}
diff --git a/Test/remap.similar_1b.none.frag b/Test/remap.similar_1b.none.frag
new file mode 100644
index 0000000..4600945
--- /dev/null
+++ b/Test/remap.similar_1b.none.frag
@@ -0,0 +1,30 @@
+#version 450
+
+out vec4  outf4;
+in flat ivec4  ini4;
+in float  inf;
+
+float Test1(int bound)
+{
+    float r = 0;
+    for (int x=0; x<bound; ++x)
+        r += 0.5;
+    r += 0.2;
+    return r;
+}
+
+float Test2(int bound)
+{
+    if (bound > 2) {
+        return Test1(bound * 2);
+    } else
+        return float(bound * 4 +
+                     ini4.y * ini4.z +
+                     ini4.x);
+}
+
+void main()
+{
+    outf4 = vec4(Test1(int(inf)) + 
+                 Test2(int(inf)));
+}
diff --git a/Test/remap.switch.everything.frag b/Test/remap.switch.everything.frag
new file mode 100644
index 0000000..140c079
--- /dev/null
+++ b/Test/remap.switch.everything.frag
@@ -0,0 +1,16 @@
+#version 450
+
+precision highp float;
+
+layout(location = 0) out mediump vec4 FragColor;
+layout(location = 0) in vec4 in0;
+
+void main()
+{
+    switch(int(in0.w)) {
+    case 0: FragColor = vec4(in0.x + 0); break;
+    case 1: FragColor = vec4(in0.y + 1); break;
+    case 2: FragColor = vec4(in0.z + 2); break;
+    default: FragColor = vec4(-1);
+    }
+}
diff --git a/Test/remap.switch.none.frag b/Test/remap.switch.none.frag
new file mode 100644
index 0000000..140c079
--- /dev/null
+++ b/Test/remap.switch.none.frag
@@ -0,0 +1,16 @@
+#version 450
+
+precision highp float;
+
+layout(location = 0) out mediump vec4 FragColor;
+layout(location = 0) in vec4 in0;
+
+void main()
+{
+    switch(int(in0.w)) {
+    case 0: FragColor = vec4(in0.x + 0); break;
+    case 1: FragColor = vec4(in0.y + 1); break;
+    case 2: FragColor = vec4(in0.z + 2); break;
+    default: FragColor = vec4(-1);
+    }
+}
diff --git a/Test/remap.uniformarray.everything.frag b/Test/remap.uniformarray.everything.frag
new file mode 100644
index 0000000..4f642e6
--- /dev/null
+++ b/Test/remap.uniformarray.everything.frag
@@ -0,0 +1,17 @@
+#version 140
+
+uniform sampler2D texSampler2D;
+in vec3 inColor;
+in vec4 color[6];
+in float alpha[16];
+
+void main()
+{
+	vec4 texColor = color[1] + color[1];
+
+	texColor.xyz += inColor;
+
+	texColor.a += alpha[12];
+
+    gl_FragColor = texColor;
+}
diff --git a/Test/remap.uniformarray.none.frag b/Test/remap.uniformarray.none.frag
new file mode 100644
index 0000000..4f642e6
--- /dev/null
+++ b/Test/remap.uniformarray.none.frag
@@ -0,0 +1,17 @@
+#version 140
+
+uniform sampler2D texSampler2D;
+in vec3 inColor;
+in vec4 color[6];
+in float alpha[16];
+
+void main()
+{
+	vec4 texColor = color[1] + color[1];
+
+	texColor.xyz += inColor;
+
+	texColor.a += alpha[12];
+
+    gl_FragColor = texColor;
+}
diff --git a/Test/runtests b/Test/runtests
index 5e777a8..1851338 100755
--- a/Test/runtests
+++ b/Test/runtests
@@ -31,6 +31,8 @@
 echo Running reflection...
 $EXE -l -q -C reflection.vert > $TARGETDIR/reflection.vert.out
 diff -b $BASEDIR/reflection.vert.out $TARGETDIR/reflection.vert.out || HASERROR=1
+$EXE -D -e flizv -l -q -C -V hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.vert.out
+diff -b $BASEDIR/hlsl.reflection.vert.out $TARGETDIR/hlsl.reflection.vert.out || HASERROR=1
 
 #
 # multi-threaded test
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/Test/spv.accessChain.frag b/Test/spv.accessChain.frag
index 41ec0ca..c7f805b 100644
--- a/Test/spv.accessChain.frag
+++ b/Test/spv.accessChain.frag
@@ -71,7 +71,7 @@
 

 void GetColor13(const S i, int comp)

 { 

-    // OutColor.zy[comp] += i.color.x; // not yet supported

+    OutColor.zy[comp] += i.color.x;

 }

 

 void main()

diff --git a/Test/spv.int64.frag b/Test/spv.int64.frag
index 527bfef..8021b7e 100644
--- a/Test/spv.int64.frag
+++ b/Test/spv.int64.frag
@@ -225,4 +225,40 @@
     // notEqual()

     bv    = notEqual(u64v, u64vec3(u64));

     bv.xy = notEqual(i64v, i64vec2(i64));

-}
\ No newline at end of file
+}

+

+// Type conversion for specialization constant

+layout(constant_id = 100) const int64_t  si64 = -10L;

+layout(constant_id = 101) const uint64_t su64 = 20UL;

+layout(constant_id = 102) const int  si = -5;

+layout(constant_id = 103) const uint su = 4;

+layout(constant_id = 104) const bool sb = true;

+

+// bool <-> int64/uint64

+const bool i64_to_b = bool(si64);

+const bool u64_to_b = bool(su64);

+const int64_t  b_to_i64 = int64_t(sb);

+const uint64_t b_to_u64 = uint64_t(sb);

+

+// int <-> int64

+const int     i64_to_i = int(si64);

+const int64_t i_to_i64 = int64_t(si);

+

+// uint <-> uint64

+const uint     u64_to_u = uint(su64);

+const uint64_t u_to_u64 = uint64_t(su);

+

+// int64 <-> uint64

+const int64_t  u64_to_i64 = int64_t(su64);

+const uint64_t i64_to_u64 = uint64_t(si64);

+

+// int <-> uint64

+const int      u64_to_i = int(su64);

+const uint64_t i_to_u64 = uint64_t(si);

+

+// uint <-> int64

+const uint    i64_to_u = uint(si64);

+const int64_t u_to_i64 = int64_t(su);

+

+#define UINT64_MAX  18446744073709551615ul

+uint64_t u64Max = UINT64_MAX;

diff --git a/Test/spv.merge-unreachable.frag b/Test/spv.merge-unreachable.frag
index 12f57cd..a650cd1 100644
--- a/Test/spv.merge-unreachable.frag
+++ b/Test/spv.merge-unreachable.frag
@@ -1,4 +1,5 @@
 #version 450

+precision mediump int; precision highp float;

 layout(location=1) in highp vec4 v;

 void main (void)

 {

diff --git a/Test/spv.multiStruct.comp b/Test/spv.multiStruct.comp
new file mode 100644
index 0000000..7462da4
--- /dev/null
+++ b/Test/spv.multiStruct.comp
@@ -0,0 +1,48 @@
+#version 450 core

+

+struct MyStruct

+{

+    vec2 foo[2];

+    bool sb;

+};

+

+layout(binding = 0, std430) buffer SSBO0

+{

+    MyStruct a;

+} inBuf;

+

+layout(binding = 1, std430) buffer SSBO1

+{

+    MyStruct b;

+} outBuf;

+

+layout(binding = 2, std140) uniform UBO

+{

+    MyStruct c;

+} uBuf;

+

+struct Nested {

+    float f;

+    MyStruct S[2];

+};

+

+layout(binding = 2, std140) uniform UBON

+{

+    Nested N1;

+} uBufN;

+

+layout(binding = 1, std430) buffer SSBO1N

+{

+    Nested N2;

+} outBufN;

+

+void main()

+{

+    MyStruct t = inBuf.a;

+    outBuf.b = t;

+    t = uBuf.c;

+    outBuf.b = t;

+

+    Nested n = uBufN.N1;

+    outBufN.N2 = n;

+}

diff --git a/Test/spv.multiStructFuncall.frag b/Test/spv.multiStructFuncall.frag
new file mode 100755
index 0000000..7f9968d
--- /dev/null
+++ b/Test/spv.multiStructFuncall.frag
@@ -0,0 +1,21 @@
+#version 450

+

+struct S { mat4 m; };

+buffer blockName { S s1; };  // need an S with decoration

+S s2;                        // no decorations on S

+

+void fooConst(const in S s) { }

+void foo(in S s) { }

+void fooOut(inout S s) { }

+

+void main()

+{

+  fooConst(s1);

+  fooConst(s2);

+

+  foo(s1);

+  foo(s2);

+

+  fooOut(s1);

+  fooOut(s2);

+}
\ No newline at end of file
diff --git a/Test/spv.specConstantOperations.vert b/Test/spv.specConstantOperations.vert
index b5e46ad..f67561c 100644
--- a/Test/spv.specConstantOperations.vert
+++ b/Test/spv.specConstantOperations.vert
@@ -4,12 +4,16 @@
 layout(constant_id = 201) const int sp_int = 10;
 layout(constant_id = 202) const uint sp_uint = 100;
 layout(constant_id = 203) const int sp_sint = -10;
-
+layout(constant_id = 204) const double sp_double = 2.718281828459;
 
 //
 // Scalars
 //
 
+// float <-> double conversion
+const float float_from_double = float(sp_double);
+const double double_from_float = double(sp_float);
+
 // uint/int <-> bool conversion
 const bool bool_from_int = bool(sp_int);
 const bool bool_from_uint = bool(sp_uint);
diff --git a/Test/spv.structAssignment.frag b/Test/spv.structAssignment.frag
index 72984f2..ca95ec3 100644
--- a/Test/spv.structAssignment.frag
+++ b/Test/spv.structAssignment.frag
@@ -1,5 +1,7 @@
 #version 140

 

+precision mediump int;

+

 uniform sampler2D samp2D;

 in mediump vec2 coord;

 

diff --git a/Test/spv.uint.frag b/Test/spv.uint.frag
index 92a8f96..853de7c 100644
--- a/Test/spv.uint.frag
+++ b/Test/spv.uint.frag
@@ -95,5 +95,8 @@
     if ((mask1 ^ mask4) == 0xA10u)

         count *= 7;  // 341413380

 

-    c += uvec4(count);	

+    c += uvec4(count);

+

+    #define UINT_MAX  4294967295u

+    c.x += UINT_MAX;

 }

diff --git a/glslang/CMakeLists.txt b/glslang/CMakeLists.txt
index f431cc1..6325fd4 100644
--- a/glslang/CMakeLists.txt
+++ b/glslang/CMakeLists.txt
@@ -14,6 +14,7 @@
     MachineIndependent/Initialize.cpp
     MachineIndependent/IntermTraverse.cpp
     MachineIndependent/Intermediate.cpp
+    MachineIndependent/ParseContextBase.cpp
     MachineIndependent/ParseHelper.cpp
     MachineIndependent/PoolAlloc.cpp
     MachineIndependent/RemoveTree.cpp
@@ -54,6 +55,7 @@
     MachineIndependent/glslang_tab.cpp.h
     MachineIndependent/gl_types.h
     MachineIndependent/Initialize.h
+    MachineIndependent/LiveTraverser.h
     MachineIndependent/localintermediate.h
     MachineIndependent/ParseHelper.h
     MachineIndependent/reflection.h
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/BaseTypes.h b/glslang/Include/BaseTypes.h
index 7e12c55..64ef80c 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -55,6 +55,10 @@
     EbtSampler,
     EbtStruct,
     EbtBlock,
+
+    // HLSL types that live only temporarily.
+    EbtString,
+
     EbtNumTypes
 };
 
@@ -196,6 +200,11 @@
     EbvBaryCoordPullModel,
 #endif
 
+    // HLSL built-ins that live only temporarily, until they get remapped
+    // to one of the above.
+    EbvFragDepthGreater,
+    EbvFragDepthLesser,
+
     EbvLast
 };
 
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/Types.h b/glslang/Include/Types.h
index 1ea9f25..6c2ded8 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -1075,7 +1075,7 @@
                                 qualifier.clear();
                                 qualifier.storage = q;
                                 qualifier.precision = p;
-                                assert(p >= 0 && p <= EpqHigh);
+                                assert(p >= EpqNone && p <= EpqHigh);
                             }
     // for turning a TPublicType into a TType, using a shallow copy
     explicit TType(const TPublicType& p) :
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index bcaf087..32969be 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.1383"
-#define GLSLANG_DATE "04-Aug-2016"
+#define GLSLANG_REVISION "Overload400-PrecQual.1502"
+#define GLSLANG_DATE "19-Sep-2016"
diff --git a/glslang/MachineIndependent/InfoSink.cpp b/glslang/MachineIndependent/InfoSink.cpp
index 2e88882..79acba8 100644
--- a/glslang/MachineIndependent/InfoSink.cpp
+++ b/glslang/MachineIndependent/InfoSink.cpp
@@ -34,15 +34,19 @@
 
 #include "../Include/InfoSink.h"
 
-#include <string.h>
+#include <cstring>
 
 namespace glslang {
 
-void TInfoSinkBase::append(const char* s)           
+void TInfoSinkBase::append(const char* s)
 {
     if (outputStream & EString) {
-        checkMem(strlen(s)); 
-        sink.append(s); 
+        if (s == nullptr)
+            sink.append("(null)");
+        else {
+            checkMem(strlen(s));
+            sink.append(s);
+        }
     }
 
 //#ifdef _WIN32
@@ -54,10 +58,10 @@
         fprintf(stdout, "%s", s);
 }
 
-void TInfoSinkBase::append(int count, char c)       
+void TInfoSinkBase::append(int count, char c)
 { 
     if (outputStream & EString) {
-        checkMem(count);         
+        checkMem(count);
         sink.append(count, c); 
     }
 
@@ -74,10 +78,10 @@
         fprintf(stdout, "%c", c);
 }
 
-void TInfoSinkBase::append(const TPersistString& t) 
+void TInfoSinkBase::append(const TPersistString& t)
 { 
     if (outputStream & EString) {
-        checkMem(t.size());  
+        checkMem(t.size());
         sink.append(t); 
     }
 
@@ -93,7 +97,7 @@
 void TInfoSinkBase::append(const TString& t)
 { 
     if (outputStream & EString) {
-        checkMem(t.size());  
+        checkMem(t.size());
         sink.append(t.c_str()); 
     }
 
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 0323c1b..6d2e9c0 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1460,15 +1460,15 @@
             "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 umulExtended(highp  uint, highp  uint, out highp  uint, out highp  uint lsb);"
+            "void umulExtended(highp uvec2, highp uvec2, out highp uvec2, out highp uvec2 lsb);"
+            "void umulExtended(highp uvec3, highp uvec3, out highp uvec3, out highp uvec3 lsb);"
+            "void umulExtended(highp uvec4, highp uvec4, out highp 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);"
+            "void imulExtended(highp   int, highp   int, out highp   int, out highp   int lsb);"
+            "void imulExtended(highp ivec2, highp ivec2, out highp ivec2, out highp ivec2 lsb);"
+            "void imulExtended(highp ivec3, highp ivec3, out highp ivec3, out highp ivec3 lsb);"
+            "void imulExtended(highp ivec4, highp ivec4, out highp ivec4, out highp ivec4 lsb);"
 
             "  int bitfieldReverse(highp   int);"
             "ivec2 bitfieldReverse(highp ivec2);"
@@ -2638,10 +2638,10 @@
                 );
 
             stageBuiltins[EShLangFragment].append(  // GL_OES_sample_variables
-                "flat lowp    in  int  gl_SampleID;"
-                "     mediump in  vec2 gl_SamplePosition;"
-                "flat highp   in  int  gl_SampleMaskIn[];"
-                "     highp   out int  gl_SampleMask[];"
+                "flat  in lowp     int gl_SampleID;"
+                "      in mediump vec2 gl_SamplePosition;"
+                "flat  in highp    int gl_SampleMaskIn[];"
+                "     out highp    int gl_SampleMask[];"
                 "uniform lowp int gl_NumSamples;"
                 );
         }
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index be828e9..677cef3 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.
@@ -270,7 +274,8 @@
     if (newType != EbtVoid) {
         child = addConversion(op, TType(newType, EvqTemporary, child->getVectorSize(),
                                                                child->getMatrixCols(),
-                                                               child->getMatrixRows()),
+                                                               child->getMatrixRows(),
+                                                               child->isVector()),
                               child);
         if (child == 0)
             return 0;
@@ -520,7 +525,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;
@@ -694,6 +699,13 @@
     // some operations don't do this
     switch (op) {
     case EOpAssign:
+    case EOpLessThan:
+    case EOpGreaterThan:
+    case EOpLessThanEqual:
+    case EOpGreaterThanEqual:
+    case EOpEqual:
+    case EOpNotEqual:
+    case EOpFunctionCall:
         break;
     default:
         return node;
@@ -705,12 +717,13 @@
         return node;
 
     // The new node that handles the conversion
-    TIntermTyped* conversionNode = node;
     TOperator constructorOp = mapTypeToConstructorOp(type);
 
-    // scalar -> smeared -> vector
-    if (type.isVector() && node->getType().isScalar())
-        return setAggregateOperator(node, constructorOp, type, node->getLoc());
+    // scalar -> smeared -> vector, or
+    // bigger vector -> smaller vector or scalar
+    if ((type.isVector() && node->getType().isScalar()) ||
+        (node->getVectorSize() > type.getVectorSize() && type.isVector()))
+        return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
 
     return node;
 }
@@ -719,11 +732,39 @@
 // 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;
 
+    // TODO: Move more policies into language-specific handlers.
+    // 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
+            case EOpFunctionCall:            // conversion of a calling parameter
+                return true;
+            default:
+                break;
+            }
+        }
+    }
+
     switch (to) {
     case EbtDouble:
         switch (from) {
@@ -1403,6 +1444,8 @@
         case EOpIndexIndirect:
         case EOpIndexDirectStruct:
         case EOpVectorSwizzle:
+        case EOpConvFloatToDouble:
+        case EOpConvDoubleToFloat:
             return true;
         default:
             return false;
@@ -1433,6 +1476,20 @@
     case EOpConvBoolToInt:
     case EOpConvIntToUint:
     case EOpConvBoolToUint:
+    case EOpConvInt64ToBool:
+    case EOpConvBoolToInt64:
+    case EOpConvUint64ToBool:
+    case EOpConvBoolToUint64:
+    case EOpConvInt64ToInt:
+    case EOpConvIntToInt64:
+    case EOpConvUint64ToUint:
+    case EOpConvUintToUint64:
+    case EOpConvInt64ToUint64:
+    case EOpConvUint64ToInt64:
+    case EOpConvInt64ToUint:
+    case EOpConvUintToInt64:
+    case EOpConvUint64ToInt:
+    case EOpConvIntToUint64:
 
     // unary operations
     case EOpNegative:
@@ -1624,11 +1681,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/LiveTraverser.h b/glslang/MachineIndependent/LiveTraverser.h
new file mode 100644
index 0000000..5a90204
--- /dev/null
+++ b/glslang/MachineIndependent/LiveTraverser.h
@@ -0,0 +1,134 @@
+//
+//Copyright (C) 2016 LunarG, Inc.
+//
+//All rights reserved.
+//
+//Redistribution and use in source and binary forms, with or without
+//modification, are permitted provided that the following conditions
+//are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+//POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "../Include/Common.h"
+#include "reflection.h"
+#include "localintermediate.h"
+
+#include "gl_types.h"
+
+#include <list>
+#include <unordered_set>
+
+namespace glslang {
+
+//
+// The traverser: mostly pass through, except
+//  - processing function-call nodes to push live functions onto the stack of functions to process
+//  - processing selection nodes to trim semantically dead code
+//
+// This is in the glslang namespace directly so it can be a friend of TReflection.
+// This can be derived from to implement reflection database traversers or
+// binding mappers: anything that wants to traverse the live subset of the tree.
+//
+
+class TLiveTraverser : public TIntermTraverser {
+public:
+    TLiveTraverser(const TIntermediate& i, bool traverseAll = false) :
+        intermediate(i), traverseAll(traverseAll)
+    { }
+
+    //
+    // Given a function name, find its subroot in the tree, and push it onto the stack of
+    // functions left to process.
+    //
+    void pushFunction(const TString& name)
+    {
+        TIntermSequence& globals = intermediate.getTreeRoot()->getAsAggregate()->getSequence();
+        for (unsigned int f = 0; f < globals.size(); ++f) {
+            TIntermAggregate* candidate = globals[f]->getAsAggregate();
+            if (candidate && candidate->getOp() == EOpFunction && candidate->getName() == name) {
+                functions.push_back(candidate);
+                break;
+            }
+        }
+    }
+
+    typedef std::list<TIntermAggregate*> TFunctionStack;
+    TFunctionStack functions;
+
+protected:
+    // To catch which function calls are not dead, and hence which functions must be visited.
+    virtual bool visitAggregate(TVisit, TIntermAggregate* node)
+    {
+        if (!traverseAll)
+            if (node->getOp() == EOpFunctionCall)
+                addFunctionCall(node);
+
+        return true; // traverse this subtree
+    }
+
+    // To prune semantically dead paths.
+    virtual bool visitSelection(TVisit /* visit */,  TIntermSelection* node)
+    {
+        if (traverseAll)
+            return true; // traverse all code
+
+        TIntermConstantUnion* constant = node->getCondition()->getAsConstantUnion();
+        if (constant) {
+            // cull the path that is dead
+            if (constant->getConstArray()[0].getBConst() == true && node->getTrueBlock())
+                node->getTrueBlock()->traverse(this);
+            if (constant->getConstArray()[0].getBConst() == false && node->getFalseBlock())
+                node->getFalseBlock()->traverse(this);
+
+            return false; // don't traverse any more, we did it all above
+        } else
+            return true; // traverse the whole subtree
+    }
+
+    // Track live functions as well as uniforms, so that we don't visit dead functions
+    // and only visit each function once.
+    void addFunctionCall(TIntermAggregate* call)
+    {
+        // // just use the map to ensure we process each function at most once
+        if (liveFunctions.find(call->getName()) == liveFunctions.end()) {
+            liveFunctions.insert(call->getName());
+            pushFunction(call->getName());
+        }
+    }
+
+    const TIntermediate& intermediate;
+    typedef std::unordered_set<TString> TLiveFunctions;
+    TLiveFunctions liveFunctions;
+    bool traverseAll;
+
+private:
+    // prevent copy & copy construct
+    TLiveTraverser(TLiveTraverser&);
+    TLiveTraverser& operator=(TLiveTraverser&);
+};
+
+} // namespace glslang
diff --git a/glslang/MachineIndependent/ParseContextBase.cpp b/glslang/MachineIndependent/ParseContextBase.cpp
new file mode 100644
index 0000000..4c1d02a
--- /dev/null
+++ b/glslang/MachineIndependent/ParseContextBase.cpp
@@ -0,0 +1,184 @@
+//
+//Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
+//Copyright (C) 2016 Google, Inc.
+//
+//All rights reserved.
+//
+//Redistribution and use in source and binary forms, with or without
+//modification, are permitted provided that the following conditions
+//are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+//POSSIBILITY OF SUCH DAMAGE.
+//
+
+// Implement the TParseContextBase class.
+
+#include "ParseHelper.h"
+
+extern int yyparse(glslang::TParseContext*);
+
+namespace glslang {
+
+// Select the best matching function for 'call' from 'candidateList'.
+//
+// Assumptions
+//
+// There is no exact match, so a selection algorithm needs to run. That is, the
+// language-specific handler should check for exact match first, to
+// decide what to do, before calling this selector.
+//
+// Input
+//
+//  * list of candidate signatures to select from
+//  * the call
+//  * a predicate function convertible(from, to) that says whether or not type
+//    'from' can implicitly convert to type 'to' (it includes the case of what
+//    the calling language would consider a matching type with no conversion
+//    needed)
+//  * a predicate function better(from1, from2, to1, to2) that says whether or
+//    not a conversion from <-> to2 is considered better than a conversion
+//    from <-> to1 (both in and out directions need testing, as declared by the
+//    formal parameter)
+//
+// Output
+//
+//  * best matching candidate (or none, if no viable candidates found)
+//  * whether there was a tie for the best match (ambiguous overload selection,
+//    caller's choice for how to report)
+//
+const TFunction* TParseContextBase::selectFunction(
+    const TVector<const TFunction*> candidateList,
+    const TFunction& call,
+    std::function<bool(const TType& from, const TType& to)> convertible,
+    std::function<bool(const TType& from, const TType& to1, const TType& to2)> better,
+    /* output */ bool& tie)
+{
+// 
+// Operation
+// 
+// 1. Prune the input list of candidates down to a list of viable candidates,
+// where each viable candidate has
+// 
+//  * at least as many parameters as there are calling arguments, with any
+//    remaining parameters being optional or having default values
+//  * each parameter is true under convertible(A, B), where A is the calling
+//    type for in and B is the formal type, and in addition, for out B is the
+//    calling type and A is the formal type
+// 
+// 2. If there are no viable candidates, return with no match.
+// 
+// 3. If there is only one viable candidate, it is the best match.
+//
+// 4. If there are multiple viable candidates, select the first viable candidate
+// as the incumbent. Compare the incumbent to the next viable candidate, and if
+// that candidate is better (bullets below), make it the incumbent. Repeat, with
+// a linear walk through the viable candidate list. The final incumbent will be
+// returned as the best match. A viable candidate is better than the incumbent if
+// 
+//  * it has a function argument with a better(...) conversion than the incumbent,
+//    for all directions needed by in and out
+//  * the incumbent has no argument with a better(...) conversion then the
+//    candidate, for either in or out (as needed)
+//
+// 5. Check for ambiguity by comparing the best match against all other viable
+// candidates. If any other viable candidate has a function argument with a
+// better(...) conversion than the best candidate (for either in or out
+// directions), return that there was a tie for best.
+//
+
+    tie = false;
+
+    // 1. prune to viable...
+    TVector<const TFunction*> viableCandidates;
+    for (auto it = candidateList.begin(); it != candidateList.end(); ++it) {
+        const TFunction& candidate = *(*it);
+
+        // to even be a potential match, number of arguments has to match
+        if (call.getParamCount() != candidate.getParamCount())
+            continue;
+
+        // see if arguments are convertible
+        bool viable = true;
+        for (int param = 0; param < candidate.getParamCount(); ++param) {
+            if (candidate[param].type->getQualifier().isParamInput()) {
+                if (! convertible(*call[param].type, *candidate[param].type)) {
+                    viable = false;
+                    break;
+                }
+            }
+            if (candidate[param].type->getQualifier().isParamOutput()) {
+                if (! convertible(*candidate[param].type, *call[param].type)) {
+                    viable = false;
+                    break;
+                }
+            }
+        }
+
+        if (viable)
+            viableCandidates.push_back(&candidate);
+    }
+
+    // 2. none viable...
+    if (viableCandidates.size() == 0)
+        return nullptr;
+
+    // 3. only one viable...
+    if (viableCandidates.size() == 1)
+        return viableCandidates.front();
+
+    // 4. find best...
+    auto betterParam = [&call, &better](const TFunction& can1, const TFunction& can2){
+        // is call -> can2 better than call -> can1 for any parameter
+        bool hasBetterParam = false;
+        for (int param = 0; param < call.getParamCount(); ++param) {
+            if (better(*call[param].type, *can1[param].type, *can2[param].type)) {
+                hasBetterParam = true;
+                break;
+            }
+        }
+        return hasBetterParam;
+    };
+
+    const TFunction* incumbent = viableCandidates.front();
+    for (auto it = viableCandidates.begin() + 1; it != viableCandidates.end(); ++it) {
+        const TFunction& candidate = *(*it);
+        if (betterParam(*incumbent, candidate) && ! betterParam(candidate, *incumbent))
+            incumbent = &candidate;
+    }
+
+    // 5. ambiguity...
+    for (auto it = viableCandidates.begin(); it != viableCandidates.end(); ++it) {
+        if (incumbent == *it)
+            continue;
+        const TFunction& candidate = *(*it);
+        if (betterParam(*incumbent, candidate))
+            tie = true;
+    }
+
+    return incumbent;
+}
+
+} // end namespace glslang
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 398de1b..3c9caf1 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"
@@ -55,53 +55,20 @@
             contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0), statementNestingLevel(0),
             inMain(false), postMainReturn(false), currentFunctionType(nullptr), blockName(nullptr),
             limits(resources.limits), parsingBuiltins(parsingBuiltins),
-            afterEOF(false),
             atomicUintOffsets(nullptr), anyIndexLimits(false)
 {
     // ensure we always have a linkage node, even if empty, to simplify tree topology algorithms
     linkage = new TIntermAggregate;
 
-    // set all precision defaults to EpqNone, which is correct for all desktop types
-    // and for ES types that don't have defaults (thus getting an error on use)
-    for (int type = 0; type < EbtNumTypes; ++type)
-        defaultPrecision[type] = EpqNone;
-
-    for (int type = 0; type < maxSamplerIndex; ++type)
-        defaultSamplerPrecision[type] = EpqNone;
-
-    // replace with real precision defaults for those that have them
-    if (profile == EEsProfile) {
-        TSampler sampler;
-        sampler.set(EbtFloat, Esd2D);
-        defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
-        sampler.set(EbtFloat, EsdCube);
-        defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
-        sampler.set(EbtFloat, Esd2D);
-        sampler.external = true;
-        defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
-
-        // If we are parsing built-in computational variables/functions, it is meaningful to record
-        // whether the built-in has no precision qualifier, as that ambiguity
-        // is used to resolve the precision from the supplied arguments/operands instead.
-        // So, we don't actually want to replace EpqNone with a default precision for built-ins.
-        if (! parsingBuiltins) {
-            switch (language) {
-            case EShLangFragment:
-                defaultPrecision[EbtInt] = EpqMedium;
-                defaultPrecision[EbtUint] = EpqMedium;
-                break;
-            default:
-                defaultPrecision[EbtInt] = EpqHigh;
-                defaultPrecision[EbtUint] = EpqHigh;
-                defaultPrecision[EbtFloat] = EpqHigh;
-                break;
-            }
-        }
-
-        defaultPrecision[EbtSampler] = EpqLow;
-        defaultPrecision[EbtAtomicUint] = EpqHigh;
+    // decide whether precision qualifiers should be ignored or respected
+    if (profile == EEsProfile || spvVersion.vulkan > 0) {
+        precisionManager.respectPrecisionQualifiers();
+        if (! parsingBuiltins && language == EShLangFragment && profile != EEsProfile && spvVersion.vulkan > 0)
+            precisionManager.warnAboutDefaults();
     }
 
+    setPrecisionDefaults();
+
     globalUniformDefaults.clear();
     globalUniformDefaults.layoutMatrix = ElmColumnMajor;
     globalUniformDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd140 : ElpShared;
@@ -131,6 +98,60 @@
     delete [] atomicUintOffsets;
 }
 
+// Set up all default precisions as needed by the current environment.
+// Intended just as a TParseContext constructor helper.
+void TParseContext::setPrecisionDefaults()
+{
+    // Set all precision defaults to EpqNone, which is correct for all types
+    // when not obeying precision qualifiers, and correct for types that don't
+    // have defaults (thus getting an error on use) when obeying precision
+    // qualifiers.
+
+    for (int type = 0; type < EbtNumTypes; ++type)
+        defaultPrecision[type] = EpqNone;
+
+    for (int type = 0; type < maxSamplerIndex; ++type)
+        defaultSamplerPrecision[type] = EpqNone;
+
+    // replace with real precision defaults for those that have them
+    if (obeyPrecisionQualifiers()) {
+        if (profile == EEsProfile) {
+            // Most don't have defaults, a few default to lowp.
+            TSampler sampler;
+            sampler.set(EbtFloat, Esd2D);
+            defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
+            sampler.set(EbtFloat, EsdCube);
+            defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
+            sampler.set(EbtFloat, Esd2D);
+            sampler.external = true;
+            defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
+        } else {
+            // Non-ES profile
+            // All default to highp.
+            for (int type = 0; type < maxSamplerIndex; ++type)
+                defaultSamplerPrecision[type] = EpqHigh;
+        }
+
+        // If we are parsing built-in computational variables/functions, it is meaningful to record
+        // whether the built-in has no precision qualifier, as that ambiguity
+        // is used to resolve the precision from the supplied arguments/operands instead.
+        // So, we don't actually want to replace EpqNone with a default precision for built-ins.
+        if (! parsingBuiltins) {
+            if (profile == EEsProfile && language == EShLangFragment) {
+                defaultPrecision[EbtInt] = EpqMedium;
+                defaultPrecision[EbtUint] = EpqMedium;
+            } else {
+                defaultPrecision[EbtInt] = EpqHigh;
+                defaultPrecision[EbtUint] = EpqHigh;
+                defaultPrecision[EbtFloat] = EpqHigh;
+            }
+        }
+
+        defaultPrecision[EbtSampler] = EpqLow;
+        defaultPrecision[EbtAtomicUint] = EpqHigh;
+    }
+}
+
 void TParseContext::setLimits(const TBuiltInResource& r)
 {
     resources = r;
@@ -171,13 +192,15 @@
 }
 
 // This is called from bison when it has a parse (syntax) error
+// Note though that to stop cascading errors, we set EOF, which
+// will usually cause a syntax error, so be more accurate that
+// compilation is terminating.
 void TParseContext::parserError(const char* s)
 {
-    if (afterEOF) {
-        if (tokensBeforeEOF == 1)
-            error(getCurrentLoc(), "", "premature end of input", s, "");
-    } else
+    if (! getScanner()->atEndOfInput() || numErrors == 0)
         error(getCurrentLoc(), "", "", s, "");
+    else
+        error(getCurrentLoc(), "compilation terminated", "", "");
 }
 
 void TParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>& tokens)
@@ -253,7 +276,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 +784,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 +907,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())
@@ -994,7 +1036,7 @@
         error(loc, "can't find function", function.getName().c_str(), "");
     // Note:  'prevDec' could be 'function' if this is the first time we've seen function
     // as it would have just been put in the symbol table.  Otherwise, we're looking up
-    // an earlier occurance.
+    // an earlier occurrence.
 
     if (prevDec && prevDec->isDefined()) {
         // Then this function already has a body.
@@ -1009,20 +1051,25 @@
         currentFunctionType = new TType(EbtVoid);
     functionReturnsValue = false;
 
-    //
-    // Raise error message if main function takes any parameters or returns anything other than void
-    //
-    if (function.getName() == intermediate.getEntryPoint().c_str()) {
-        if (function.getParamCount() > 0)
-            error(loc, "function cannot take any parameter(s)", function.getName().c_str(), "");
-        if (function.getType().getBasicType() != EbtVoid)
-            error(loc, "", function.getType().getBasicTypeString().c_str(), "main function cannot return a value");
-        intermediate.addMainCount();
+    // Check for entry point
+    if (function.getName().compare(intermediate.getEntryPointName().c_str()) == 0) {
+        intermediate.setEntryPointMangledName(function.getMangledName().c_str());
+        intermediate.incrementEntryPointCount();
         inMain = true;
     } else
         inMain = false;
 
     //
+    // Raise error message if main function takes any parameters or returns anything other than void
+    //
+    if (inMain) {
+        if (function.getParamCount() > 0)
+            error(loc, "function cannot take any parameter(s)", function.getName().c_str(), "");
+        if (function.getType().getBasicType() != EbtVoid)
+            error(loc, "", function.getType().getBasicTypeString().c_str(), "entry point cannot return a value");
+    }
+
+    //
     // New symbol table scope for body of function plus its arguments
     //
     symbolTable.push();
@@ -1204,7 +1251,9 @@
     TIntermTyped *result = intermediate.addBuiltInFunctionCall(loc, function.getBuiltInOp(),
                                                                function.getParamCount() == 1,
                                                                &arguments, function.getType());
-    computeBuiltinPrecisions(*result, function);
+    if (obeyPrecisionQualifiers())
+        computeBuiltinPrecisions(*result, function);
+
     if (result == nullptr)  {
         error(arguments.getLoc(), " wrong operand type", "Internal Error",
                                   "built in unary operator function.  Type: %s",
@@ -1252,9 +1301,6 @@
     TPrecisionQualifier operationPrecision = EpqNone;
     TPrecisionQualifier resultPrecision = EpqNone;
 
-    if (profile != EEsProfile)
-        return;
-
     TIntermOperator* opNode = node.getAsOperator();
     if (opNode == nullptr)
         return;
@@ -1864,6 +1910,24 @@
     return new TFunction(&empty, type, op);
 }
 
+// Handle seeing a precision qualifier in the grammar.
+void TParseContext::handlePrecisionQualifier(const TSourceLoc& loc, TQualifier& qualifier, TPrecisionQualifier precision)
+{
+    if (obeyPrecisionQualifiers())
+        qualifier.precision = precision;
+}
+
+// Check for messages to give on seeing a precision qualifier used in a
+// declaration in the grammar.
+void TParseContext::checkPrecisionQualifier(const TSourceLoc& loc, TPrecisionQualifier)
+{
+    if (precisionManager.shouldWarnAboutDefaults()) {
+        warn(loc, "all default precisions are highp; use precision statements to quiet warning, e.g.:\n"
+                  "         \"precision mediump int; precision highp float;\"", "", "");
+        precisionManager.defaultWarningGiven();
+    }
+}
+
 //
 // Same error message for all places assignments don't work.
 //
@@ -2869,8 +2933,11 @@
     if (basicType == EbtInt || basicType == EbtFloat) {
         if (publicType.isScalar()) {
             defaultPrecision[basicType] = qualifier;
-            if (basicType == EbtInt)
+            if (basicType == EbtInt) {
                 defaultPrecision[EbtUint] = qualifier;
+                precisionManager.explicitIntDefaultSeen();
+            } else
+                precisionManager.explicitFloatDefaultSeen();
 
             return;  // all is well
         }
@@ -2915,7 +2982,7 @@
 {
     // Built-in symbols are allowed some ambiguous precisions, to be pinned down
     // later by context.
-    if (profile != EEsProfile || parsingBuiltins)
+    if (! obeyPrecisionQualifiers() || parsingBuiltins)
         return;
 
     if (baseType == EbtAtomicUint && qualifier.precision != EpqNone && qualifier.precision != EpqHigh)
@@ -4825,10 +4892,10 @@
     // more than one function."
 
     const TFunction* candidate = nullptr;
-    TVector<TFunction*> candidateList;
+    TVector<const TFunction*> candidateList;
     symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);
 
-    for (TVector<TFunction*>::const_iterator it = candidateList.begin(); it != candidateList.end(); ++it) {
+    for (auto it = candidateList.begin(); it != candidateList.end(); ++it) {
         const TFunction& function = *(*it);
 
         // to even be a potential match, number of arguments has to match
@@ -4876,10 +4943,100 @@
 }
 
 // Function finding algorithm for desktop version 400 and above.
+//
+// "When function calls are resolved, an exact type match for all the arguments
+// is sought. If an exact match is found, all other functions are ignored, and
+// the exact match is used. If no exact match is found, then the implicit
+// conversions in section 4.1.10 Implicit Conversions will be applied to find
+// a match. Mismatched types on input parameters (in or inout or default) must
+// have a conversion from the calling argument type to the formal parameter type.
+// Mismatched types on output parameters (out or inout) must have a conversion
+// from the formal parameter type to the calling argument type.
+//
+// "If implicit conversions can be used to find more than one matching function,
+// a single best-matching function is sought. To determine a best match, the
+// conversions between calling argument and formal parameter types are compared
+// for each function argument and pair of matching functions. After these
+// comparisons are performed, each pair of matching functions are compared.
+// A function declaration A is considered a better match than function
+// declaration B if
+//
+//  * for at least one function argument, the conversion for that argument in A
+//    is better than the corresponding conversion in B; and
+//  * there is no function argument for which the conversion in B is better than
+//    the corresponding conversion in A.
+//
+// "If a single function declaration is considered a better match than every
+// other matching function declaration, it will be used. Otherwise, a
+// compile-time semantic error for an ambiguous overloaded function call occurs.
+//
+// "To determine whether the conversion for a single argument in one match is
+// better than that for another match, the following rules are applied, in order:
+//
+//  1. An exact match is better than a match involving any implicit conversion.
+//  2. A match involving an implicit conversion from float to double is better
+//     than a match involving any other implicit conversion.
+//  3. A match involving an implicit conversion from either int or uint to float
+//     is better than a match involving an implicit conversion from either int
+//     or uint to double.
+//
+// "If none of the rules above apply to a particular pair of conversions, neither
+// conversion is considered better than the other."
+//
 const TFunction* TParseContext::findFunction400(const TSourceLoc& loc, const TFunction& call, bool& builtIn)
 {
-    // TODO: 4.00 functionality: findFunction400()
-    return findFunction120(loc, call, builtIn);
+    // first, look for an exact match
+    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);
+    if (symbol)
+        return symbol->getAsFunction();
+
+    // no exact match, use the generic selector, parameterized by the GLSL rules
+
+    // create list of candidates to send
+    TVector<const TFunction*> candidateList;
+    symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);
+    
+    // can 'from' convert to 'to'?
+    const auto convertible = [this](const TType& from, const TType& to) {
+        if (from == to)
+            return true;
+        if (from.isArray() || to.isArray() || ! from.sameElementShape(to))
+            return false;
+        return intermediate.canImplicitlyPromote(from.getBasicType(), to.getBasicType());
+    };
+
+    // Is 'to2' a better conversion than 'to1'?
+    // Ties should not be considered as better.
+    // Assumes 'convertible' already said true.
+    const auto better = [](const TType& from, const TType& to1, const TType& to2) {
+        // 1. exact match
+        if (from == to2)
+            return from != to1;
+        if (from == to1)
+            return false;
+
+        // 2. float -> double is better
+        if (from.getBasicType() == EbtFloat) {
+            if (to2.getBasicType() == EbtDouble && to1.getBasicType() != EbtDouble)
+                return true;
+        }
+
+        // 3. -> float is better than -> double
+        return to2.getBasicType() == EbtFloat && to1.getBasicType() == EbtDouble;
+    };
+
+    // for ambiguity reporting
+    bool tie = false;
+    
+    // send to the generic selector
+    const TFunction* bestMatch = selectFunction(candidateList, call, convertible, better, tie);
+
+    if (bestMatch == nullptr)
+        error(loc, "no matching overloaded function found", call.getName().c_str(), "");
+    else if (tie)
+        error(loc, "ambiguous best function under implicit type conversion", call.getName().c_str(), "");
+
+    return bestMatch;
 }
 
 // When a declaration includes a type, but not a variable name, it can be 
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index 544c3d3..aa92954 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -77,10 +77,10 @@
                       EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
                       TInfoSink& infoSink, bool forwardCompatible, EShMessages messages)
           : TParseVersions(interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
-            symbolTable(symbolTable), tokensBeforeEOF(false),
+            symbolTable(symbolTable),
             linkage(nullptr), scanContext(nullptr), ppContext(nullptr) { }
     virtual ~TParseContextBase() { }
-    
+
     virtual void setLimits(const TBuiltInResource&) = 0;
     
     EShLanguage getLanguage() const { return language; }
@@ -125,7 +125,6 @@
     }
 
     TSymbolTable& symbolTable;   // symbol table that goes with the current language, version, and profile
-    bool tokensBeforeEOF;
 
 protected:
     TParseContextBase(TParseContextBase&);
@@ -142,6 +141,46 @@
     std::function<void(int, int, const char*)> versionCallback;
     std::function<void(int, const char*, const char*)> extensionCallback;
     std::function<void(int, const char*)> errorCallback;
+
+    // see implementation for detail
+    const TFunction* selectFunction(const TVector<const TFunction*>, const TFunction&,
+        std::function<bool(const TType&, const TType&)>,
+        std::function<bool(const TType&, const TType&, const TType&)>,
+        /* output */ bool& tie);
+};
+
+//
+// Manage the state for when to respect precision qualifiers and when to warn about
+// the defaults being different than might be expected.
+//
+class TPrecisionManager {
+public:
+    TPrecisionManager() : obey(false), warn(false), explicitIntDefault(false), explicitFloatDefault(false){ }
+    virtual ~TPrecisionManager() {}
+
+    void respectPrecisionQualifiers() { obey = true; }
+    bool respectingPrecisionQualifiers() const { return obey; }
+    bool shouldWarnAboutDefaults() const { return warn; }
+    void defaultWarningGiven() { warn = false; }
+    void warnAboutDefaults() { warn = true; }
+    void explicitIntDefaultSeen()
+    {
+        explicitIntDefault = true;
+        if (explicitFloatDefault)
+            warn = false;
+    }
+    void explicitFloatDefaultSeen()
+    {
+        explicitFloatDefault = true;
+        if (explicitIntDefault)
+            warn = false;
+    }
+
+protected:
+    bool obey;                  // respect precision qualifiers
+    bool warn;                  // need to give a warning about the defaults
+    bool explicitIntDefault;    // user set the default for int/uint
+    bool explicitFloatDefault;  // user set the default for float
 };
 
 //
@@ -155,6 +194,9 @@
                   bool forwardCompatible = false, EShMessages messages = EShMsgDefault);
     virtual ~TParseContext();
 
+    bool obeyPrecisionQualifiers() const { return precisionManager.respectingPrecisionQualifiers(); };
+    void setPrecisionDefaults();
+
     void setLimits(const TBuiltInResource&);
     bool parseShaderStrings(TPpContext&, TInputScanner& input, bool versionWillBeError = false);
     void parserError(const char* s);     // for bison's yyerror
@@ -209,6 +251,8 @@
     void userFunctionCallCheck(const TSourceLoc&, TIntermAggregate&);
     void samplerConstructorLocationCheck(const TSourceLoc&, const char* token, TIntermNode*);
     TFunction* handleConstructorCall(const TSourceLoc&, const TPublicType&);
+    void handlePrecisionQualifier(const TSourceLoc&, TQualifier&, TPrecisionQualifier);
+    void checkPrecisionQualifier(const TSourceLoc&, TPrecisionQualifier);
 
     bool parseVectorFields(const TSourceLoc&, const TString&, int vecSize, TVectorFields&);
     void assignError(const TSourceLoc&, const char* op, TString left, TString right);
@@ -341,7 +385,7 @@
     const bool parsingBuiltins;        // true if parsing built-in symbols/functions
     static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2 * 2 * 2 * 2)); // see computeSamplerTypeIndex()
     TPrecisionQualifier defaultSamplerPrecision[maxSamplerIndex];
-    bool afterEOF;
+    TPrecisionManager precisionManager;
     TQualifier globalBufferDefaults;
     TQualifier globalUniformDefaults;
     TQualifier globalInputDefaults;
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/Scan.h b/glslang/MachineIndependent/Scan.h
index 4282cd5..67c86d2 100644
--- a/glslang/MachineIndependent/Scan.h
+++ b/glslang/MachineIndependent/Scan.h
@@ -204,6 +204,8 @@
         currentSource = numSources;
     }
 
+    bool atEndOfInput() const { return endOfFileReached; }
+
     const TSourceLoc& getSourceLoc() const
     {
         if (singleLogical) {
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index dccc1f0..414a62b 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.
@@ -676,10 +695,9 @@
     TParseContextBase* parseContext;
     if (source == EShSourceHlsl) {
         parseContext = new HlslParseContext(symbolTable, intermediate, false, version, profile, spvVersion,
-                                             compiler->getLanguage(), compiler->infoSink, forwardCompatible, messages);
-    }
-    else {
-        intermediate.setEntryPoint("main");
+                                            compiler->getLanguage(), compiler->infoSink, forwardCompatible, messages);
+    } else {
+        intermediate.setEntryPointName("main");
         parseContext = new TParseContext(symbolTable, intermediate, false, version, profile, spvVersion,
                                          compiler->getLanguage(), compiler->infoSink, forwardCompatible, messages);
     }
@@ -1092,9 +1110,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 +1123,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;
+                    }
                 }
             }
         }
@@ -1463,7 +1485,7 @@
 
 void TShader::setEntryPoint(const char* entryPoint)
 {
-    intermediate->setEntryPoint(entryPoint);
+    intermediate->setEntryPointName(entryPoint);
 }
 
 //
diff --git a/glslang/MachineIndependent/SymbolTable.cpp b/glslang/MachineIndependent/SymbolTable.cpp
index bf0f1f9..2068f26 100644
--- a/glslang/MachineIndependent/SymbolTable.cpp
+++ b/glslang/MachineIndependent/SymbolTable.cpp
@@ -35,7 +35,7 @@
 //
 
 //
-// Symbol table for parsing.  Most functionaliy and main ideas
+// Symbol table for parsing.  Most functionality and main ideas
 // are documented in the header file.
 //
 
@@ -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/SymbolTable.h b/glslang/MachineIndependent/SymbolTable.h
index 9877ab7..97c3d6b 100644
--- a/glslang/MachineIndependent/SymbolTable.h
+++ b/glslang/MachineIndependent/SymbolTable.h
@@ -357,7 +357,7 @@
             return (*it).second;
     }
 
-    void findFunctionNameList(const TString& name, TVector<TFunction*>& list)
+    void findFunctionNameList(const TString& name, TVector<const TFunction*>& list)
     {
         size_t parenAt = name.find_first_of('(');
         TString base(name, 0, parenAt + 1);
@@ -624,7 +624,7 @@
         return false;
     }
 
-    void findFunctionNameList(const TString& name, TVector<TFunction*>& list, bool& builtIn)
+    void findFunctionNameList(const TString& name, TVector<const TFunction*>& list, bool& builtIn)
     {
         // For user levels, return the set found in the first scope with a match
         builtIn = false;
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index 72bad94..a1628f6 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -1125,6 +1125,7 @@
         $$ = $1;
     }
     | precision_qualifier {
+        parseContext.checkPrecisionQualifier($1.loc, $1.qualifier.precision);
         $$ = $1;
     }
     | interpolation_qualifier {
@@ -2206,20 +2207,17 @@
     : HIGH_PRECISION {
         parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "highp precision qualifier");
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
-        if (parseContext.profile == EEsProfile)
-            $$.qualifier.precision = EpqHigh;
+        parseContext.handlePrecisionQualifier($1.loc, $$.qualifier, EpqHigh);
     }
     | MEDIUM_PRECISION {
         parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "mediump precision qualifier");
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
-        if (parseContext.profile == EEsProfile)
-            $$.qualifier.precision = EpqMedium;
+        parseContext.handlePrecisionQualifier($1.loc, $$.qualifier, EpqMedium);
     }
     | LOW_PRECISION {
         parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "lowp precision qualifier");
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
-        if (parseContext.profile == EEsProfile)
-            $$.qualifier.precision = EpqLow;
+        parseContext.handlePrecisionQualifier($1.loc, $$.qualifier, EpqLow);
     }
     ;
 
diff --git a/glslang/MachineIndependent/glslang_tab.cpp b/glslang/MachineIndependent/glslang_tab.cpp
index 0d1dc43..3d7dc8e 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp
+++ b/glslang/MachineIndependent/glslang_tab.cpp
@@ -801,35 +801,35 @@
      904,   914,   924,   933,   936,   940,   944,   949,   957,   962,
      967,   972,   977,   986,   997,  1024,  1033,  1040,  1047,  1054,
     1066,  1072,  1075,  1082,  1086,  1090,  1098,  1107,  1110,  1121,
-    1124,  1127,  1130,  1134,  1138,  1145,  1149,  1161,  1175,  1180,
-    1186,  1192,  1199,  1205,  1210,  1215,  1220,  1227,  1231,  1235,
-    1239,  1243,  1247,  1253,  1265,  1268,  1273,  1277,  1286,  1291,
-    1299,  1303,  1313,  1317,  1321,  1326,  1330,  1335,  1340,  1345,
-    1349,  1354,  1359,  1364,  1370,  1376,  1382,  1387,  1392,  1397,
-    1402,  1407,  1412,  1418,  1424,  1430,  1436,  1442,  1448,  1454,
-    1460,  1466,  1471,  1476,  1481,  1486,  1491,  1496,  1501,  1506,
-    1511,  1516,  1521,  1526,  1532,  1538,  1544,  1550,  1556,  1562,
-    1568,  1574,  1580,  1586,  1592,  1598,  1603,  1608,  1613,  1618,
-    1623,  1628,  1633,  1638,  1643,  1648,  1653,  1658,  1663,  1668,
-    1673,  1678,  1683,  1688,  1693,  1698,  1703,  1708,  1713,  1718,
-    1723,  1728,  1733,  1738,  1743,  1748,  1753,  1758,  1763,  1768,
-    1773,  1778,  1783,  1788,  1793,  1798,  1803,  1808,  1813,  1818,
-    1823,  1828,  1833,  1838,  1843,  1848,  1853,  1858,  1863,  1868,
-    1873,  1878,  1883,  1888,  1893,  1898,  1903,  1908,  1913,  1918,
-    1923,  1928,  1933,  1938,  1943,  1948,  1953,  1958,  1963,  1968,
-    1973,  1978,  1983,  1988,  1993,  1998,  2003,  2008,  2013,  2018,
-    2023,  2028,  2033,  2038,  2043,  2048,  2053,  2058,  2063,  2068,
-    2073,  2078,  2083,  2088,  2093,  2098,  2103,  2108,  2113,  2118,
-    2123,  2128,  2133,  2138,  2143,  2149,  2155,  2161,  2167,  2173,
-    2179,  2185,  2190,  2206,  2212,  2218,  2227,  2227,  2238,  2238,
-    2248,  2251,  2264,  2282,  2306,  2310,  2316,  2321,  2332,  2335,
-    2341,  2350,  2353,  2359,  2363,  2364,  2370,  2371,  2372,  2373,
-    2374,  2375,  2376,  2380,  2381,  2385,  2381,  2397,  2398,  2402,
-    2402,  2409,  2409,  2423,  2426,  2434,  2442,  2453,  2454,  2458,
-    2465,  2469,  2477,  2481,  2494,  2494,  2514,  2517,  2523,  2535,
-    2547,  2547,  2562,  2562,  2578,  2578,  2599,  2602,  2608,  2611,
-    2617,  2621,  2628,  2633,  2638,  2645,  2648,  2657,  2661,  2668,
-    2671,  2677,  2677
+    1124,  1127,  1131,  1135,  1139,  1146,  1150,  1162,  1176,  1181,
+    1187,  1193,  1200,  1206,  1211,  1216,  1221,  1228,  1232,  1236,
+    1240,  1244,  1248,  1254,  1266,  1269,  1274,  1278,  1287,  1292,
+    1300,  1304,  1314,  1318,  1322,  1327,  1331,  1336,  1341,  1346,
+    1350,  1355,  1360,  1365,  1371,  1377,  1383,  1388,  1393,  1398,
+    1403,  1408,  1413,  1419,  1425,  1431,  1437,  1443,  1449,  1455,
+    1461,  1467,  1472,  1477,  1482,  1487,  1492,  1497,  1502,  1507,
+    1512,  1517,  1522,  1527,  1533,  1539,  1545,  1551,  1557,  1563,
+    1569,  1575,  1581,  1587,  1593,  1599,  1604,  1609,  1614,  1619,
+    1624,  1629,  1634,  1639,  1644,  1649,  1654,  1659,  1664,  1669,
+    1674,  1679,  1684,  1689,  1694,  1699,  1704,  1709,  1714,  1719,
+    1724,  1729,  1734,  1739,  1744,  1749,  1754,  1759,  1764,  1769,
+    1774,  1779,  1784,  1789,  1794,  1799,  1804,  1809,  1814,  1819,
+    1824,  1829,  1834,  1839,  1844,  1849,  1854,  1859,  1864,  1869,
+    1874,  1879,  1884,  1889,  1894,  1899,  1904,  1909,  1914,  1919,
+    1924,  1929,  1934,  1939,  1944,  1949,  1954,  1959,  1964,  1969,
+    1974,  1979,  1984,  1989,  1994,  1999,  2004,  2009,  2014,  2019,
+    2024,  2029,  2034,  2039,  2044,  2049,  2054,  2059,  2064,  2069,
+    2074,  2079,  2084,  2089,  2094,  2099,  2104,  2109,  2114,  2119,
+    2124,  2129,  2134,  2139,  2144,  2150,  2156,  2162,  2168,  2174,
+    2180,  2186,  2191,  2207,  2212,  2217,  2225,  2225,  2236,  2236,
+    2246,  2249,  2262,  2280,  2304,  2308,  2314,  2319,  2330,  2333,
+    2339,  2348,  2351,  2357,  2361,  2362,  2368,  2369,  2370,  2371,
+    2372,  2373,  2374,  2378,  2379,  2383,  2379,  2395,  2396,  2400,
+    2400,  2407,  2407,  2421,  2424,  2432,  2440,  2451,  2452,  2456,
+    2463,  2467,  2475,  2479,  2492,  2492,  2512,  2515,  2521,  2533,
+    2545,  2545,  2560,  2560,  2576,  2576,  2597,  2600,  2606,  2609,
+    2615,  2619,  2626,  2631,  2636,  2643,  2646,  2655,  2659,  2666,
+    2669,  2675,  2675
 };
 #endif
 
@@ -4594,49 +4594,50 @@
   case 141:
 #line 1127 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
+        parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision);
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4600 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4601 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 142:
-#line 1130 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1131 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4609 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4610 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 143:
-#line 1134 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1135 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4618 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 144:
-#line 1138 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1139 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4627 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4628 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 145:
-#line 1145 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1146 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqConst;  // will later turn into EvqConstReadOnly, if the initializer is not constant
     }
-#line 4636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4637 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 146:
-#line 1149 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1150 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute");
@@ -4649,11 +4650,11 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 4653 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4654 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 147:
-#line 1161 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1162 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying");
@@ -4668,43 +4669,43 @@
         else
             (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 4672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4673 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 148:
-#line 1175 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1176 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "inout");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqInOut;
     }
-#line 4682 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4683 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 149:
-#line 1180 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1181 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "in");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqIn;
     }
-#line 4693 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4694 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 150:
-#line 1186 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1187 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "out");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqOut;
     }
-#line 4704 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4705 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 151:
-#line 1192 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1193 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid");
@@ -4712,52 +4713,52 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.centroid = true;
     }
-#line 4716 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4717 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 152:
-#line 1199 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1200 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "patch");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.patch = true;
     }
-#line 4727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4728 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 153:
-#line 1205 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "sample");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.sample = true;
     }
-#line 4737 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4738 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 154:
-#line 1210 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1211 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "uniform");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqUniform;
     }
-#line 4747 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4748 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 155:
-#line 1215 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1216 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "buffer");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqBuffer;
     }
-#line 4757 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4758 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 156:
-#line 1220 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1221 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared");
@@ -4765,67 +4766,67 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqShared;
     }
-#line 4769 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4770 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 157:
-#line 1227 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1228 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.coherent = true;
     }
-#line 4778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4779 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 158:
-#line 1231 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1232 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.volatil = true;
     }
-#line 4787 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4788 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 159:
-#line 1235 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1236 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.restrict = true;
     }
-#line 4796 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4797 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 160:
-#line 1239 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1240 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.readonly = true;
     }
-#line 4805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4806 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 161:
-#line 1243 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1244 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.writeonly = true;
     }
-#line 4814 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4815 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 162:
-#line 1247 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1248 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqUniform;
     }
-#line 4825 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4826 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 163:
-#line 1253 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1254 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine");
@@ -4835,56 +4836,56 @@
         // 1) make sure each identifier is a type declared earlier with SUBROUTINE
         // 2) save all of the identifiers for future comparison with the declared function
     }
-#line 4839 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4840 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 164:
-#line 1265 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1266 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // TODO: 4.0 functionality: subroutine type to list
     }
-#line 4847 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4848 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 165:
-#line 1268 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1269 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     }
-#line 4854 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4855 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 166:
-#line 1273 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1274 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
     }
-#line 4863 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4864 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 167:
-#line 1277 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1278 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.arrayDimCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes, 0);
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
         (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes;
     }
-#line 4874 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4875 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 168:
-#line 1286 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1287 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 4884 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4885 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 169:
-#line 1291 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[-2].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
@@ -4893,20 +4894,20 @@
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size);
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 4897 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4898 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 170:
-#line 1299 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1300 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-2].interm);
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 4906 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4907 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 171:
-#line 1303 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1304 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-3].interm);
 
@@ -4914,1738 +4915,1738 @@
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size);
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 4918 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4919 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 172:
-#line 1313 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1314 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtVoid;
     }
-#line 4927 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4928 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 173:
-#line 1317 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1318 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 4936 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4937 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 174:
-#line 1321 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1322 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 4946 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4947 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 175:
-#line 1326 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1327 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 4955 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4956 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 176:
-#line 1330 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1331 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 4965 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4966 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 177:
-#line 1335 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1336 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
     }
-#line 4975 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4976 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 178:
-#line 1340 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1341 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
     }
-#line 4985 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4986 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 179:
-#line 1345 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1346 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
     }
-#line 4994 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4995 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 180:
-#line 1349 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1350 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(2);
     }
-#line 5004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5005 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 181:
-#line 1354 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1355 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(3);
     }
-#line 5014 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5015 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 182:
-#line 1359 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1360 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(4);
     }
-#line 5024 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5025 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 183:
-#line 1364 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1365 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(2);
     }
-#line 5035 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5036 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 184:
-#line 1370 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1371 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(3);
     }
-#line 5046 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5047 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 185:
-#line 1376 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1377 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(4);
     }
-#line 5057 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5058 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 186:
-#line 1382 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1383 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(2);
     }
-#line 5067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5068 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 187:
-#line 1387 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1388 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(3);
     }
-#line 5077 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 188:
-#line 1392 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1393 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(4);
     }
-#line 5087 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5088 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 189:
-#line 1397 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1398 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(2);
     }
-#line 5097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5098 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 190:
-#line 1402 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1403 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(3);
     }
-#line 5107 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5108 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 191:
-#line 1407 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1408 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(4);
     }
-#line 5117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5118 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 192:
-#line 1412 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1413 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(2);
     }
-#line 5128 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 193:
-#line 1418 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1419 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(3);
     }
-#line 5139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5140 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 194:
-#line 1424 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1425 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(4);
     }
-#line 5150 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5151 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 195:
-#line 1430 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1431 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(2);
     }
-#line 5161 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5162 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 196:
-#line 1436 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1437 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(3);
     }
-#line 5172 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5173 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 197:
-#line 1442 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1443 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(4);
     }
-#line 5183 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5184 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 198:
-#line 1448 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1449 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(2);
     }
-#line 5194 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5195 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 199:
-#line 1454 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1455 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(3);
     }
-#line 5205 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5206 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 200:
-#line 1460 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1461 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(4);
     }
-#line 5216 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5217 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 201:
-#line 1466 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1467 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 5226 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5227 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 202:
-#line 1471 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1472 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 5236 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5237 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 203:
-#line 1476 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1477 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 5246 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5247 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 204:
-#line 1481 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1482 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 5256 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5257 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 205:
-#line 1486 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1487 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 5266 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5267 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 206:
-#line 1491 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 5276 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5277 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 207:
-#line 1496 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1497 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 5286 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5287 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 208:
-#line 1501 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1502 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 5296 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5297 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 209:
-#line 1506 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1507 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 5306 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5307 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 210:
-#line 1511 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1512 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 5316 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5317 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 211:
-#line 1516 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1517 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 5326 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5327 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 212:
-#line 1521 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1522 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 5336 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 213:
-#line 1526 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1527 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 5347 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5348 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 214:
-#line 1532 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1533 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 5358 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5359 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 215:
-#line 1538 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1539 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 5369 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5370 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 216:
-#line 1544 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1545 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 5380 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5381 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 217:
-#line 1550 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1551 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 5391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5392 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 218:
-#line 1556 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1557 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 5402 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5403 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 219:
-#line 1562 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1563 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 5413 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5414 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 220:
-#line 1568 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1569 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 5424 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5425 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 221:
-#line 1574 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1575 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 5435 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 222:
-#line 1580 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1581 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 5446 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 223:
-#line 1586 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1587 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 5457 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5458 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 224:
-#line 1592 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1593 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 5468 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5469 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 225:
-#line 1598 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1599 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtAtomicUint;
     }
-#line 5478 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5479 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 226:
-#line 1603 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1604 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D);
     }
-#line 5488 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5489 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 227:
-#line 1608 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1609 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
     }
-#line 5498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5499 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 228:
-#line 1613 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1614 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd3D);
     }
-#line 5508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 229:
-#line 1618 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1619 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube);
     }
-#line 5518 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5519 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 230:
-#line 1623 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1624 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true);
     }
-#line 5528 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5529 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 231:
-#line 1628 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1629 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true);
     }
-#line 5538 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5539 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 232:
-#line 1633 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1634 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true);
     }
-#line 5548 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5549 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 233:
-#line 1638 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1639 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true);
     }
-#line 5558 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5559 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 234:
-#line 1643 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1644 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true);
     }
-#line 5568 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5569 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 235:
-#line 1648 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1649 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true);
     }
-#line 5578 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5579 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 236:
-#line 1653 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1654 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true);
     }
-#line 5588 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5589 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 237:
-#line 1658 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1659 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true);
     }
-#line 5598 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5599 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 238:
-#line 1663 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1664 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true);
     }
-#line 5608 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5609 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 239:
-#line 1668 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1669 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D);
     }
-#line 5618 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 240:
-#line 1673 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1674 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D);
     }
-#line 5628 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5629 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 241:
-#line 1678 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1679 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd3D);
     }
-#line 5638 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 242:
-#line 1683 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1684 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube);
     }
-#line 5648 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5649 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 243:
-#line 1688 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1689 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D, true);
     }
-#line 5658 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5659 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 244:
-#line 1693 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1694 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true);
     }
-#line 5668 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5669 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 245:
-#line 1698 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1699 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube, true);
     }
-#line 5678 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5679 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 246:
-#line 1703 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1704 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D);
     }
-#line 5688 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5689 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 247:
-#line 1708 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1709 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D);
     }
-#line 5698 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5699 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 248:
-#line 1713 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1714 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd3D);
     }
-#line 5708 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 249:
-#line 1718 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1719 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube);
     }
-#line 5718 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5719 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 250:
-#line 1723 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1724 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D, true);
     }
-#line 5728 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5729 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 251:
-#line 1728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1729 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true);
     }
-#line 5738 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5739 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 252:
-#line 1733 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1734 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube, true);
     }
-#line 5748 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 253:
-#line 1738 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1739 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect);
     }
-#line 5758 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5759 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 254:
-#line 1743 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1744 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true);
     }
-#line 5768 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5769 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 255:
-#line 1748 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1749 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdRect);
     }
-#line 5778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5779 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 256:
-#line 1753 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1754 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdRect);
     }
-#line 5788 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5789 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 257:
-#line 1758 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1759 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer);
     }
-#line 5798 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5799 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 258:
-#line 1763 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1764 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdBuffer);
     }
-#line 5808 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5809 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 259:
-#line 1768 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1769 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdBuffer);
     }
-#line 5818 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 260:
-#line 1773 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1774 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true);
     }
-#line 5828 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5829 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 261:
-#line 1778 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1779 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true);
     }
-#line 5838 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5839 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 262:
-#line 1783 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1784 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true);
     }
-#line 5848 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5849 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 263:
-#line 1788 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1789 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true);
     }
-#line 5858 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5859 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 264:
-#line 1793 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1794 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true);
     }
-#line 5868 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5869 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 265:
-#line 1798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1799 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true);
     }
-#line 5878 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5879 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 266:
-#line 1803 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1804 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(false);
     }
-#line 5888 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5889 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 267:
-#line 1808 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1809 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(true);
     }
-#line 5898 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5899 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 268:
-#line 1813 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1814 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D);
     }
-#line 5908 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5909 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 269:
-#line 1818 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1819 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D);
     }
-#line 5918 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5919 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 270:
-#line 1823 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1824 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D);
     }
-#line 5928 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5929 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 271:
-#line 1828 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1829 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube);
     }
-#line 5938 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5939 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 272:
-#line 1833 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1834 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true);
     }
-#line 5948 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5949 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 273:
-#line 1838 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1839 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true);
     }
-#line 5958 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5959 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 274:
-#line 1843 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1844 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true);
     }
-#line 5968 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5969 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 275:
-#line 1848 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1849 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D);
     }
-#line 5978 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 276:
-#line 1853 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1854 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D);
     }
-#line 5988 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5989 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 277:
-#line 1858 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1859 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D);
     }
-#line 5998 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5999 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 278:
-#line 1863 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1864 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube);
     }
-#line 6008 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6009 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 279:
-#line 1868 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1869 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true);
     }
-#line 6018 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6019 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 280:
-#line 1873 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1874 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true);
     }
-#line 6028 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6029 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 281:
-#line 1878 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1879 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true);
     }
-#line 6038 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6039 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 282:
-#line 1883 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1884 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D);
     }
-#line 6048 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6049 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 283:
-#line 1888 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1889 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D);
     }
-#line 6058 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6059 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 284:
-#line 1893 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1894 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D);
     }
-#line 6068 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6069 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 285:
-#line 1898 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1899 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube);
     }
-#line 6078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6079 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 286:
-#line 1903 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1904 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true);
     }
-#line 6088 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6089 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 287:
-#line 1908 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1909 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true);
     }
-#line 6098 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6099 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 288:
-#line 1913 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1914 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true);
     }
-#line 6108 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6109 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 289:
-#line 1918 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1919 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect);
     }
-#line 6118 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6119 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 290:
-#line 1923 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1924 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect);
     }
-#line 6128 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 291:
-#line 1928 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1929 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect);
     }
-#line 6138 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 292:
-#line 1933 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1934 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer);
     }
-#line 6148 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 293:
-#line 1938 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1939 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer);
     }
-#line 6158 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6159 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 294:
-#line 1943 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1944 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer);
     }
-#line 6168 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6169 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 295:
-#line 1948 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1949 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true);
     }
-#line 6178 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6179 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 296:
-#line 1953 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1954 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true);
     }
-#line 6188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6189 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 297:
-#line 1958 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1959 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true);
     }
-#line 6198 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6199 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 298:
-#line 1963 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1964 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true);
     }
-#line 6208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6209 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 299:
-#line 1968 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1969 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true);
     }
-#line 6218 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 300:
-#line 1973 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1974 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true);
     }
-#line 6228 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6229 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 301:
-#line 1978 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1979 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D);
     }
-#line 6238 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 302:
-#line 1983 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1984 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D);
     }
-#line 6248 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6249 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 303:
-#line 1988 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1989 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D);
     }
-#line 6258 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6259 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 304:
-#line 1993 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1994 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D);
     }
-#line 6268 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6269 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 305:
-#line 1998 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1999 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D);
     }
-#line 6278 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6279 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 306:
-#line 2003 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2004 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D);
     }
-#line 6288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6289 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 307:
-#line 2008 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2009 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D);
     }
-#line 6298 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6299 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 308:
-#line 2013 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2014 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd3D);
     }
-#line 6308 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6309 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 309:
-#line 2018 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2019 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd3D);
     }
-#line 6318 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6319 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 310:
-#line 2023 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2024 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect);
     }
-#line 6328 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6329 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 311:
-#line 2028 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2029 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdRect);
     }
-#line 6338 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6339 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 312:
-#line 2033 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2034 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdRect);
     }
-#line 6348 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6349 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 313:
-#line 2038 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2039 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube);
     }
-#line 6358 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6359 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 314:
-#line 2043 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2044 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube);
     }
-#line 6368 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6369 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 315:
-#line 2048 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2049 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube);
     }
-#line 6378 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6379 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 316:
-#line 2053 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2054 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer);
     }
-#line 6388 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6389 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 317:
-#line 2058 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2059 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer);
     }
-#line 6398 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6399 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 318:
-#line 2063 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2064 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer);
     }
-#line 6408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6409 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 319:
-#line 2068 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2069 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true);
     }
-#line 6418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6419 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 320:
-#line 2073 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2074 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true);
     }
-#line 6428 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6429 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 321:
-#line 2078 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2079 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true);
     }
-#line 6438 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6439 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 322:
-#line 2083 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2084 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true);
     }
-#line 6448 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6449 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 323:
-#line 2088 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2089 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true);
     }
-#line 6458 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6459 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 324:
-#line 2093 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2094 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true);
     }
-#line 6468 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6469 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 325:
-#line 2098 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2099 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true);
     }
-#line 6478 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6479 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 326:
-#line 2103 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2104 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true);
     }
-#line 6488 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6489 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 327:
-#line 2108 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2109 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true);
     }
-#line 6498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6499 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 328:
-#line 2113 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2114 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true);
     }
-#line 6508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 329:
-#line 2118 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2119 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true);
     }
-#line 6518 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6519 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 330:
-#line 2123 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2124 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true);
     }
-#line 6528 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6529 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 331:
-#line 2128 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2129 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true);
     }
-#line 6538 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6539 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 332:
-#line 2133 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2134 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true);
     }
-#line 6548 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6549 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 333:
-#line 2138 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2139 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
-#line 6558 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6559 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 334:
-#line 2143 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2144 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {  // GL_OES_EGL_image_external
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
         (yyval.interm.type).sampler.external = true;
     }
-#line 6569 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6570 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 335:
-#line 2149 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2150 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat);
     }
-#line 6580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6581 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 336:
-#line 2155 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2156 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat, true);
     }
-#line 6591 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6592 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 337:
-#line 2161 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2162 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt);
     }
-#line 6602 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6603 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 338:
-#line 2167 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2168 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt, true);
     }
-#line 6613 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6614 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 339:
-#line 2173 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2174 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint);
     }
-#line 6624 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6625 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 340:
-#line 2179 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2180 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint, true);
     }
-#line 6635 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 341:
-#line 2185 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2186 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type));
     }
-#line 6645 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6646 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 342:
-#line 2190 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2191 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //
         // This is for user defined type names.  The lexical phase looked up the
@@ -6659,16 +6660,15 @@
         } else
             parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), "");
     }
-#line 6663 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6664 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 343:
-#line 2206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2207 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        if (parseContext.profile == EEsProfile)
-            (yyval.interm.type).qualifier.precision = EpqHigh;
+        parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh);
     }
 #line 6674 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
@@ -6678,31 +6678,29 @@
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        if (parseContext.profile == EEsProfile)
-            (yyval.interm.type).qualifier.precision = EpqMedium;
+        parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium);
     }
-#line 6685 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6684 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 345:
-#line 2218 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2217 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        if (parseContext.profile == EEsProfile)
-            (yyval.interm.type).qualifier.precision = EpqLow;
+        parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow);
     }
-#line 6696 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6694 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 346:
-#line 2227 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2225 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }
-#line 6702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6700 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 347:
-#line 2227 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2225 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string);
         parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure);
@@ -6714,17 +6712,17 @@
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 6718 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6716 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 348:
-#line 2238 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2236 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }
-#line 6724 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6722 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 349:
-#line 2238 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2236 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TType* structure = new TType((yyvsp[-1].interm.typeList), TString(""));
         (yyval.interm.type).init((yyvsp[-4].lex).loc);
@@ -6732,19 +6730,19 @@
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 6736 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6734 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 350:
-#line 2248 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2246 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = (yyvsp[0].interm.typeList);
     }
-#line 6744 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 351:
-#line 2251 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2249 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);
         for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) {
@@ -6755,11 +6753,11 @@
             (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]);
         }
     }
-#line 6759 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6757 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 352:
-#line 2264 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2262 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
@@ -6778,11 +6776,11 @@
             (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type));
         }
     }
-#line 6782 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6780 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 353:
-#line 2282 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2280 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalQualifierFixCheck((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier);
         if ((yyvsp[-2].interm.type).arraySizes) {
@@ -6804,38 +6802,38 @@
             (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type));
         }
     }
-#line 6808 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6806 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 354:
-#line 2306 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2304 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = new TTypeList;
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 6817 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6815 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 355:
-#line 2310 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2308 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 6825 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6823 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 356:
-#line 2316 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2314 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeLine).type = new TType(EbtVoid);
         (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc;
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string);
     }
-#line 6835 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6833 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 357:
-#line 2321 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2319 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.arrayDimCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes, 0);
 
@@ -6844,219 +6842,219 @@
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string);
         (yyval.interm.typeLine).type->newArraySizes(*(yyvsp[0].interm).arraySizes);
     }
-#line 6848 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6846 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 358:
-#line 2332 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2330 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 6856 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6854 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 359:
-#line 2335 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2333 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
     }
-#line 6867 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6865 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 360:
-#line 2341 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2339 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 6878 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6876 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 361:
-#line 2350 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2348 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc());
     }
-#line 6886 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6884 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 362:
-#line 2353 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2351 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
     }
-#line 6894 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6892 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 363:
-#line 2359 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2357 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6900 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6898 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 364:
-#line 2363 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2361 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6906 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 365:
-#line 2364 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2362 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6912 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6910 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 366:
-#line 2370 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2368 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6918 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6916 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 367:
-#line 2371 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2369 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6924 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 368:
-#line 2372 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2370 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6930 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6928 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 369:
-#line 2373 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2371 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6936 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6934 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 370:
-#line 2374 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2372 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6942 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6940 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 371:
-#line 2375 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2373 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6948 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6946 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 372:
-#line 2376 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2374 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6954 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6952 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 373:
-#line 2380 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2378 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = 0; }
-#line 6960 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6958 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 374:
-#line 2381 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2379 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
     }
-#line 6969 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6967 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 375:
-#line 2385 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2383 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
     }
-#line 6978 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6976 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 376:
-#line 2389 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2387 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate())
             (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);
     }
-#line 6988 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6986 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 377:
-#line 2397 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2395 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 6994 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6992 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 378:
-#line 2398 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2396 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7000 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6998 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 379:
-#line 2402 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2400 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7008 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7006 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 380:
-#line 2405 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2403 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7017 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7015 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 381:
-#line 2409 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2407 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7027 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7025 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 382:
-#line 2414 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2412 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7038 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7036 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 383:
-#line 2423 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2421 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
     }
-#line 7046 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7044 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 384:
-#line 2426 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2424 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate())
             (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode);
     }
-#line 7056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7054 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 385:
-#line 2434 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2432 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
@@ -7065,11 +7063,11 @@
             (yyval.interm.intermNode) = 0;  // start a fresh subsequence for what's after this case
         }
     }
-#line 7069 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 386:
-#line 2442 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2440 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
                                             (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
@@ -7078,59 +7076,59 @@
         } else
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
     }
-#line 7082 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7080 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 387:
-#line 2453 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2451 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = 0; }
-#line 7088 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 388:
-#line 2454 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2452 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
-#line 7094 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7092 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 389:
-#line 2458 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2456 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode));
         (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc);
     }
-#line 7103 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7101 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 390:
-#line 2465 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2463 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode);
     }
-#line 7112 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7110 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 391:
-#line 2469 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2467 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 7121 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7119 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 392:
-#line 2477 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2475 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode));
     }
-#line 7130 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7128 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 393:
-#line 2481 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2479 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type));
 
@@ -7141,11 +7139,11 @@
         else
             (yyval.interm.intermTypedNode) = 0;
     }
-#line 7145 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7143 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 394:
-#line 2494 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // start new switch sequence on the switch stack
         ++parseContext.controlFlowNestingLevel;
@@ -7154,11 +7152,11 @@
         parseContext.switchLevel.push_back(parseContext.statementNestingLevel);
         parseContext.symbolTable.push();
     }
-#line 7158 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7156 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 395:
-#line 2502 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2500 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0);
         delete parseContext.switchSequenceStack.back();
@@ -7168,27 +7166,27 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7172 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7170 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 396:
-#line 2514 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2512 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
     }
-#line 7180 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7178 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 397:
-#line 2517 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2515 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7186 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 398:
-#line 2523 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2521 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
@@ -7201,11 +7199,11 @@
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc);
         }
     }
-#line 7205 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7203 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 399:
-#line 2535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2533 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
@@ -7215,11 +7213,11 @@
         else
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc);
     }
-#line 7219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7217 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 400:
-#line 2547 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2545 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", "");
@@ -7228,11 +7226,11 @@
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7232 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7230 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 401:
-#line 2555 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2553 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc);
@@ -7240,21 +7238,21 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7244 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7242 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 402:
-#line 2562 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2560 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7252 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 403:
-#line 2567 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2565 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", "");
@@ -7266,22 +7264,22 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7270 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7268 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 404:
-#line 2578 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2576 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7279 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 405:
-#line 2584 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2582 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc);
@@ -7294,81 +7292,81 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7298 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7296 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 406:
-#line 2599 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2597 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7306 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7304 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 407:
-#line 2602 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2600 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7314 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7312 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 408:
-#line 2608 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2606 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 7322 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7320 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 409:
-#line 2611 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2609 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = 0;
     }
-#line 7330 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7328 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 410:
-#line 2617 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2615 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 7339 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 411:
-#line 2621 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2619 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
     }
-#line 7348 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 412:
-#line 2628 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2626 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (parseContext.loopNestingLevel <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc);
     }
-#line 7358 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7356 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 413:
-#line 2633 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2631 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc);
     }
-#line 7368 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7366 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 414:
-#line 2638 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2636 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc);
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid)
@@ -7376,71 +7374,71 @@
         if (parseContext.inMain)
             parseContext.postMainReturn = true;
     }
-#line 7380 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7378 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 415:
-#line 2645 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2643 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 7388 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7386 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 416:
-#line 2648 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2646 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc);
     }
-#line 7397 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7395 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 417:
-#line 2657 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2655 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
         parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
     }
-#line 7406 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7404 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 418:
-#line 2661 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2659 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
         parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
     }
-#line 7415 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7413 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 419:
-#line 2668 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2666 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7423 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7421 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 420:
-#line 2671 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2669 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7431 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7429 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 421:
-#line 2677 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2675 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */);
         (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function);
     }
-#line 7440 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7438 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 422:
-#line 2681 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2679 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //   May be best done as post process phase on intermediate code
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue)
@@ -7456,11 +7454,11 @@
         (yyval.interm.intermNode)->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
         (yyval.interm.intermNode)->getAsAggregate()->addToPragmaTable(parseContext.contextPragma.pragmaTable);
     }
-#line 7460 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7458 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
 
-#line 7464 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7462 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -7688,5 +7686,5 @@
 #endif
   return yyresult;
 }
-#line 2698 "MachineIndependent/glslang.y" /* yacc.c:1906  */
+#line 2696 "MachineIndependent/glslang.y" /* yacc.c:1906  */
 
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..f213dd6 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -75,13 +75,13 @@
     if (source != unit.source)
         error(infoSink, "can't link compilation units from different source languages");
 
-    if (source == EShSourceHlsl && unit.entryPoint.size() > 0) {
-        if (entryPoint.size() > 0)
+    if (source == EShSourceHlsl && unit.getNumEntryPoints() > 0) {
+        if (getNumEntryPoints() > 0)
             error(infoSink, "can't handle multiple entry points per stage");
         else
-            entryPoint = unit.entryPoint;
+            entryPointName = unit.entryPointName;
     }
-    numMains += unit.numMains;
+    numEntryPoints += unit.numEntryPoints;
     numErrors += unit.numErrors;
     numPushConstants += unit.numPushConstants;
     callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end());
@@ -370,8 +370,8 @@
 //
 void TIntermediate::finalCheck(TInfoSink& infoSink)
 {
-    if (source == EShSourceGlsl && numMains < 1)
-        error(infoSink, "Missing entry point: Each stage requires one \"void main()\" entry point");
+    if (source == EShSourceGlsl && numEntryPoints < 1)
+        error(infoSink, "Missing entry point: Each stage requires one entry point");
 
     if (numPushConstants > 1)
         error(infoSink, "Only one push_constant block is allowed per stage");
@@ -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..3ce615e 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -137,7 +137,7 @@
 public:
     explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) :
         source(EShSourceNone), language(l), profile(p), version(v), treeRoot(0),
-        numMains(0), numErrors(0), numPushConstants(0), recursive(false),
+        numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
         invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone),
         pixelCenterInteger(false), originUpperLeft(false),
         vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), depthLayout(EldNone), depthReplacing(false), blendEquations(0),
@@ -159,8 +159,10 @@
 
     void setSource(EShSource s) { source = s; }
     EShSource getSource() const { return source; }
-    void setEntryPoint(const char* ep) { entryPoint = ep; }
-    const std::string& getEntryPoint() const { return entryPoint; }
+    void setEntryPointName(const char* ep) { entryPointName = ep; }
+    void setEntryPointMangledName(const char* ep) { entryPointMangledName = ep; }
+    const std::string& getEntryPointName() const { return entryPointName; }
+    const std::string& getEntryPointMangledName() const { return entryPointMangledName; }
     void setVersion(int v) { version = v; }
     int getVersion() const { return version; }
     void setProfile(EProfile p) { profile = p; }
@@ -173,8 +175,8 @@
 
     void setTreeRoot(TIntermNode* r) { treeRoot = r; }
     TIntermNode* getTreeRoot() const { return treeRoot; }
-    void addMainCount() { ++numMains; }
-    int getNumMains() const { return numMains; }
+    void incrementEntryPointCount() { ++numEntryPoints; }
+    int getNumEntryPoints() const { return numEntryPoints; }
     int getNumErrors() const { return numErrors; }
     void addPushConstantCount() { ++numPushConstants; }
     bool isRecursive() const { return recursive; }
@@ -189,7 +191,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 +333,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;
@@ -362,14 +365,15 @@
 
     const EShLanguage language;  // stage, known at construction time
     EShSource source;            // source language, known a bit later
-    std::string entryPoint;
+    std::string entryPointName;
+    std::string entryPointMangledName;
     EProfile profile;
     int version;
     SpvVersion spvVersion;
     TIntermNode* treeRoot;
     std::set<std::string> requestedExtensions;  // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
     TBuiltInResource resources;
-    int numMains;
+    int numEntryPoints;
     int numErrors;
     int numPushConstants;
     bool recursive;
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 7a59d48..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"
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..7daebb3 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"
@@ -698,7 +696,7 @@
 }
 
 //
-// The main functional entry-point into the preprocessor, which will
+// The main functional entry point into the preprocessor, which will
 // scan the source strings to figure out and return the next processing token.
 //
 // Return string pointer to next token.
@@ -749,7 +747,12 @@
             tokenString = ppToken->name;
             break;
         case PpAtomConstString:
-            parseContext.ppError(ppToken->loc, "string literals not supported", "\"\"", "");
+            if (parseContext.intermediate.getSource() == EShSourceHlsl) {
+                // HLSL allows string literals.
+                tokenString = ppToken->name;
+            } else {
+                parseContext.ppError(ppToken->loc, "string literals not supported", "\"\"", "");
+            }
             break;
         case '\'':
             parseContext.ppError(ppToken->loc, "character literals not supported", "\'", "");
@@ -759,12 +762,8 @@
             break;
         }
 
-        if (tokenString) {
-            if (tokenString[0] != 0)
-                parseContext.tokensBeforeEOF = 1;
-
+        if (tokenString)
             return tokenString;
-        }
     }
 }
 
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..f5a0513 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"
@@ -225,7 +224,6 @@
             ppToken->dval = atof(ppToken->name);
             break;
         case PpAtomConstInt:
-        case PpAtomConstUint:
             if (len > 0 && tokenText[0] == '0') {
                 if (len > 1 && (tokenText[1] == 'x' || tokenText[1] == 'X'))
                     ppToken->ival = strtol(ppToken->name, 0, 16);
@@ -234,8 +232,16 @@
             } else
                 ppToken->ival = atoi(ppToken->name);
             break;
+        case PpAtomConstUint:
+            if (len > 0 && tokenText[0] == '0') {
+                if (len > 1 && (tokenText[1] == 'x' || tokenText[1] == 'X'))
+                    ppToken->ival = (int)strtoul(ppToken->name, 0, 16);
+                else
+                    ppToken->ival = (int)strtoul(ppToken->name, 0, 8);
+            } else
+                ppToken->ival = (int)strtoul(ppToken->name, 0, 10);
+            break;
         case PpAtomConstInt64:
-        case PpAtomConstUint64:
             if (len > 0 && tokenText[0] == '0') {
                 if (len > 1 && (tokenText[1] == 'x' || tokenText[1] == 'X'))
                     ppToken->i64val = strtoll(ppToken->name, nullptr, 16);
@@ -244,6 +250,15 @@
             } else
                 ppToken->i64val = atoll(ppToken->name);
             break;
+        case PpAtomConstUint64:
+            if (len > 0 && tokenText[0] == '0') {
+                if (len > 1 && (tokenText[1] == 'x' || tokenText[1] == 'X'))
+                    ppToken->i64val = (long long)strtoull(ppToken->name, nullptr, 16);
+                else
+                    ppToken->i64val = (long long)strtoull(ppToken->name, nullptr, 8);
+            } else
+                ppToken->i64val = (long long)strtoull(ppToken->name, 0, 10);
+            break;
         }
     }
 
diff --git a/glslang/MachineIndependent/reflection.cpp b/glslang/MachineIndependent/reflection.cpp
index d3e04af..d557765 100644
--- a/glslang/MachineIndependent/reflection.cpp
+++ b/glslang/MachineIndependent/reflection.cpp
@@ -1,5 +1,5 @@
 //
-//Copyright (C) 2013 LunarG, Inc.
+//Copyright (C) 2013-2016 LunarG, Inc.
 //
 //All rights reserved.
 //
@@ -35,6 +35,7 @@
 
 #include "../Include/Common.h"
 #include "reflection.h"
+#include "LiveTraverser.h"
 #include "localintermediate.h"
 
 #include "gl_types.h"
@@ -48,7 +49,7 @@
 //
 // High-level algorithm for one stage:
 //
-// 1. Put main() on list of live functions.
+// 1. Put the entry point on the list of live functions.
 //
 // 2. Traverse any live function, while skipping if-tests with a compile-time constant
 //    condition of false, and while adding any encountered function calls to the live
@@ -59,40 +60,29 @@
 // 3. Add any encountered uniform variables and blocks to the reflection database.
 //
 // Can be attempted with a failed link, but will return false if recursion had been detected, or
-// there wasn't exactly one main.
+// there wasn't exactly one entry point.
 //
 
+   
 namespace glslang {
 
 //
 // The traverser: mostly pass through, except
-//  - processing function-call nodes to push live functions onto the stack of functions to process
 //  - processing binary nodes to see if they are dereferences of an aggregates to track
 //  - processing symbol nodes to see if they are non-aggregate objects to track
-//  - processing selection nodes to trim semantically dead code
+//
+// This ignores semantically dead code by using TLiveTraverser.
 //
 // This is in the glslang namespace directly so it can be a friend of TReflection.
 //
 
-class TLiveTraverser : public TIntermTraverser {
+class TReflectionTraverser : public TLiveTraverser {
 public:
-    TLiveTraverser(const TIntermediate& i, TReflection& r) : intermediate(i), reflection(r) { }
+    TReflectionTraverser(const TIntermediate& i, TReflection& r) :
+         TLiveTraverser(i), reflection(r) { }
 
-    virtual bool visitAggregate(TVisit, TIntermAggregate* node);
     virtual bool visitBinary(TVisit, TIntermBinary* node);
     virtual void visitSymbol(TIntermSymbol* base);
-    virtual bool visitSelection(TVisit, TIntermSelection* node);
-
-    // Track live funtions as well as uniforms, so that we don't visit dead functions
-    // and only visit each function once.
-    void addFunctionCall(TIntermAggregate* call)
-    {
-        // just use the map to ensure we process each function at most once
-        if (reflection.nameToIndex.find(call->getName()) == reflection.nameToIndex.end()) {
-            reflection.nameToIndex[call->getName()] = -1;
-            pushFunction(call->getName());
-        }
-    }
 
     // Add a simple reference to a uniform variable to the uniform database, no dereference involved.
     // However, no dereference doesn't mean simple... it could be a complex aggregate.
@@ -358,21 +348,6 @@
         return blockIndex;
     }
 
-    //
-    // Given a function name, find its subroot in the tree, and push it onto the stack of
-    // functions left to process.
-    //
-    void pushFunction(const TString& name)
-    {
-        TIntermSequence& globals = intermediate.getTreeRoot()->getAsAggregate()->getSequence();
-        for (unsigned int f = 0; f < globals.size(); ++f) {
-            TIntermAggregate* candidate = globals[f]->getAsAggregate();
-            if (candidate && candidate->getOp() == EOpFunction && candidate->getName() == name) {
-                functions.push_back(candidate);
-                break;
-            }
-        }
-    }
 
     // Are we at a level in a dereference chain at which individual active uniform queries are made?
     bool isReflectionGranularity(const TType& type)
@@ -639,33 +614,21 @@
         return type.isArray() ? type.getOuterArraySize() : 1;
     }
 
-    typedef std::list<TIntermAggregate*> TFunctionStack;
-    TFunctionStack functions;
-    const TIntermediate& intermediate;
     TReflection& reflection;
     std::set<const TIntermNode*> processedDerefs;
 
 protected:
-    TLiveTraverser(TLiveTraverser&);
-    TLiveTraverser& operator=(TLiveTraverser&);
+    TReflectionTraverser(TReflectionTraverser&);
+    TReflectionTraverser& operator=(TReflectionTraverser&);
 };
 
 //
 // Implement the traversal functions of interest.
 //
 
-// To catch which function calls are not dead, and hence which functions must be visited.
-bool TLiveTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)
-{
-    if (node->getOp() == EOpFunctionCall)
-        addFunctionCall(node);
-
-    return true; // traverse this subtree
-}
-
 // To catch dereferenced aggregates that must be reflected.
 // This catches them at the highest level possible in the tree.
-bool TLiveTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)
+bool TReflectionTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)
 {
     switch (node->getOp()) {
     case EOpIndexDirect:
@@ -683,7 +646,7 @@
 }
 
 // To reflect non-dereferenced objects.
-void TLiveTraverser::visitSymbol(TIntermSymbol* base)
+void TReflectionTraverser::visitSymbol(TIntermSymbol* base)
 {
     if (base->getQualifier().storage == EvqUniform)
         addUniform(*base);
@@ -692,21 +655,6 @@
         addAttribute(*base);
 }
 
-// To prune semantically dead paths.
-bool TLiveTraverser::visitSelection(TVisit /* visit */,  TIntermSelection* node)
-{
-    TIntermConstantUnion* constant = node->getCondition()->getAsConstantUnion();
-    if (constant) {
-        // cull the path that is dead
-        if (constant->getConstArray()[0].getBConst() == true && node->getTrueBlock())
-            node->getTrueBlock()->traverse(this);
-        if (constant->getConstArray()[0].getBConst() == false && node->getFalseBlock())
-            node->getFalseBlock()->traverse(this);
-
-        return false; // don't traverse any more, we did it all above
-    } else
-        return true; // traverse the whole subtree
-}
 
 //
 // Implement TReflection methods.
@@ -717,13 +665,13 @@
 // Returns false if the input is too malformed to do this.
 bool TReflection::addStage(EShLanguage, const TIntermediate& intermediate)
 {
-    if (intermediate.getNumMains() != 1 || intermediate.isRecursive())
+    if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive())
         return false;
 
-    TLiveTraverser it(intermediate, *this);
+    TReflectionTraverser it(intermediate, *this);
 
-    // put main() on functions to process
-    it.pushFunction("main(");
+    // put the entry point on the list of functions to process
+    it.pushFunction(intermediate.getEntryPointMangledName().c_str());
 
     // process all the functions
     while (! it.functions.empty()) {
diff --git a/glslang/MachineIndependent/reflection.h b/glslang/MachineIndependent/reflection.h
index 5d930c7..8880602 100644
--- a/glslang/MachineIndependent/reflection.h
+++ b/glslang/MachineIndependent/reflection.h
@@ -49,7 +49,7 @@
 
 class TIntermediate;
 class TIntermAggregate;
-class TLiveTraverser;
+class TReflectionTraverser;
 
 // Data needed for just a single object at the granularity exchanged by the reflection API
 class TObjectReflection {
@@ -116,7 +116,7 @@
     void dump();
 
 protected:
-    friend class glslang::TLiveTraverser;
+    friend class glslang::TReflectionTraverser;
 
     // Need a TString hash: typedef std::unordered_map<TString, int> TNameToIndex;
     typedef std::map<TString, int> TNameToIndex;
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/CMakeLists.txt b/gtests/CMakeLists.txt
index 4aafd11..8a91eef 100644
--- a/gtests/CMakeLists.txt
+++ b/gtests/CMakeLists.txt
@@ -18,6 +18,8 @@
     ${CMAKE_CURRENT_SOURCE_DIR}/Link.FromFile.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/Pp.FromFile.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/Spv.FromFile.cpp
+    # -- Remapper tests
+    ${CMAKE_CURRENT_SOURCE_DIR}/Remap.FromFile.cpp
   )
 
   add_executable(glslangtests ${TEST_SOURCES})
@@ -34,7 +36,7 @@
     ${gmock_SOURCE_DIR}/include
     ${gtest_SOURCE_DIR}/include)
   target_link_libraries(glslangtests PRIVATE
-    glslang OSDependent OGLCompiler HLSL glslang
+    SPVRemapper glslang OSDependent OGLCompiler HLSL glslang
     SPIRV glslang-default-resource-limits gmock)
   add_test(NAME glslang-gtests COMMAND glslangtests)
 endif()
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
index 0d99d1e..01cc032 100644
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -81,8 +81,12 @@
         {"hlsl.cast.frag", "PixelShaderFunction"},
         {"hlsl.conditional.frag", "PixelShaderFunction"},
         {"hlsl.constructexpr.frag", "main"},
+        {"hlsl.depthGreater.frag", "PixelShaderFunction"},
+        {"hlsl.depthLess.frag", "PixelShaderFunction"},
         {"hlsl.discard.frag", "PixelShaderFunction"},
         {"hlsl.doLoop.frag", "PixelShaderFunction"},
+        {"hlsl.entry-in.frag", "PixelShaderFunction"},
+        {"hlsl.entry-out.frag", "PixelShaderFunction"},
         {"hlsl.float1.frag", "PixelShaderFunction"},
         {"hlsl.float4.frag", "PixelShaderFunction"},
         {"hlsl.forLoop.frag", "PixelShaderFunction"},
@@ -107,11 +111,12 @@
         {"hlsl.intrinsics.evalfns.frag", "main"},
         {"hlsl.intrinsics.double.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.f1632.frag", "PixelShaderFunction"},
-        {"hlsl.intrinsics.frag", "PixelShaderFunction"},
+        {"hlsl.intrinsics.frag", "main"},
         {"hlsl.intrinsics.lit.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"},
         {"hlsl.intrinsics.negative.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.negative.vert", "VertexShaderFunction"},
+        {"hlsl.layout.frag", "main"},
         {"hlsl.load.2dms.dx10.frag", "main"},
         {"hlsl.load.array.dx10.frag", "main"},
         {"hlsl.load.basic.dx10.frag", "main"},
@@ -119,8 +124,13 @@
         {"hlsl.load.buffer.dx10.frag", "main"},
         {"hlsl.load.offset.dx10.frag", "main"},
         {"hlsl.load.offsetarray.dx10.frag", "main"},
+        {"hlsl.multiEntry.vert", "RealEntrypoint"},
+        {"hlsl.matrixindex.frag", "main"},
         {"hlsl.numericsuffixes.frag", "main"},
+        {"hlsl.overload.frag", "PixelShaderFunction"},
         {"hlsl.pp.line.frag", "main"},
+        {"hlsl.precise.frag", "main"},
+        {"hlsl.promotions.frag", "main"},
         {"hlsl.sample.array.dx10.frag", "main"},
         {"hlsl.sample.basic.dx10.frag", "main"},
         {"hlsl.sample.offset.dx10.frag", "main"},
@@ -149,6 +159,9 @@
         {"hlsl.samplelevel.offsetarray.dx10.frag", "main"},
         {"hlsl.semicolons.frag", "main"},
         {"hlsl.shapeConv.frag", "main"},
+        {"hlsl.stringtoken.frag", "main"},
+        {"hlsl.string.frag", "main"},
+        {"hlsl.structin.vert", "main"},
         {"hlsl.intrinsics.vert", "VertexShaderFunction"},
         {"hlsl.matType.frag", "PixelShaderFunction"},
         {"hlsl.max.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/Remap.FromFile.cpp b/gtests/Remap.FromFile.cpp
new file mode 100644
index 0000000..cd246ea
--- /dev/null
+++ b/gtests/Remap.FromFile.cpp
@@ -0,0 +1,117 @@
+//
+// Copyright (C) 2016 LunarG, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of Google Inc. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+#include <gtest/gtest.h>
+
+#include "TestFixture.h"
+
+namespace glslangtest {
+namespace {
+
+struct RemapTestArgs {
+    const char*  fileName;
+    const char*  entryPoint;
+    Source       sourceLanguage;
+    unsigned int remapOpts;
+};
+
+// We are using FileNameEntryPointPair objects as parameters for instantiating
+// the template, so the global FileNameAsCustomTestSuffix() won't work since
+// it assumes std::string as parameters. Thus, an overriding one here.
+std::string FileNameAsCustomTestSuffix(
+    const ::testing::TestParamInfo<RemapTestArgs>& info) {
+    std::string name = info.param.fileName;
+    // A valid test case suffix cannot have '.' and '-' inside.
+    std::replace(name.begin(), name.end(), '.', '_');
+    std::replace(name.begin(), name.end(), '-', '_');
+    return name;
+}
+
+using RemapTest = GlslangTest<::testing::TestWithParam<RemapTestArgs>>;
+
+// Remapping SPIR-V modules. 
+TEST_P(RemapTest, FromFile)
+{
+    if (GetSuffix(GetParam().fileName) == "spv") {
+        loadFileRemapAndCheck(GLSLANG_TEST_DIRECTORY, GetParam().fileName,
+                              GetParam().sourceLanguage,
+                              Semantics::Vulkan,
+                              Target::Spv,
+                              GetParam().remapOpts);
+    } else {
+        loadFileCompileRemapAndCheck(GLSLANG_TEST_DIRECTORY, GetParam().fileName,
+                                     GetParam().sourceLanguage,
+                                     Semantics::Vulkan,
+                                     Target::Spv,
+                                     GetParam().entryPoint,
+                                     GetParam().remapOpts);
+    }
+}
+
+// clang-format off
+INSTANTIATE_TEST_CASE_P(
+    ToSpirv, RemapTest,
+    ::testing::ValuesIn(std::vector<RemapTestArgs>{
+            // GLSL remapper tests
+            // testname                                   entry   language      remapper_options
+            { "remap.basic.none.frag",                    "main", Source::GLSL, spv::spirvbin_t::NONE },
+            { "remap.basic.everything.frag",              "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
+            { "remap.basic.dcefunc.frag",                 "main", Source::GLSL, spv::spirvbin_t::DCE_FUNCS },
+            { "remap.basic.strip.frag",                   "main", Source::GLSL, spv::spirvbin_t::STRIP },
+            { "remap.switch.none.frag",                   "main", Source::GLSL, spv::spirvbin_t::NONE },
+            { "remap.switch.everything.frag",             "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
+            { "remap.literal64.none.spv",                 "main", Source::GLSL, spv::spirvbin_t::NONE },
+            { "remap.literal64.everything.spv",           "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
+            { "remap.if.none.frag",                       "main", Source::GLSL, spv::spirvbin_t::NONE },
+            { "remap.if.everything.frag",                 "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
+            { "remap.similar_1a.none.frag",               "main", Source::GLSL, spv::spirvbin_t::NONE },
+            { "remap.similar_1b.none.frag",               "main", Source::GLSL, spv::spirvbin_t::NONE },
+            { "remap.similar_1a.everything.frag",         "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
+            { "remap.similar_1b.everything.frag",         "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
+            { "remap.uniformarray.none.frag",             "main", Source::GLSL, spv::spirvbin_t::NONE },
+            { "remap.uniformarray.everything.frag",       "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
+
+            // HLSL remapper tests
+            { "remap.hlsl.sample.basic.strip.frag",       "main", Source::HLSL, spv::spirvbin_t::STRIP },
+            { "remap.hlsl.sample.basic.everything.frag",  "main", Source::HLSL, spv::spirvbin_t::DO_EVERYTHING },
+            { "remap.hlsl.sample.basic.none.frag",        "main", Source::HLSL, spv::spirvbin_t::NONE },
+            { "remap.hlsl.templatetypes.none.frag",       "main", Source::HLSL, spv::spirvbin_t::NONE },
+            { "remap.hlsl.templatetypes.everything.frag", "main", Source::HLSL, spv::spirvbin_t::DO_EVERYTHING },
+            }),
+    FileNameAsCustomTestSuffix
+);
+// clang-format on
+
+}  // anonymous namespace
+}  // namespace glslangtest
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index a8f3dd8..45fed04 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -164,6 +164,8 @@
         "spv.matrix2.frag",
         "spv.memoryQualifier.frag",
         "spv.merge-unreachable.frag",
+        "spv.multiStruct.comp",
+        "spv.multiStructFuncall.frag",
         "spv.newTexture.frag",
         "spv.noDeadDecorations.vert",
         "spv.nonSquare.vert",
diff --git a/gtests/TestFixture.cpp b/gtests/TestFixture.cpp
index f170f36..1dff65a 100644
--- a/gtests/TestFixture.cpp
+++ b/gtests/TestFixture.cpp
@@ -116,6 +116,32 @@
     return std::make_pair(false, "");
 }
 
+std::pair<bool, std::vector<std::uint32_t> > ReadSpvBinaryFile(const std::string& path)
+{
+    std::ifstream fstream(path, std::fstream::in | std::fstream::binary);
+
+    if (!fstream)
+        return std::make_pair(false, std::vector<std::uint32_t>());
+
+    std::vector<std::uint32_t> contents;
+
+    // Reserve space (for efficiency, not for correctness)
+    fstream.seekg(0, fstream.end);
+    contents.reserve(size_t(fstream.tellg()) / sizeof(std::uint32_t));
+    fstream.seekg(0, fstream.beg);
+
+    // There is no istream iterator traversing by uint32_t, so we must loop.
+    while (!fstream.eof()) {
+        std::uint32_t inWord;
+        fstream.read((char *)&inWord, sizeof(inWord));
+
+        if (!fstream.eof())
+            contents.push_back(inWord);
+    }
+
+    return std::make_pair(true, contents); // hopefully, c++11 move semantics optimizes the copy away.
+}
+
 bool WriteFile(const std::string& path, const std::string& contents)
 {
     std::ofstream fstream(path, std::ios::out);
diff --git a/gtests/TestFixture.h b/gtests/TestFixture.h
index 8dffb80..8193012 100644
--- a/gtests/TestFixture.h
+++ b/gtests/TestFixture.h
@@ -35,17 +35,19 @@
 #ifndef GLSLANG_GTESTS_TEST_FIXTURE_H
 #define GLSLANG_GTESTS_TEST_FIXTURE_H
 
-#include <stdint.h>
+#include <cstdint>
 #include <fstream>
 #include <sstream>
 #include <streambuf>
 #include <tuple>
+#include <string>
 
 #include <gtest/gtest.h>
 
 #include "SPIRV/GlslangToSpv.h"
 #include "SPIRV/disassemble.h"
 #include "SPIRV/doc.h"
+#include "SPIRV/SPVRemapper.h"
 #include "StandAlone/ResourceLimits.h"
 #include "glslang/Public/ShaderLang.h"
 
@@ -93,6 +95,7 @@
 // Reads the content of the file at the given |path|. On success, returns true
 // and the contents; otherwise, returns false and an empty string.
 std::pair<bool, std::string> ReadFile(const std::string& path);
+std::pair<bool, std::vector<std::uint32_t> > ReadSpvBinaryFile(const std::string& path);
 
 // Writes the given |contents| into the file at the given |path|. Returns true
 // on successful output.
@@ -128,6 +131,16 @@
         ASSERT_TRUE(fileReadOk) << "Cannot open " << tag << " file: " << path;
     }
 
+    // Tries to load the contents from the file at the given |path|. On success,
+    // writes the contents into |contents|. On failure, errors out.
+    void tryLoadSpvFile(const std::string& path, const std::string& tag,
+                        std::vector<uint32_t>& contents)
+    {
+        bool fileReadOk;
+        std::tie(fileReadOk, contents) = ReadSpvBinaryFile(path);
+        ASSERT_TRUE(fileReadOk) << "Cannot open " << tag << " file: " << path;
+    }
+
     // Checks the equality of |expected| and |real|. If they are not equal,
     // write |real| to the given file named as |fname| if update mode is on.
     void checkEqAndUpdateIfRequested(const std::string& expected,
@@ -179,8 +192,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);
@@ -223,6 +234,68 @@
         }
     }
 
+    // This is like compileAndLink but with remapping of the SPV binary
+    // through spirvbin_t::remap().  While technically this could be merged
+    // with compileAndLink() above (with the remap step optionally being a no-op)
+    // it is given separately here for ease of future extraction.
+    GlslangResult compileLinkRemap(
+            const std::string shaderName, const std::string& code,
+            const std::string& entryPointName, EShMessages controls,
+            const unsigned int remapOptions = spv::spirvbin_t::NONE)
+    {
+        const EShLanguage kind = GetShaderStage(GetSuffix(shaderName));
+
+        glslang::TShader shader(kind);
+        bool success = compile(&shader, code, entryPointName, controls);
+
+        glslang::TProgram program;
+        program.addShader(&shader);
+        success &= program.link(controls);
+
+        spv::SpvBuildLogger logger;
+
+        if (success && (controls & EShMsgSpvRules)) {
+            std::vector<uint32_t> spirv_binary;
+            glslang::GlslangToSpv(*program.getIntermediate(kind),
+                                  spirv_binary, &logger);
+
+            spv::spirvbin_t(0 /*verbosity*/).remap(spirv_binary, remapOptions);
+
+            std::ostringstream disassembly_stream;
+            spv::Parameterize();
+            spv::Disassemble(disassembly_stream, spirv_binary);
+            return {{{shaderName, shader.getInfoLog(), shader.getInfoDebugLog()},},
+                    program.getInfoLog(), program.getInfoDebugLog(),
+                    logger.getAllMessages(), disassembly_stream.str()};
+        } else {
+            return {{{shaderName, shader.getInfoLog(), shader.getInfoDebugLog()},},
+                    program.getInfoLog(), program.getInfoDebugLog(), "", ""};
+        }
+    }
+
+    // remap the binary in 'code' with the options in remapOptions
+    GlslangResult remap(
+            const std::string shaderName, const std::vector<uint32_t>& code,
+            EShMessages controls,
+            const unsigned int remapOptions = spv::spirvbin_t::NONE)
+    {
+        if ((controls & EShMsgSpvRules)) {
+            std::vector<uint32_t> spirv_binary(code); // scratch copy
+
+            spv::spirvbin_t(0 /*verbosity*/).remap(spirv_binary, remapOptions);
+            
+            std::ostringstream disassembly_stream;
+            spv::Parameterize();
+            spv::Disassemble(disassembly_stream, spirv_binary);
+
+            return {{{shaderName, "", ""},},
+                    "", "",
+                        "", disassembly_stream.str()};
+        } else {
+            return {{{shaderName, "", ""},}, "", "", "", ""};
+        }
+    }
+
     void outputResultToStream(std::ostringstream* stream,
                               const GlslangResult& result,
                               EShMessages controls)
@@ -274,6 +347,60 @@
                                     expectedOutputFname);
     }
 
+    void loadFileCompileRemapAndCheck(const std::string& testDir,
+                                      const std::string& testName,
+                                      Source source,
+                                      Semantics semantics,
+                                      Target target,
+                                      const std::string& entryPointName="",
+                                      const unsigned int remapOptions = spv::spirvbin_t::NONE)
+    {
+        const std::string inputFname = testDir + "/" + testName;
+        const std::string expectedOutputFname =
+            testDir + "/baseResults/" + testName + ".out";
+        std::string input, expectedOutput;
+
+        tryLoadFile(inputFname, "input", &input);
+        tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
+
+        const EShMessages controls = DeriveOptions(source, semantics, target);
+        GlslangResult result = compileLinkRemap(testName, input, entryPointName, controls, remapOptions);
+
+        // Generate the hybrid output in the way of glslangValidator.
+        std::ostringstream stream;
+        outputResultToStream(&stream, result, controls);
+
+        checkEqAndUpdateIfRequested(expectedOutput, stream.str(),
+                                    expectedOutputFname);
+    }
+
+    void loadFileRemapAndCheck(const std::string& testDir,
+                               const std::string& testName,
+                               Source source,
+                               Semantics semantics,
+                               Target target,
+                               const unsigned int remapOptions = spv::spirvbin_t::NONE)
+    {
+        const std::string inputFname = testDir + "/" + testName;
+        const std::string expectedOutputFname =
+            testDir + "/baseResults/" + testName + ".out";
+        std::vector<std::uint32_t> input;
+        std::string expectedOutput;
+
+        tryLoadSpvFile(inputFname, "input", input);
+        tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
+
+        const EShMessages controls = DeriveOptions(source, semantics, target);
+        GlslangResult result = remap(testName, input, controls, remapOptions);
+
+        // Generate the hybrid output in the way of glslangValidator.
+        std::ostringstream stream;
+        outputResultToStream(&stream, result, controls);
+
+        checkEqAndUpdateIfRequested(expectedOutput, stream.str(),
+                                    expectedOutputFname);
+    }
+
     // Preprocesses the given |source| code. On success, returns true, the
     // preprocessed shader, and warning messages. Otherwise, returns false, an
     // empty string, and error messages.
diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp
index 64e8b9f..0762514 100755
--- a/hlsl/hlslGrammar.cpp
+++ b/hlsl/hlslGrammar.cpp
@@ -274,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))
@@ -296,10 +302,10 @@
     HlslToken idToken;
     while (acceptIdentifier(idToken)) {
         // function_parameters
-        TFunction* function = new TFunction(idToken.string, type);
-        if (acceptFunctionParameters(*function)) {
+        TFunction& function = *new TFunction(idToken.string, type);
+        if (acceptFunctionParameters(function)) {
             // post_decls
-            acceptPostDecls(type);
+            acceptPostDecls(function.getWritableType().getQualifier());
 
             // compound_statement (function body definition) or just a prototype?
             if (peekTokenClass(EHTokLeftBrace)) {
@@ -307,11 +313,11 @@
                     parseContext.error(idToken.loc, "function body can't be in a declarator list", "{", "");
                 if (typedefDecl)
                     parseContext.error(idToken.loc, "function body can't be in a typedef", "{", "");
-                return acceptFunctionDefinition(*function, node);
+                return acceptFunctionDefinition(function, node);
             } else {
                 if (typedefDecl)
                     parseContext.error(idToken.loc, "function typedefs not implemented", "{", "");
-                parseContext.handleFunctionDeclarator(idToken.loc, *function, true);
+                parseContext.handleFunctionDeclarator(idToken.loc, function, true);
             }
         } else {
             // a variable declaration
@@ -327,7 +333,7 @@
             }
 
             // post_decls
-            acceptPostDecls(type);
+            acceptPostDecls(type.getQualifier());
 
             // EQUAL assignment_expression
             TIntermTyped* expressionNode = nullptr;
@@ -420,7 +426,8 @@
     // type_qualifier
     TQualifier qualifier;
     qualifier.clear();
-    acceptQualifier(qualifier);
+    if (! acceptQualifier(qualifier))
+        return false;
     TSourceLoc loc = token.loc;
 
     // type_specifier
@@ -428,7 +435,7 @@
         return false;
     if (type.getBasicType() == EbtBlock) {
         // the type was a block, which set some parts of the qualifier
-        parseContext.mergeQualifiers(loc, type.getQualifier(), qualifier, true);
+        parseContext.mergeQualifiers(type.getQualifier(), qualifier);
         // further, it can create an anonymous instance of the block
         if (peekTokenClass(EHTokSemicolon))
             parseContext.declareBlock(loc, type);
@@ -443,7 +450,7 @@
 //
 // Zero or more of these, so this can't return false.
 //
-void HlslGrammar::acceptQualifier(TQualifier& qualifier)
+bool HlslGrammar::acceptQualifier(TQualifier& qualifier)
 {
     do {
         switch (peek()) {
@@ -469,7 +476,6 @@
             qualifier.volatil = true;
             break;
         case EHTokLinear:
-            qualifier.storage = EvqVaryingIn;
             qualifier.smooth = true;
             break;
         case EHTokCentroid:
@@ -502,13 +508,66 @@
         case EHTokInOut:
             qualifier.storage = EvqInOut;
             break;
+        case EHTokLayout:
+            if (! acceptLayoutQualifierList(qualifier))
+                return false;
+            continue;
         default:
-            return;
+            return true;
         }
         advanceToken();
     } while (true);
 }
 
+// layout_qualifier_list
+//      : LAYOUT LEFT_PAREN layout_qualifier COMMA layout_qualifier ... RIGHT_PAREN
+//
+// layout_qualifier
+//      : identifier
+//      | identifier EQUAL expression
+//
+// Zero or more of these, so this can't return false.
+//
+bool HlslGrammar::acceptLayoutQualifierList(TQualifier& qualifier)
+{
+    if (! acceptTokenClass(EHTokLayout))
+        return false;
+
+    // LEFT_PAREN
+    if (! acceptTokenClass(EHTokLeftParen))
+        return false;
+
+    do {
+        // identifier
+        HlslToken idToken;
+        if (! acceptIdentifier(idToken))
+            break;
+
+        // EQUAL expression
+        if (acceptTokenClass(EHTokAssign)) {
+            TIntermTyped* expr;
+            if (! acceptConditionalExpression(expr)) {
+                expected("expression");
+                return false;
+            }
+            parseContext.setLayoutQualifier(idToken.loc, qualifier, *idToken.string, expr);
+        } else
+            parseContext.setLayoutQualifier(idToken.loc, qualifier, *idToken.string);
+
+        // COMMA
+        if (! acceptTokenClass(EHTokComma))
+            break;
+    } while (true);
+
+    // RIGHT_PAREN
+    if (! acceptTokenClass(EHTokRightParen)) {
+        expected(")");
+        return false;
+    }
+
+    return true;
+}
+
 // template_type
 //      : FLOAT
 //      | DOUBLE
@@ -651,8 +710,8 @@
         return false;
 
     new(&type) TType(basicType, EvqTemporary, 0,
-                     cols->getAsConstantUnion()->getConstArray()[0].getIConst(),
-                     rows->getAsConstantUnion()->getConstArray()[0].getIConst());
+                     rows->getAsConstantUnion()->getConstArray()[0].getIConst(),
+                     cols->getAsConstantUnion()->getConstArray()[0].getIConst());
 
     if (!acceptTokenClass(EHTokRightAngle)) {
         expected("right angle bracket");
@@ -662,6 +721,54 @@
     return true;
 }
 
+// string_template_type
+//      : STRING
+//      | STRING identifier LEFT_ANGLE declaration SEMI_COLON ... declaration SEMICOLON RIGHT_ANGLE
+//
+bool HlslGrammar::acceptStringTemplateType(TType& type)
+{
+    // STRING
+    if (! acceptTokenClass(EHTokString))
+        return false;
+
+    // no matter what happens next, we recognized a string type
+    new(&type) TType(EbtString);
+
+    // identifier LEFT_ANGLE, or not?
+    if (! acceptTokenClass(EHTokIdentifier)) {
+        expected("identifier following 'string'");
+        return false;
+    }
+
+    if (! peekTokenClass(EHTokLeftAngle)) {
+        // then it must be the non-template version, back up and let
+        // normal declaration code handle it
+
+        // recede the identifier
+        recedeToken();
+        return true;
+    }
+
+    // move past the LEFT_ANGLE
+    advanceToken();
+
+    // declaration SEMI_COLON ... declaration SEMICOLON RIGHT_ANGLE
+    do {
+        // eat any extra SEMI_COLON; don't know if the grammar calls for this or not
+        while (acceptTokenClass(EHTokSemicolon))
+            ;
+
+        if (acceptTokenClass(EHTokRightAngle))
+            return true;
+
+        // declaration
+        TIntermNode* node;
+        if (! acceptDeclaration(node)) {
+            expected("declaration in string list");
+            return false;
+        }
+    } while (true);
+}
 
 // sampler_type
 //      : SAMPLER
@@ -835,6 +942,10 @@
         return acceptMatrixTemplateType(type);
         break;
 
+    case EHTokString:
+        return acceptStringTemplateType(type);
+        break;
+
     case EHTokSampler:                // fall through
     case EHTokSampler1d:              // ...
     case EHTokSampler2d:              // ...
@@ -971,46 +1082,46 @@
         new(&type) TType(EbtInt, EvqTemporary, 0, 1, 1);
         break;
     case EHTokInt1x2:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 2, 1);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 1, 2);
         break;
     case EHTokInt1x3:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 3, 1);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 1, 3);
         break;
     case EHTokInt1x4:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 4, 1);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 1, 4);
         break;
     case EHTokInt2x1:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 1, 2);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 2, 1);
         break;
     case EHTokInt2x2:
         new(&type) TType(EbtInt, EvqTemporary, 0, 2, 2);
         break;
     case EHTokInt2x3:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 3, 2);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 2, 3);
         break;
     case EHTokInt2x4:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 4, 2);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 2, 4);
         break;
     case EHTokInt3x1:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 1, 3);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 3, 1);
         break;
     case EHTokInt3x2:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 2, 3);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 3, 2);
         break;
     case EHTokInt3x3:
         new(&type) TType(EbtInt, EvqTemporary, 0, 3, 3);
         break;
     case EHTokInt3x4:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 4, 3);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 3, 4);
         break;
     case EHTokInt4x1:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 1, 4);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 4, 1);
         break;
     case EHTokInt4x2:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 2, 4);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 4, 2);
         break;
     case EHTokInt4x3:
-        new(&type) TType(EbtInt, EvqTemporary, 0, 3, 4);
+        new(&type) TType(EbtInt, EvqTemporary, 0, 4, 3);
         break;
     case EHTokInt4x4:
         new(&type) TType(EbtInt, EvqTemporary, 0, 4, 4);
@@ -1020,46 +1131,46 @@
         new(&type) TType(EbtUint, EvqTemporary, 0, 1, 1);
         break;
     case EHTokUint1x2:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 2, 1);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 1, 2);
         break;
     case EHTokUint1x3:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 3, 1);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 1, 3);
         break;
     case EHTokUint1x4:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 4, 1);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 1, 4);
         break;
     case EHTokUint2x1:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 1, 2);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 2, 1);
         break;
     case EHTokUint2x2:
         new(&type) TType(EbtUint, EvqTemporary, 0, 2, 2);
         break;
     case EHTokUint2x3:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 3, 2);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 2, 3);
         break;
     case EHTokUint2x4:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 4, 2);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 2, 4);
         break;
     case EHTokUint3x1:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 1, 3);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 3, 1);
         break;
     case EHTokUint3x2:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 2, 3);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 3, 2);
         break;
     case EHTokUint3x3:
         new(&type) TType(EbtUint, EvqTemporary, 0, 3, 3);
         break;
     case EHTokUint3x4:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 4, 3);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 3, 4);
         break;
     case EHTokUint4x1:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 1, 4);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 4, 1);
         break;
     case EHTokUint4x2:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 2, 4);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 4, 2);
         break;
     case EHTokUint4x3:
-        new(&type) TType(EbtUint, EvqTemporary, 0, 3, 4);
+        new(&type) TType(EbtUint, EvqTemporary, 0, 4, 3);
         break;
     case EHTokUint4x4:
         new(&type) TType(EbtUint, EvqTemporary, 0, 4, 4);
@@ -1069,46 +1180,46 @@
         new(&type) TType(EbtBool, EvqTemporary, 0, 1, 1);
         break;
     case EHTokBool1x2:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 2, 1);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 1, 2);
         break;
     case EHTokBool1x3:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 3, 1);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 1, 3);
         break;
     case EHTokBool1x4:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 4, 1);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 1, 4);
         break;
     case EHTokBool2x1:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 1, 2);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 2, 1);
         break;
     case EHTokBool2x2:
         new(&type) TType(EbtBool, EvqTemporary, 0, 2, 2);
         break;
     case EHTokBool2x3:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 3, 2);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 2, 3);
         break;
     case EHTokBool2x4:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 4, 2);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 2, 4);
         break;
     case EHTokBool3x1:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 1, 3);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 3, 1);
         break;
     case EHTokBool3x2:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 2, 3);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 3, 2);
         break;
     case EHTokBool3x3:
         new(&type) TType(EbtBool, EvqTemporary, 0, 3, 3);
         break;
     case EHTokBool3x4:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 4, 3);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 3, 4);
         break;
     case EHTokBool4x1:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 1, 4);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 4, 1);
         break;
     case EHTokBool4x2:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 2, 4);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 4, 2);
         break;
     case EHTokBool4x3:
-        new(&type) TType(EbtBool, EvqTemporary, 0, 3, 4);
+        new(&type) TType(EbtBool, EvqTemporary, 0, 4, 3);
         break;
     case EHTokBool4x4:
         new(&type) TType(EbtBool, EvqTemporary, 0, 4, 4);
@@ -1118,46 +1229,46 @@
         new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 1);
         break;
     case EHTokFloat1x2:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 1);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 2);
         break;
     case EHTokFloat1x3:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 1);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 3);
         break;
     case EHTokFloat1x4:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 1);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 4);
         break;
     case EHTokFloat2x1:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 2);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 1);
         break;
     case EHTokFloat2x2:
         new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 2);
         break;
     case EHTokFloat2x3:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 2);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 3);
         break;
     case EHTokFloat2x4:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 2);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 4);
         break;
     case EHTokFloat3x1:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 3);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 1);
         break;
     case EHTokFloat3x2:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 3);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 2);
         break;
     case EHTokFloat3x3:
         new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 3);
         break;
     case EHTokFloat3x4:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 3);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 4);
         break;
     case EHTokFloat4x1:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 4);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 1);
         break;
     case EHTokFloat4x2:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 4);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 2);
         break;
     case EHTokFloat4x3:
-        new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 4);
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 3);
         break;
     case EHTokFloat4x4:
         new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 4);
@@ -1167,46 +1278,46 @@
         new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 1);
         break;
     case EHTokDouble1x2:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 1);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 2);
         break;
     case EHTokDouble1x3:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 1);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 3);
         break;
     case EHTokDouble1x4:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 1);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 4);
         break;
     case EHTokDouble2x1:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 2);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 1);
         break;
     case EHTokDouble2x2:
         new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 2);
         break;
     case EHTokDouble2x3:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 2);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 3);
         break;
     case EHTokDouble2x4:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 2);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 4);
         break;
     case EHTokDouble3x1:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 3);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 1);
         break;
     case EHTokDouble3x2:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 3);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 2);
         break;
     case EHTokDouble3x3:
         new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 3);
         break;
     case EHTokDouble3x4:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 3);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 4);
         break;
     case EHTokDouble4x1:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 4);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 1);
         break;
     case EHTokDouble4x2:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 4);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 2);
         break;
     case EHTokDouble4x3:
-        new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 4);
+        new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 3);
         break;
     case EHTokDouble4x4:
         new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 4);
@@ -1232,17 +1343,16 @@
 //
 bool HlslGrammar::acceptStruct(TType& type)
 {
-    // This qualifier.storage will tell us whether it's an AST block or
-    // just a struct.
-    TQualifier qualifier;
-    qualifier.clear();
+    // This storage qualifier will tell us whether it's an AST
+    // block type or just a generic structure type.
+    TStorageQualifier storageQualifier = EvqTemporary;
 
     // CBUFFER
     if (acceptTokenClass(EHTokCBuffer))
-        qualifier.storage = EvqUniform;
+        storageQualifier = EvqUniform;
     // TBUFFER
     else if (acceptTokenClass(EHTokTBuffer))
-        qualifier.storage = EvqBuffer;
+        storageQualifier = EvqBuffer;
     // STRUCT
     else if (! acceptTokenClass(EHTokStruct))
         return false;
@@ -1255,7 +1365,9 @@
     }
 
     // post_decls
-    acceptPostDecls(type);
+    TQualifier postDeclQualifier;
+    postDeclQualifier.clear();
+    acceptPostDecls(postDeclQualifier);
 
     // LEFT_BRACE
     if (! acceptTokenClass(EHTokLeftBrace)) {
@@ -1277,10 +1389,12 @@
     }
 
     // create the user-defined type
-    if (qualifier.storage == EvqTemporary)
+    if (storageQualifier == EvqTemporary)
         new(&type) TType(typeList, structName);
-    else
-        new(&type) TType(typeList, structName, qualifier); // sets EbtBlock
+    else {
+        postDeclQualifier.storage = storageQualifier;
+        new(&type) TType(typeList, structName, postDeclQualifier); // sets EbtBlock
+    }
 
     // If it was named, which means the type can be reused later, add
     // it to the symbol table.  (Unless it's a block, in which
@@ -1345,7 +1459,7 @@
             if (arraySizes)
                 typeList->back().type->newArraySizes(*arraySizes);
 
-            acceptPostDecls(*member.type);
+            acceptPostDecls(member.type->getQualifier());
 
             // success on seeing the SEMICOLON coming up
             if (peekTokenClass(EHTokSemicolon))
@@ -1422,7 +1536,7 @@
         type->newArraySizes(*arraySizes);
 
     // post_decls
-    acceptPostDecls(*type);
+    acceptPostDecls(type->getQualifier());
 
     parseContext.paramFix(*type);
 
@@ -1436,19 +1550,16 @@
 // parsing the body (compound_statement).
 bool HlslGrammar::acceptFunctionDefinition(TFunction& function, TIntermNode*& node)
 {
-    TFunction* functionDeclarator = parseContext.handleFunctionDeclarator(token.loc, function, false /* not prototype */);
+    TFunction& functionDeclarator = parseContext.handleFunctionDeclarator(token.loc, function, false /* not prototype */);
+    TSourceLoc loc = token.loc;
 
     // This does a pushScope()
-    node = parseContext.handleFunctionDefinition(token.loc, *functionDeclarator);
+    node = parseContext.handleFunctionDefinition(loc, functionDeclarator);
 
     // compound_statement
     TIntermNode* functionBody = nullptr;
     if (acceptCompoundStatement(functionBody)) {
-        node = intermediate.growAggregate(node, functionBody);
-        intermediate.setAggregateOperator(node, EOpFunction, functionDeclarator->getType(), token.loc);
-        node->getAsAggregate()->setName(functionDeclarator->getMangledName().c_str());
-        parseContext.popScope();
-
+        parseContext.handleFunctionBody(loc, functionDeclarator, functionBody, node);
         return true;
     }
 
@@ -1612,7 +1723,7 @@
         return false;
     }
 
-    node = intermediate.addAssign(assignOp, node, rightNode, loc);
+    node = parseContext.handleAssign(loc, assignOp, node, rightNode);
     if (node == nullptr) {
         parseContext.error(loc, "could not create assignment", "", "");
         return false;
@@ -2003,6 +2114,9 @@
     case EHTokBoolConstant:
         node = intermediate.addConstantUnion(token.b, token.loc, true);
         break;
+    case EHTokStringConstant:
+        node = nullptr;
+        break;
 
     default:
         return false;
@@ -2440,7 +2554,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;
@@ -2531,18 +2645,21 @@
 }
 
 // post_decls
-//      : COLON semantic                                                            // optional
-//        COLON PACKOFFSET LEFT_PAREN c[Subcomponent][.component]       RIGHT_PAREN // optional
-//        COLON REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt RIGHT_PAREN // optional
-//        annotations                                                               // optional
+//      : COLON semantic // optional
+//        COLON PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN // optional
+//        COLON REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt (COMMA SPACEN)opt RIGHT_PAREN // optional
+//        COLON LAYOUT layout_qualifier_list
+//        annotations // optional
 //
-void HlslGrammar::acceptPostDecls(TType& type)
+void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
 {
     do {
         // COLON 
         if (acceptTokenClass(EHTokColon)) {
             HlslToken idToken;
-            if (acceptTokenClass(EHTokPackOffset)) {
+            if (peekTokenClass(EHTokLayout))
+                acceptLayoutQualifierList(qualifier);
+            else if (acceptTokenClass(EHTokPackOffset)) {
                 // PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN
                 if (! acceptTokenClass(EHTokLeftParen)) {
                     expected("(");
@@ -2564,12 +2681,13 @@
                     expected(")");
                     break;
                 }
-                parseContext.handlePackOffset(locationToken.loc, type, *locationToken.string, componentToken.string);
+                parseContext.handlePackOffset(locationToken.loc, qualifier, *locationToken.string, componentToken.string);
             } else if (! acceptIdentifier(idToken)) {
-                expected("semantic or packoffset or register");
+                expected("layout, semantic, packoffset, or register");
                 return;
             } else if (*idToken.string == "register") {
-                // REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt RIGHT_PAREN
+                // REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt (COMMA SPACEN)opt RIGHT_PAREN
+                // LEFT_PAREN
                 if (! acceptTokenClass(EHTokLeftParen)) {
                     expected("(");
                     return;
@@ -2580,7 +2698,8 @@
                     expected("register number description");
                     return;
                 }
-                if (acceptTokenClass(EHTokComma)) {
+                if (registerDesc.string->size() > 1 && !isdigit((*registerDesc.string)[1]) &&
+                                                       acceptTokenClass(EHTokComma)) {
                     // Then we didn't really see the registerDesc yet, it was
                     // actually the profile.  Adjust...
                     profile = registerDesc;
@@ -2603,14 +2722,23 @@
                         break;
                     }
                 }
+                // (COMMA SPACEN)opt
+                HlslToken spaceDesc;
+                if (acceptTokenClass(EHTokComma)) {
+                    if (! acceptIdentifier(spaceDesc)) {
+                        expected ("space identifier");
+                        return;
+                    }
+                }
+                // RIGHT_PAREN
                 if (! acceptTokenClass(EHTokRightParen)) {
                     expected(")");
                     break;
                 }
-                parseContext.handleRegister(registerDesc.loc, type, profile.string, *registerDesc.string, subComponent);
+                parseContext.handleRegister(registerDesc.loc, qualifier, profile.string, *registerDesc.string, subComponent, spaceDesc.string);
             } else {
                 // semantic, in idToken.string
-                parseContext.handleSemantic(type, *idToken.string);
+                parseContext.handleSemantic(idToken.loc, qualifier, *idToken.string);
             }
         } else if (acceptTokenClass(EHTokLeftAngle)) {
             // TODO: process annotations, just accepting them for now
diff --git a/hlsl/hlslGrammar.h b/hlsl/hlslGrammar.h
index c522df4..f5c7d4d 100755
--- a/hlsl/hlslGrammar.h
+++ b/hlsl/hlslGrammar.h
@@ -67,11 +67,13 @@
         bool acceptSamplerDeclarationDX9(TType&);
         bool acceptSamplerState();
         bool acceptFullySpecifiedType(TType&);
-        void acceptQualifier(TQualifier&);
+        bool acceptQualifier(TQualifier&);
+        bool acceptLayoutQualifierList(TQualifier&);
         bool acceptType(TType&);
         bool acceptTemplateType(TBasicType&);
         bool acceptVectorTemplateType(TType&);
         bool acceptMatrixTemplateType(TType&);
+        bool acceptStringTemplateType(TType&);
         bool acceptSamplerType(TType&);
         bool acceptTextureType(TType&);
         bool acceptStruct(TType&);
@@ -104,7 +106,7 @@
         bool acceptCaseLabel(TIntermNode*&);
         bool acceptDefaultLabel(TIntermNode*&);
         void acceptArraySpecifier(TArraySizes*&);
-        void acceptPostDecls(TType&);
+        void acceptPostDecls(TQualifier&);
 
         HlslParseContext& parseContext;  // state of parsing and helper functions for building the intermediate
         TIntermediate& intermediate;     // the final product, the intermediate representation, includes the AST
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index fc926d7..9018606 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 {
@@ -55,7 +55,8 @@
     contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0),
     postMainReturn(false),
     limits(resources.limits),
-    afterEOF(false)
+    entryPointOutput(nullptr),
+    nextInLocation(0), nextOutLocation(0)
 {
     // ensure we always have a linkage node, even if empty, to simplify tree topology algorithms
     linkage = new TIntermAggregate;
@@ -82,6 +83,9 @@
 
     if (language == EShLangGeometry)
         globalOutputDefaults.layoutStream = 0;
+
+    if (spvVersion.spv == 0 || spvVersion.vulkan == 0)
+        infoSink.info << "ERROR: HLSL currently only supported when requesting SPIR-V for Vulkan.\n";
 }
 
 HlslParseContext::~HlslParseContext()
@@ -116,8 +120,14 @@
 
     HlslScanContext scanContext(*this, ppContext);
     HlslGrammar grammar(scanContext, *this);
-    if (! grammar.parse())
-        printf("HLSL translation failed.\n");
+    if (!grammar.parse()) {
+        // Print a message formated such that if you click on the message it will take you right to
+        // the line through most UIs.
+        const glslang::TSourceLoc& sourceLoc = input.getSourceLoc();
+        infoSink.info << sourceLoc.name << "(" << sourceLoc.line << "): error at column " << sourceLoc.column << ", HLSL parsing failed.\n";
+        ++numErrors;
+        return false;
+    }
 
     return numErrors == 0;
 }
@@ -636,6 +646,15 @@
                 return addConstructor(loc, base, type);
             }
         }
+        if (base->getVectorSize() == 1) {
+            TType scalarType(base->getBasicType(), EvqTemporary, 1);
+            if (fields.num == 1)
+                return addConstructor(loc, base, scalarType);
+            else {
+                TType vectorType(base->getBasicType(), EvqTemporary, fields.num);
+                return addConstructor(loc, addConstructor(loc, base, scalarType), vectorType);
+            }
+        }
 
         if (base->getType().getQualifier().isFrontEndConstant())
             result = intermediate.foldSwizzle(base, fields, loc);
@@ -662,12 +681,16 @@
             }
         }
         if (fieldFound) {
-            if (base->getType().getQualifier().storage == EvqConst)
-                result = intermediate.foldDereference(base, member, loc);
+            if (base->getAsSymbolNode() && shouldFlatten(base->getType()))
+                result = flattenAccess(base, member);
             else {
-                TIntermTyped* index = intermediate.addConstantUnion(member, loc);
-                result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);
-                result->setType(*(*fields)[member].type);
+                if (base->getType().getQualifier().storage == EvqConst)
+                    result = intermediate.foldDereference(base, member, loc);
+                else {
+                    TIntermTyped* index = intermediate.addConstantUnion(member, loc);
+                    result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);
+                    result->setType(*(*fields)[member].type);
+                }
             }
         } else
             error(loc, "no such field in structure", field.c_str(), "");
@@ -677,11 +700,97 @@
     return result;
 }
 
+// Is this an aggregate that can't be passed down the stack?
+// E.g., pipeline inputs to the vertex stage and outputs from the fragment stage.
+bool HlslParseContext::shouldFlatten(const TType& type) const
+{
+    if (! inEntryPoint)
+        return false;
+
+    const TStorageQualifier qualifier = type.getQualifier().storage;
+
+    return type.isStruct() &&
+           (qualifier == EvqVaryingIn ||
+            qualifier == EvqVaryingOut);
+}
+
+// Figure out the mapping between an aggregate's top members and an
+// equivalent set of individual variables.
+//
+// N.B. Erases memory of I/O-related annotations in the original type's member,
+//      effecting a transfer of this information to the flattened variable form.
+//
+// Assumes shouldFlatten() or equivalent was called first.
+//
+// TODO: generalize this to arbitrary nesting?
+void HlslParseContext::flatten(const TVariable& variable)
+{
+    TVector<TVariable*> memberVariables;
+
+    auto members = *variable.getType().getStruct();
+    for (int member = 0; member < (int)members.size(); ++member) {
+        TVariable* memberVariable = makeInternalVariable(members[member].type->getFieldName().c_str(),
+                                                         *members[member].type);
+        mergeQualifiers(memberVariable->getWritableType().getQualifier(), variable.getType().getQualifier());
+        memberVariables.push_back(memberVariable);
+
+        // N.B. Erase I/O-related annotations from the source-type member.
+        members[member].type->getQualifier().makeTemporary();
+    }
+
+    flattenMap[variable.getUniqueId()] = memberVariables;
+}
+
+// Turn an access into aggregate that was flattened to instead be
+// an access to the individual variable the element/member was flattened to.
+// Assumes shouldFlatten() or equivalent was called first.
+TIntermTyped* HlslParseContext::flattenAccess(TIntermTyped* base, int member)
+{
+    const TIntermSymbol& symbolNode = *base->getAsSymbolNode();
+
+    if (flattenMap.find(symbolNode.getId()) == flattenMap.end())
+        return base;
+
+    const TVariable* memberVariable = flattenMap[symbolNode.getId()][member];
+    return intermediate.addSymbol(*memberVariable);
+}
+
+// Variables that correspond to the user-interface in and out of a stage
+// (not the built-in interface) are assigned locations and
+// registered as a linkage node (part of the stage's external interface).
+//
+// Assumes it is called in the order in which locations should be assigned.
+void HlslParseContext::assignLocations(TVariable& variable)
+{
+    const auto assignLocation = [&](TVariable& variable) {
+        const TQualifier& qualifier = variable.getType().getQualifier();
+        if (qualifier.storage == EvqVaryingIn || qualifier.storage == EvqVaryingOut) {
+            if (qualifier.builtIn == EbvNone) {
+                if (qualifier.storage == EvqVaryingIn) {
+                    variable.getWritableType().getQualifier().layoutLocation = nextInLocation;
+                    nextInLocation += intermediate.computeTypeLocationSize(variable.getType());
+                } else {
+                    variable.getWritableType().getQualifier().layoutLocation = nextOutLocation;
+                    nextOutLocation += intermediate.computeTypeLocationSize(variable.getType());
+                }
+            }
+            intermediate.addSymbolLinkageNode(linkage, variable);
+        }
+    };
+
+    if (shouldFlatten(variable.getType())) {
+        auto& memberList = flattenMap[variable.getUniqueId()];
+        for (auto member = memberList.begin(); member != memberList.end(); ++member)
+            assignLocation(**member);
+    } else
+        assignLocation(variable);
+}
+
 //
 // Handle seeing a function declarator in the grammar.  This is the precursor
 // to recognizing a function prototype or function definition.
 //
-TFunction* HlslParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunction& function, bool prototype)
+TFunction& HlslParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunction& function, bool prototype)
 {
     //
     // Multiple declarations of the same function name are allowed.
@@ -715,7 +824,7 @@
     // in which case, we need to use the parameter names from this one, and not the one that's
     // being redeclared.  So, pass back this declaration, not the one in the symbol table.
     //
-    return &function;
+    return function;
 }
 
 //
@@ -747,12 +856,18 @@
         currentFunctionType = new TType(EbtVoid);
     functionReturnsValue = false;
 
-    inEntrypoint = (function.getName() == intermediate.getEntryPoint().c_str());
-    if (inEntrypoint) {
-        // parameters are actually shader-level inputs
-        for (int i = 0; i < function.getParamCount(); i++)
-            function[i].type->getQualifier().storage = EvqVaryingIn;
-    }
+    inEntryPoint = function.getName().compare(intermediate.getEntryPointName().c_str()) == 0;
+    if (inEntryPoint) {
+        intermediate.setEntryPointMangledName(function.getMangledName().c_str());
+        intermediate.incrementEntryPointCount();
+        remapEntryPointIO(function);
+        if (entryPointOutput) {
+            if (shouldFlatten(entryPointOutput->getType()))
+                flatten(*entryPointOutput);
+            assignLocations(*entryPointOutput);
+        }
+    } else
+        remapNonEntryPointIO(function);
 
     //
     // New symbol table scope for body of function plus its arguments
@@ -764,7 +879,7 @@
     // If the parameter has no name, it's not an error, just don't insert it
     // (could be used for unused args).
     //
-    // Also, accumulate the list of parameters into the HIL, so lower level code
+    // Also, accumulate the list of parameters into the AST, so lower level code
     // knows where to find parameters.
     //
     TIntermAggregate* paramNodes = new TIntermAggregate;
@@ -777,13 +892,20 @@
             if (! symbolTable.insert(*variable))
                 error(loc, "redefinition", variable->getName().c_str(), "");
             else {
+                // get IO straightened out
+                if (inEntryPoint) {
+                    if (shouldFlatten(*param.type))
+                        flatten(*variable);
+                    assignLocations(*variable);
+                }
+
                 // Transfer ownership of name pointer to symbol table.
                 param.name = nullptr;
 
-                // Add the parameter to the HIL
+                // Add the parameter to the AST
                 paramNodes = intermediate.growAggregate(paramNodes,
-                    intermediate.addSymbol(*variable, loc),
-                    loc);
+                                                        intermediate.addSymbol(*variable, loc),
+                                                        loc);
             }
         } else
             paramNodes = intermediate.growAggregate(paramNodes, intermediate.addSymbol(*param.type, loc), loc);
@@ -796,6 +918,117 @@
     return paramNodes;
 }
 
+void HlslParseContext::handleFunctionBody(const TSourceLoc& loc, TFunction& function, TIntermNode* functionBody, TIntermNode*& node)
+{
+    node = intermediate.growAggregate(node, functionBody);
+    intermediate.setAggregateOperator(node, EOpFunction, function.getType(), loc);
+    node->getAsAggregate()->setName(function.getMangledName().c_str());
+
+    popScope();
+
+    if (function.getType().getBasicType() != EbtVoid && ! functionReturnsValue)
+        error(loc, "function does not return a value:", "", function.getName().c_str());
+}
+
+// AST I/O is done through shader globals declared in the 'in' or 'out'
+// storage class.  An HLSL entry point has a return value, input parameters
+// and output parameters.  These need to get remapped to the AST I/O.
+void HlslParseContext::remapEntryPointIO(TFunction& function)
+{
+    // Will auto-assign locations here to the inputs/outputs defined by the entry point
+
+    const auto remapType = [&](TType& type) {
+        const auto remapBuiltInType = [&](TType& type) {
+            switch (type.getQualifier().builtIn) {
+            case EbvFragDepthGreater:
+                intermediate.setDepth(EldGreater);
+                type.getQualifier().builtIn = EbvFragDepth;
+                break;
+            case EbvFragDepthLesser:
+                intermediate.setDepth(EldLess);
+                type.getQualifier().builtIn = EbvFragDepth;
+                break;
+            default:
+                break;
+            }
+        };
+        remapBuiltInType(type);
+        if (type.isStruct()) {
+            auto members = *type.getStruct();
+            for (auto member = members.begin(); member != members.end(); ++member)
+                remapBuiltInType(*member->type);
+        }
+    };
+
+    // return value is actually a shader-scoped output (out)
+    if (function.getType().getBasicType() != EbtVoid) {
+        entryPointOutput = makeInternalVariable("@entryPointOutput", function.getType());
+        entryPointOutput->getWritableType().getQualifier().storage = EvqVaryingOut;
+        remapType(function.getWritableType());
+    }
+
+    // parameters are actually shader-scoped inputs and outputs (in or out)
+    for (int i = 0; i < function.getParamCount(); i++) {
+        TType& paramType = *function[i].type;
+        paramType.getQualifier().storage = paramType.getQualifier().isParamInput() ? EvqVaryingIn : EvqVaryingOut;
+        remapType(paramType);
+    }
+}
+
+// An HLSL function that looks like an entry point, but is not,
+// declares entry point IO built-ins, but these have to be undone.
+void HlslParseContext::remapNonEntryPointIO(TFunction& function)
+{
+    const auto remapBuiltInType = [&](TType& type) { type.getQualifier().builtIn = EbvNone; };
+
+    // return value
+    if (function.getType().getBasicType() != EbtVoid)
+        remapBuiltInType(function.getWritableType());
+
+    // parameters
+    for (int i = 0; i < function.getParamCount(); i++)
+        remapBuiltInType(*function[i].type);
+}
+
+// Handle function returns, including type conversions to the function return type
+// if necessary.
+TIntermNode* HlslParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value)
+{
+    functionReturnsValue = true;
+    TIntermTyped* converted = value;
+
+    if (currentFunctionType->getBasicType() == EbtVoid) {
+        error(loc, "void function cannot return a value", "return", "");
+        return intermediate.addBranch(EOpReturn, loc);
+    } else if (*currentFunctionType != value->getType()) {
+        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", "");
+            converted = value;
+        }
+    }
+
+    // The entry point needs to send any return value to the entry-point output instead.
+    // So, a subtree is built up, as a two-part sequence, with the first part being an
+    // assignment subtree, and the second part being a return with no value.
+    //
+    // Otherwise, for a non entry point, just return a return statement.
+    if (inEntryPoint) {
+        assert(entryPointOutput != nullptr); // should have been error tested at the beginning
+        TIntermSymbol* left = new TIntermSymbol(entryPointOutput->getUniqueId(), entryPointOutput->getName(),
+                                                entryPointOutput->getType());
+        TIntermNode* returnSequence = handleAssign(loc, EOpAssign, left, converted);
+        returnSequence = intermediate.makeAggregate(returnSequence);
+        returnSequence = intermediate.growAggregate(returnSequence, intermediate.addBranch(EOpReturn, loc));
+        returnSequence->getAsAggregate()->setOperator(EOpSequence);
+
+        return returnSequence;
+    } else
+        return intermediate.addBranch(EOpReturn, value, loc);
+}
+
 void HlslParseContext::handleFunctionArgument(TFunction* function, TIntermTyped*& arguments, TIntermTyped* newArg)
 {
     TParameter param = { 0, new TType };
@@ -807,6 +1040,55 @@
         arguments = newArg;
 }
 
+// Some simple source assignments need to be flattened to a sequence
+// of AST assignments.  Catch these and flatten, otherwise, pass through
+// to intermediate.addAssign().
+TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right) const
+{
+    const auto mustFlatten = [&](const TIntermTyped& node) {
+        return shouldFlatten(node.getType()) && node.getAsSymbolNode() &&
+               flattenMap.find(node.getAsSymbolNode()->getId()) != flattenMap.end();
+    };
+
+    bool flattenLeft = mustFlatten(*left);
+    bool flattenRight = mustFlatten(*right);
+    if (! flattenLeft && ! flattenRight)
+        return intermediate.addAssign(op, left, right, loc);
+
+    // If we get here, we are assigning to or from a whole struct that must be
+    // flattened, so have to do member-by-member assignment:
+    const auto& members = *left->getType().getStruct();
+    const auto getMember = [&](bool flatten, TIntermTyped* node,
+                               const TVector<TVariable*>& memberVariables, int member) {
+        TIntermTyped* subTree;
+        if (flatten)
+            subTree = intermediate.addSymbol(*memberVariables[member]);
+        else {
+            subTree = intermediate.addIndex(EOpIndexDirectStruct, node,
+                                            intermediate.addConstantUnion(member, loc), loc);
+            subTree->setType(*members[member].type);
+        }
+
+        return subTree;
+    };
+    
+    const TVector<TVariable*>* leftVariables = nullptr;
+    const TVector<TVariable*>* rightVariables = nullptr;
+    if (flattenLeft)
+        leftVariables = &flattenMap.find(left->getAsSymbolNode()->getId())->second;
+    if (flattenRight)
+        rightVariables = &flattenMap.find(right->getAsSymbolNode()->getId())->second;
+    TIntermAggregate* assignList = nullptr;
+    for (int member = 0; member < (int)members.size(); ++member) {
+        TIntermTyped* subRight = getMember(flattenRight, right, *rightVariables, member);
+        TIntermTyped* subLeft = getMember(flattenLeft, left, *leftVariables, member);
+        assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, subLeft, subRight, loc));
+    }
+    assignList->setOperator(EOpSequence);
+
+    return assignList;
+}
+
 //
 // HLSL atomic operations have slightly different arguments than
 // GLSL/AST/SPIRV.  The semantics are converted below in decomposeIntrinsic.
@@ -998,7 +1280,7 @@
 
             const TSampler& texSampler = texType.getSampler();
             const TSamplerDim dim = texSampler.dim;
-            const int numArgs = (int) argAggregate->getSequence().size();
+            const int numArgs = (int)argAggregate->getSequence().size();
 
             int numDims = 0;
 
@@ -1184,7 +1466,7 @@
                 lodComponent->setType(TType(coordBaseType, EvqTemporary, 1));
             }
 
-            const int numArgs    = (int) argAggregate->getSequence().size();
+            const int numArgs    = (int)argAggregate->getSequence().size();
             const bool hasOffset = ((!isMS && numArgs == 3) || (isMS && numArgs == 4));
 
             // Create texel fetch
@@ -1228,7 +1510,7 @@
             TIntermTyped* argLod    = argAggregate->getSequence()[3]->getAsTyped();
             TIntermTyped* argOffset = nullptr;
 
-            const int  numArgs = (int) argAggregate->getSequence().size();
+            const int  numArgs = (int)argAggregate->getSequence().size();
 
             if (numArgs == 5) // offset, if present
                 argOffset = argAggregate->getSequence()[4]->getAsTyped();
@@ -1327,7 +1609,7 @@
 
             const TSamplerDim dim = argTex->getType().getSampler().dim;
 
-            const int  argSize = argAggregate->getSequence().size();
+            const int  argSize = (int)argAggregate->getSequence().size();
             bool hasStatus     = (argSize == (5+cmpValues) || argSize == (8+cmpValues));
             bool hasOffset1    = false;
             bool hasOffset4    = false;
@@ -1464,8 +1746,10 @@
     case EOpGenMul:
         {
             // mul(a,b) -> MatrixTimesMatrix, MatrixTimesVector, MatrixTimesScalar, VectorTimesScalar, Dot, Mul
-            TIntermTyped* arg0 = argAggregate->getSequence()[0]->getAsTyped();
-            TIntermTyped* arg1 = argAggregate->getSequence()[1]->getAsTyped();
+            // Since we are treating HLSL rows like GLSL columns (the first matrix indirection),
+            // we must reverse the operand order here.  Hence, arg0 gets sequence[1], etc.
+            TIntermTyped* arg0 = argAggregate->getSequence()[1]->getAsTyped();
+            TIntermTyped* arg1 = argAggregate->getSequence()[0]->getAsTyped();
 
             if (arg0->isVector() && arg1->isVector()) {  // vec * vec
                 node->getAsAggregate()->setOperator(EOpDot);
@@ -1965,6 +2249,16 @@
 void HlslParseContext::addInputArgumentConversions(const TFunction& function, TIntermNode*& arguments) const
 {
     TIntermAggregate* aggregate = arguments->getAsAggregate();
+    const auto setArg = [&](int argNum, TIntermNode* arg) {
+        if (function.getParamCount() == 1)
+            arguments = arg;
+        else {
+            if (aggregate)
+                aggregate->getSequence()[argNum] = arg;
+            else
+                arguments = arg;
+        }
+    };
 
     // Process each argument's conversion
     for (int i = 0; i < function.getParamCount(); ++i) {
@@ -1977,16 +2271,22 @@
                 // In-qualified arguments just need an extra node added above the argument to
                 // convert to the correct type.
                 arg = intermediate.addConversion(EOpFunctionCall, *function[i].type, arg);
-                if (arg) {
-                    if (function.getParamCount() == 1)
-                        arguments = arg;
-                    else {
-                        if (aggregate)
-                            aggregate->getSequence()[i] = arg;
-                        else
-                            arguments = arg;
-                    }
-                }
+                arg = intermediate.addShapeConversion(EOpFunctionCall, *function[i].type, arg);
+                setArg(i, arg);
+            }
+        } else {
+            if (shouldFlatten(arg->getType())) {
+                TSourceLoc dummyLoc;
+                dummyLoc.init();
+                TVariable* internalAggregate = makeInternalVariable("aggShadow", *function[i].type);
+                internalAggregate->getWritableType().getQualifier().makeTemporary();
+                TIntermSymbol* internalSymbolNode = new TIntermSymbol(internalAggregate->getUniqueId(), 
+                                                                      internalAggregate->getName(),
+                                                                      internalAggregate->getType());
+                TIntermAggregate* assignAgg = handleAssign(dummyLoc, EOpAssign, internalSymbolNode, arg)->getAsAggregate();
+                assignAgg = intermediate.growAggregate(assignAgg, internalSymbolNode);
+                assignAgg->setOperator(EOpComma);
+                setArg(i, assignAgg);
             }
         }
     }
@@ -2231,32 +2531,115 @@
 // Handle seeing a "COLON semantic" at the end of a type declaration,
 // by updating the type according to the semantic.
 //
-void HlslParseContext::handleSemantic(TType& type, const TString& semantic)
+void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, const TString& semantic)
 {
     // TODO: need to know if it's an input or an output
     // The following sketches what needs to be done, but can't be right
     // without taking into account stage and input/output.
+
+    TString semanticUpperCase = semantic;
+    std::transform(semanticUpperCase.begin(), semanticUpperCase.end(), semanticUpperCase.begin(), ::toupper);
+    // in DX9, all outputs had to have a semantic associated with them, that was either consumed
+    // by the system or was a specific register assignment
+    // in DX10+, only semantics with the SV_ prefix have any meaning beyond decoration
+    // Fxc will only accept DX9 style semantics in compat mode
+    // Also, in DX10 if a SV value is present as the input of a stage, but isn't appropriate for that
+    // stage, it would just be ignored as it is likely there as part of an output struct from one stage
+    // to the next
     
-    if (semantic == "PSIZE")
-        type.getQualifier().builtIn = EbvPointSize;
-    else if (semantic == "POSITION")
-        type.getQualifier().builtIn = EbvPosition;
-    else if (semantic == "FOG")
-        type.getQualifier().builtIn = EbvFogFragCoord;
-    else if (semantic == "DEPTH" || semantic == "SV_Depth")
-        type.getQualifier().builtIn = EbvFragDepth;
-    else if (semantic == "VFACE" || semantic == "SV_IsFrontFace")
-        type.getQualifier().builtIn = EbvFace;
-    else if (semantic == "VPOS" || semantic == "SV_Position")
-        type.getQualifier().builtIn = EbvFragCoord;
-    else if (semantic == "SV_ClipDistance")
-        type.getQualifier().builtIn = EbvClipDistance;
-    else if (semantic == "SV_CullDistance")
-        type.getQualifier().builtIn = EbvCullDistance;
-    else if (semantic == "SV_VertexID")
-        type.getQualifier().builtIn = EbvVertexId;
-    else if (semantic == "SV_ViewportArrayIndex")
-        type.getQualifier().builtIn = EbvViewportIndex;
+    
+    bool bParseDX9 = false;
+    if (bParseDX9) {
+        if (semanticUpperCase == "PSIZE")
+            qualifier.builtIn = EbvPointSize;
+        else if (semantic == "FOG")
+            qualifier.builtIn = EbvFogFragCoord;
+        else if (semanticUpperCase == "DEPTH")
+            qualifier.builtIn = EbvFragDepth;
+        else if (semanticUpperCase == "VFACE")
+            qualifier.builtIn = EbvFace;
+        else if (semanticUpperCase == "VPOS")
+            qualifier.builtIn = EbvFragCoord;
+    }
+
+    //SV Position has a different meaning in vertex vs fragment
+    if (semanticUpperCase == "SV_POSITION" && language != EShLangFragment)
+        qualifier.builtIn = EbvPosition;
+    else if (semanticUpperCase == "SV_POSITION" && language == EShLangFragment)
+        qualifier.builtIn = EbvFragCoord;
+    else if (semanticUpperCase == "SV_CLIPDISTANCE")
+        qualifier.builtIn = EbvClipDistance;
+    else if (semanticUpperCase == "SV_CULLDISTANCE")
+        qualifier.builtIn = EbvCullDistance;
+    else if (semanticUpperCase == "SV_VERTEXID")
+        qualifier.builtIn = EbvVertexIndex;
+    else if (semanticUpperCase == "SV_VIEWPORTARRAYINDEX")
+        qualifier.builtIn = EbvViewportIndex;
+    else if (semanticUpperCase == "SV_TESSFACTOR")
+        qualifier.builtIn = EbvTessLevelOuter;
+
+    //Targets are defined 0-7
+    else if (semanticUpperCase == "SV_TARGET") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 0;
+    } else if (semanticUpperCase == "SV_TARGET0") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 0;
+    } else if (semanticUpperCase == "SV_TARGET1") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 1;
+    } else if (semanticUpperCase == "SV_TARGET2") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 2;
+    } else if (semanticUpperCase == "SV_TARGET3") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 3;
+    } else if (semanticUpperCase == "SV_TARGET4") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 4;
+    } else if (semanticUpperCase == "SV_TARGET5") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 5;
+    } else if (semanticUpperCase == "SV_TARGET6") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 6;
+    } else if (semanticUpperCase == "SV_TARGET7") {
+        qualifier.builtIn = EbvNone;
+        //qualifier.layoutLocation = 7;
+    } else if (semanticUpperCase == "SV_SAMPLEINDEX")
+        qualifier.builtIn = EbvSampleId;
+    else if (semanticUpperCase == "SV_RENDERTARGETARRAYINDEX")
+        qualifier.builtIn = EbvLayer;
+    else if (semanticUpperCase == "SV_PRIMITIVEID")
+        qualifier.builtIn = EbvPrimitiveId;
+    else if (semanticUpperCase == "SV_OUTPUTCONTROLPOINTID")
+        qualifier.builtIn = EbvInvocationId;
+    else if (semanticUpperCase == "SV_ISFRONTFACE")
+        qualifier.builtIn = EbvFace;
+    else if (semanticUpperCase == "SV_INSTANCEID")
+        qualifier.builtIn = EbvInstanceIndex;
+    else if (semanticUpperCase == "SV_INSIDETESSFACTOR")
+        qualifier.builtIn = EbvTessLevelInner;
+    else if (semanticUpperCase == "SV_GSINSTANCEID")
+        qualifier.builtIn = EbvInvocationId;
+    else if (semanticUpperCase == "SV_GROUPTHREADID")
+        qualifier.builtIn = EbvLocalInvocationId;
+    else if (semanticUpperCase == "SV_GROUPID")
+        qualifier.builtIn = EbvWorkGroupId;
+    else if (semanticUpperCase == "SV_DOMAINLOCATION")
+        qualifier.builtIn = EbvTessCoord;
+    else if (semanticUpperCase == "SV_DEPTH")
+        qualifier.builtIn = EbvFragDepth;
+
+    //TODO, these need to get refined to be more specific 
+    else if( semanticUpperCase == "SV_DEPTHGREATEREQUAL")
+        qualifier.builtIn = EbvFragDepthGreater;
+    else if( semanticUpperCase == "SV_DEPTHLESSEQUAL")
+        qualifier.builtIn = EbvFragDepthLesser;
+    else if( semanticUpperCase == "SV_STENCILREF")
+        error(loc, "unimplemented", "SV_STENCILREF", "");
+    else if( semanticUpperCase == "SV_COVERAGE")
+        error(loc, "unimplemented", "SV_COVERAGE", "");
 }
 
 //
@@ -2265,8 +2648,8 @@
 // 'location' has the "c[Subcomponent]" part.
 // 'component' points to the "component" part, or nullptr if not present.
 //
-void HlslParseContext::handlePackOffset(const TSourceLoc& loc, TType& type, const glslang::TString& location,
-                                                                            const glslang::TString* component)
+void HlslParseContext::handlePackOffset(const TSourceLoc& loc, TQualifier& qualifier, const glslang::TString& location,
+                                        const glslang::TString* component)
 {
     if (location.size() == 0 || location[0] != 'c') {
         error(loc, "expected 'c'", "packoffset", "");
@@ -2279,7 +2662,7 @@
         return;
     }
 
-    type.getQualifier().layoutOffset = 16 * atoi(location.substr(1, location.size()).c_str());
+    qualifier.layoutOffset = 16 * atoi(location.substr(1, location.size()).c_str());
     if (component != nullptr) {
         int componentOffset = 0;
         switch ((*component)[0]) {
@@ -2295,7 +2678,7 @@
             error(loc, "expected {x, y, z, w} for component", "packoffset", "");
             return;
         }
-        type.getQualifier().layoutOffset += componentOffset;
+        qualifier.layoutOffset += componentOffset;
     }
 }
 
@@ -2305,9 +2688,8 @@
 // 'profile' points to the shader_profile part, or nullptr if not present.
 // 'desc' is the type# part.
 //
-void HlslParseContext::handleRegister(const TSourceLoc& loc, TType& type, const glslang::TString* profile,
-                                                                          const glslang::TString& desc,
-                                                                          int subComponent)
+void HlslParseContext::handleRegister(const TSourceLoc& loc, TQualifier& qualifier, const glslang::TString* profile,
+                                      const glslang::TString& desc, int subComponent, const glslang::TString* spaceDesc)
 {
     if (profile != nullptr)
         warn(loc, "ignoring shader_profile", "register", "");
@@ -2333,12 +2715,34 @@
     case 't':
     case 'c':
     case 's':
-        type.getQualifier().layoutBinding = regNumber + subComponent;
+        qualifier.layoutBinding = regNumber + subComponent;
         break;
     default:
         warn(loc, "ignoring unrecognized register type", "register", "%c", desc[0]);
         break;
     }
+
+    // space
+    unsigned int setNumber;
+    const auto crackSpace = [&]() {
+        const int spaceLen = 5;
+        if (spaceDesc->size() < spaceLen + 1)
+            return false;
+        if (spaceDesc->compare(0, spaceLen, "space") != 0)
+            return false;
+        if (! isdigit((*spaceDesc)[spaceLen]))
+            return false;
+        setNumber = atoi(spaceDesc->substr(spaceLen, spaceDesc->size()).c_str());
+        return true;
+    };
+
+    if (spaceDesc) {
+        if (! crackSpace()) {
+            error(loc, "expected spaceN", "register", "");
+            return;
+        }
+        qualifier.layoutSet = setNumber;
+    }
 }
 
 //
@@ -2691,7 +3095,7 @@
 // 'dst', for the purpose of error checking order for versions
 // that require specific orderings of qualifiers.
 //
-void HlslParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, const TQualifier& src, bool force)
+void HlslParseContext::mergeQualifiers(TQualifier& dst, const TQualifier& src)
 {
     // Storage qualification
     if (dst.storage == EvqTemporary || dst.storage == EvqGlobal)
@@ -2702,8 +3106,6 @@
     else if ((dst.storage == EvqIn    && src.storage == EvqConst) ||
              (dst.storage == EvqConst && src.storage == EvqIn))
         dst.storage = EvqConstReadOnly;
-    else if (src.storage != EvqTemporary && src.storage != EvqGlobal)
-        error(loc, "too many storage qualifiers", GetStorageQualifierString(src.storage), "");
 
     // Layout qualifiers
     mergeObjectLayoutQualifiers(dst, src, false);
@@ -3093,51 +3495,58 @@
 
 // Put the id's layout qualification into the public type, for qualifiers not having a number set.
 // This is before we know any type information for error checking.
-void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publicType, TString& id)
+void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TQualifier& qualifier, TString& id)
 {
     std::transform(id.begin(), id.end(), id.begin(), ::tolower);
 
     if (id == TQualifier::getLayoutMatrixString(ElmColumnMajor)) {
-        publicType.qualifier.layoutMatrix = ElmColumnMajor;
+        qualifier.layoutMatrix = ElmColumnMajor;
         return;
     }
     if (id == TQualifier::getLayoutMatrixString(ElmRowMajor)) {
-        publicType.qualifier.layoutMatrix = ElmRowMajor;
+        qualifier.layoutMatrix = ElmRowMajor;
         return;
     }
     if (id == "push_constant") {
         requireVulkan(loc, "push_constant");
-        publicType.qualifier.layoutPushConstant = true;
+        qualifier.layoutPushConstant = true;
         return;
     }
     if (language == EShLangGeometry || language == EShLangTessEvaluation) {
         if (id == TQualifier::getGeometryString(ElgTriangles)) {
-            publicType.shaderQualifiers.geometry = ElgTriangles;
+            //publicType.shaderQualifiers.geometry = ElgTriangles;
+            warn(loc, "ignored", id.c_str(), "");
             return;
         }
         if (language == EShLangGeometry) {
             if (id == TQualifier::getGeometryString(ElgPoints)) {
-                publicType.shaderQualifiers.geometry = ElgPoints;
+                //publicType.shaderQualifiers.geometry = ElgPoints;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getGeometryString(ElgLineStrip)) {
-                publicType.shaderQualifiers.geometry = ElgLineStrip;
+                //publicType.shaderQualifiers.geometry = ElgLineStrip;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getGeometryString(ElgLines)) {
-                publicType.shaderQualifiers.geometry = ElgLines;
+                //publicType.shaderQualifiers.geometry = ElgLines;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getGeometryString(ElgLinesAdjacency)) {
-                publicType.shaderQualifiers.geometry = ElgLinesAdjacency;
+                //publicType.shaderQualifiers.geometry = ElgLinesAdjacency;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getGeometryString(ElgTrianglesAdjacency)) {
-                publicType.shaderQualifiers.geometry = ElgTrianglesAdjacency;
+                //publicType.shaderQualifiers.geometry = ElgTrianglesAdjacency;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getGeometryString(ElgTriangleStrip)) {
-                publicType.shaderQualifiers.geometry = ElgTriangleStrip;
+                //publicType.shaderQualifiers.geometry = ElgTriangleStrip;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
         } else {
@@ -3145,65 +3554,78 @@
 
             // input primitive
             if (id == TQualifier::getGeometryString(ElgTriangles)) {
-                publicType.shaderQualifiers.geometry = ElgTriangles;
+                //publicType.shaderQualifiers.geometry = ElgTriangles;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getGeometryString(ElgQuads)) {
-                publicType.shaderQualifiers.geometry = ElgQuads;
+                //publicType.shaderQualifiers.geometry = ElgQuads;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getGeometryString(ElgIsolines)) {
-                publicType.shaderQualifiers.geometry = ElgIsolines;
+                //publicType.shaderQualifiers.geometry = ElgIsolines;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
 
             // vertex spacing
             if (id == TQualifier::getVertexSpacingString(EvsEqual)) {
-                publicType.shaderQualifiers.spacing = EvsEqual;
+                //publicType.shaderQualifiers.spacing = EvsEqual;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getVertexSpacingString(EvsFractionalEven)) {
-                publicType.shaderQualifiers.spacing = EvsFractionalEven;
+                //publicType.shaderQualifiers.spacing = EvsFractionalEven;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getVertexSpacingString(EvsFractionalOdd)) {
-                publicType.shaderQualifiers.spacing = EvsFractionalOdd;
+                //publicType.shaderQualifiers.spacing = EvsFractionalOdd;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
 
             // triangle order
             if (id == TQualifier::getVertexOrderString(EvoCw)) {
-                publicType.shaderQualifiers.order = EvoCw;
+                //publicType.shaderQualifiers.order = EvoCw;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == TQualifier::getVertexOrderString(EvoCcw)) {
-                publicType.shaderQualifiers.order = EvoCcw;
+                //publicType.shaderQualifiers.order = EvoCcw;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
 
             // point mode
             if (id == "point_mode") {
-                publicType.shaderQualifiers.pointMode = true;
+                //publicType.shaderQualifiers.pointMode = true;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
         }
     }
     if (language == EShLangFragment) {
         if (id == "origin_upper_left") {
-            publicType.shaderQualifiers.originUpperLeft = true;
+            //publicType.shaderQualifiers.originUpperLeft = true;
+            warn(loc, "ignored", id.c_str(), "");
             return;
         }
         if (id == "pixel_center_integer") {
-            publicType.shaderQualifiers.pixelCenterInteger = true;
+            //publicType.shaderQualifiers.pixelCenterInteger = true;
+            warn(loc, "ignored", id.c_str(), "");
             return;
         }
         if (id == "early_fragment_tests") {
-            publicType.shaderQualifiers.earlyFragmentTests = true;
+            //publicType.shaderQualifiers.earlyFragmentTests = true;
+            warn(loc, "ignored", id.c_str(), "");
             return;
         }
         for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth + 1)) {
             if (id == TQualifier::getLayoutDepthString(depth)) {
-                publicType.shaderQualifiers.layoutDepth = depth;
+                //publicType.shaderQualifiers.layoutDepth = depth;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
         }
@@ -3213,7 +3635,8 @@
                 if (id == TQualifier::getBlendEquationString(be)) {
                     requireExtensions(loc, 1, &E_GL_KHR_blend_equation_advanced, "blend equation");
                     intermediate.addBlendEquation(be);
-                    publicType.shaderQualifiers.blendEquation = true;
+                    //publicType.shaderQualifiers.blendEquation = true;
+                    warn(loc, "ignored", id.c_str(), "");
                     found = true;
                     break;
                 }
@@ -3228,7 +3651,7 @@
 
 // Put the id's layout qualifier value into the public type, for qualifiers having a number set.
 // This is before we know any type information for error checking.
-void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publicType, TString& id, const TIntermTyped* node)
+void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TQualifier& qualifier, TString& id, const TIntermTyped* node)
 {
     const char* feature = "layout-id value";
     //const char* nonLiteralFeature = "non-literal layout-id value";
@@ -3243,38 +3666,38 @@
     std::transform(id.begin(), id.end(), id.begin(), ::tolower);
 
     if (id == "offset") {
-        publicType.qualifier.layoutOffset = value;
+        qualifier.layoutOffset = value;
         return;
     } else if (id == "align") {
         // "The specified alignment must be a power of 2, or a compile-time error results."
         if (! IsPow2(value))
             error(loc, "must be a power of 2", "align", "");
         else
-            publicType.qualifier.layoutAlign = value;
+            qualifier.layoutAlign = value;
         return;
     } else if (id == "location") {
         if ((unsigned int)value >= TQualifier::layoutLocationEnd)
             error(loc, "location is too large", id.c_str(), "");
         else
-            publicType.qualifier.layoutLocation = value;
+            qualifier.layoutLocation = value;
         return;
     } else if (id == "set") {
         if ((unsigned int)value >= TQualifier::layoutSetEnd)
             error(loc, "set is too large", id.c_str(), "");
         else
-            publicType.qualifier.layoutSet = value;
+            qualifier.layoutSet = value;
         return;
     } else if (id == "binding") {
         if ((unsigned int)value >= TQualifier::layoutBindingEnd)
             error(loc, "binding is too large", id.c_str(), "");
         else
-            publicType.qualifier.layoutBinding = value;
+            qualifier.layoutBinding = value;
         return;
     } else if (id == "component") {
         if ((unsigned)value >= TQualifier::layoutComponentEnd)
             error(loc, "component is too large", id.c_str(), "");
         else
-            publicType.qualifier.layoutComponent = value;
+            qualifier.layoutComponent = value;
         return;
     } else if (id.compare(0, 4, "xfb_") == 0) {
         // "Any shader making any static use (after preprocessing) of any of these 
@@ -3290,13 +3713,13 @@
             if (value >= (int)TQualifier::layoutXfbBufferEnd)
                 error(loc, "buffer is too large:", id.c_str(), "internal max is %d", TQualifier::layoutXfbBufferEnd - 1);
             else
-                publicType.qualifier.layoutXfbBuffer = value;
+                qualifier.layoutXfbBuffer = value;
             return;
         } else if (id == "xfb_offset") {
             if (value >= (int)TQualifier::layoutXfbOffsetEnd)
                 error(loc, "offset is too large:", id.c_str(), "internal max is %d", TQualifier::layoutXfbOffsetEnd - 1);
             else
-                publicType.qualifier.layoutXfbOffset = value;
+                qualifier.layoutXfbOffset = value;
             return;
         } else if (id == "xfb_stride") {
             // "The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the 
@@ -3306,7 +3729,7 @@
             else if (value >= (int)TQualifier::layoutXfbStrideEnd)
                 error(loc, "stride is too large:", id.c_str(), "internal max is %d", TQualifier::layoutXfbStrideEnd - 1);
             if (value < (int)TQualifier::layoutXfbStrideEnd)
-                publicType.qualifier.layoutXfbStride = value;
+                qualifier.layoutXfbStride = value;
             return;
         }
     }
@@ -3316,7 +3739,7 @@
         if (value >= (int)TQualifier::layoutAttachmentEnd)
             error(loc, "attachment index is too large", id.c_str(), "");
         else
-            publicType.qualifier.layoutAttachment = value;
+            qualifier.layoutAttachment = value;
         return;
     }
     if (id == "constant_id") {
@@ -3324,8 +3747,8 @@
         if (value >= (int)TQualifier::layoutSpecConstantIdEnd) {
             error(loc, "specialization-constant id is too large", id.c_str(), "");
         } else {
-            publicType.qualifier.layoutSpecConstantId = value;
-            publicType.qualifier.specConstant = true;
+            qualifier.layoutSpecConstantId = value;
+            qualifier.specConstant = true;
             if (! intermediate.addUsedConstantId(value))
                 error(loc, "specialization-constant id already used", id.c_str(), "");
         }
@@ -3341,7 +3764,8 @@
             if (value == 0)
                 error(loc, "must be greater than 0", "vertices", "");
             else
-                publicType.shaderQualifiers.vertices = value;
+                //publicType.shaderQualifiers.vertices = value;
+                warn(loc, "ignored", id.c_str(), "");
             return;
         }
         break;
@@ -3354,24 +3778,26 @@
             if (value == 0)
                 error(loc, "must be at least 1", "invocations", "");
             else
-                publicType.shaderQualifiers.invocations = value;
+                //publicType.shaderQualifiers.invocations = value;
+                warn(loc, "ignored", id.c_str(), "");
             return;
         }
         if (id == "max_vertices") {
-            publicType.shaderQualifiers.vertices = value;
+            //publicType.shaderQualifiers.vertices = value;
+            warn(loc, "ignored", id.c_str(), "");
             if (value > resources.maxGeometryOutputVertices)
                 error(loc, "too large, must be less than gl_MaxGeometryOutputVertices", "max_vertices", "");
             return;
         }
         if (id == "stream") {
-            publicType.qualifier.layoutStream = value;
+            qualifier.layoutStream = value;
             return;
         }
         break;
 
     case EShLangFragment:
         if (id == "index") {
-            publicType.qualifier.layoutIndex = value;
+            qualifier.layoutIndex = value;
             return;
         }
         break;
@@ -3379,28 +3805,34 @@
     case EShLangCompute:
         if (id.compare(0, 11, "local_size_") == 0) {
             if (id == "local_size_x") {
-                publicType.shaderQualifiers.localSize[0] = value;
+                //publicType.shaderQualifiers.localSize[0] = value;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == "local_size_y") {
-                publicType.shaderQualifiers.localSize[1] = value;
+                //publicType.shaderQualifiers.localSize[1] = value;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (id == "local_size_z") {
-                publicType.shaderQualifiers.localSize[2] = value;
+                //publicType.shaderQualifiers.localSize[2] = value;
+                warn(loc, "ignored", id.c_str(), "");
                 return;
             }
             if (spvVersion.spv != 0) {
                 if (id == "local_size_x_id") {
-                    publicType.shaderQualifiers.localSizeSpecId[0] = value;
+                    //publicType.shaderQualifiers.localSizeSpecId[0] = value;
+                    warn(loc, "ignored", id.c_str(), "");
                     return;
                 }
                 if (id == "local_size_y_id") {
-                    publicType.shaderQualifiers.localSizeSpecId[1] = value;
+                    //publicType.shaderQualifiers.localSizeSpecId[1] = value;
+                    warn(loc, "ignored", id.c_str(), "");
                     return;
                 }
                 if (id == "local_size_z_id") {
-                    publicType.shaderQualifiers.localSizeSpecId[2] = value;
+                    //publicType.shaderQualifiers.localSizeSpecId[2] = value;
+                    warn(loc, "ignored", id.c_str(), "");
                     return;
                 }
             }
@@ -3481,6 +3913,10 @@
 //
 // Look up a function name in the symbol table, and make sure it is a function.
 //
+// First, look for an exact match.  If there is none, use the generic selector
+// TParseContextBase::selectFunction() to find one, parameterized by the 
+// convertible() and better() predicates defined below.
+//
 // Return the function symbol if found, otherwise nullptr.
 //
 const TFunction* HlslParseContext::findFunction(const TSourceLoc& loc, const TFunction& call, bool& builtIn)
@@ -3497,57 +3933,96 @@
     if (symbol)
         return symbol->getAsFunction();
 
-    // exact match not found, look through a list of overloaded functions of the same name
+    // no exact match, use the generic selector, parameterized by the GLSL rules
 
-    const TFunction* candidate = nullptr;
-    TVector<TFunction*> candidateList;
+    // create list of candidates to send
+    TVector<const TFunction*> candidateList;
     symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);
+    
+    // can 'from' convert to 'to'?
+    const auto convertible = [this](const TType& from, const TType& to) {
+        if (from == to)
+            return true;
 
-    for (TVector<TFunction*>::const_iterator it = candidateList.begin(); it != candidateList.end(); ++it) {
-        const TFunction& function = *(*it);
+        // no aggregate conversions
+        if (from.isArray()  || to.isArray() || 
+            from.isStruct() || to.isStruct())
+            return false;
 
-        // to even be a potential match, number of arguments has to match
-        if (call.getParamCount() != function.getParamCount())
-            continue;
+        // basic types have to be convertible
+        if (! intermediate.canImplicitlyPromote(from.getBasicType(), to.getBasicType(), EOpFunctionCall))
+            return false;
 
-        bool possibleMatch = true;
-        for (int i = 0; i < function.getParamCount(); ++i) {
-            // same types is easy
-            if (*function[i].type == *call[i].type)
-                continue;
+        // shapes have to be convertible
+        if ((from.isScalar() && to.isScalar()) ||
+            (from.isScalar() && to.isVector()) ||
+            (from.isVector() && to.isVector() && from.getVectorSize() >= to.getVectorSize()))
+            return true;
 
-            // We have a mismatch in type, see if it is implicitly convertible
+        // TODO: what are the matrix rules? they go here
 
-            if (function[i].type->isArray() || call[i].type->isArray() ||
-                ! function[i].type->sameElementShape(*call[i].type))
-                possibleMatch = false;
-            else {
-                // do direction-specific checks for conversion of basic type
-                if (function[i].type->getQualifier().isParamInput()) {
-                    if (! intermediate.canImplicitlyPromote(call[i].type->getBasicType(), function[i].type->getBasicType()))
-                        possibleMatch = false;
-                }
-                if (function[i].type->getQualifier().isParamOutput()) {
-                    if (! intermediate.canImplicitlyPromote(function[i].type->getBasicType(), call[i].type->getBasicType()))
-                        possibleMatch = false;
-                }
+        return false;
+    };
+
+    // Is 'to2' a better conversion than 'to1'?
+    // Ties should not be considered as better.
+    // Assumes 'convertible' already said true.
+    const auto better = [](const TType& from, const TType& to1, const TType& to2) {
+        // exact match is always better than mismatch
+        if (from == to2)
+            return from != to1;
+        if (from == to1)
+            return false;
+
+        // shape changes are always worse
+        if (from.isScalar() || from.isVector()) {
+            if (from.getVectorSize() == to2.getVectorSize() &&
+                from.getVectorSize() != to1.getVectorSize())
+                return true;
+            if (from.getVectorSize() == to1.getVectorSize() &&
+                from.getVectorSize() != to2.getVectorSize())
+                return false;
+        }
+
+        // Might or might not be changing shape, which means basic type might
+        // or might not match, so within that, the question is how big a
+        // basic-type conversion is being done.
+        //
+        // Use a hierarchy of domains, translated to order of magnitude
+        // in a linearized view:
+        //   - floating-point vs. integer
+        //     - 32 vs. 64 bit (or width in general)
+        //       - bool vs. non bool
+        //         - signed vs. not signed
+        const auto linearize = [](const TBasicType& basicType) {
+            switch (basicType) {
+            case EbtBool:     return 1;
+            case EbtInt:      return 10;
+            case EbtUint:     return 11;
+            case EbtInt64:    return 20;
+            case EbtUint64:   return 21;
+            case EbtFloat:    return 100;
+            case EbtDouble:   return 110;
+            default:          return 0;
             }
-            if (! possibleMatch)
-                break;
-        }
-        if (possibleMatch) {
-            if (candidate) {
-                // our second match, meaning ambiguity
-                error(loc, "ambiguous function signature match: multiple signatures match under implicit type conversion", call.getName().c_str(), "");
-            } else
-                candidate = &function;
-        }
-    }
+        };
 
-    if (candidate == nullptr)
+        return std::abs(linearize(to2.getBasicType()) - linearize(from.getBasicType())) <
+               std::abs(linearize(to1.getBasicType()) - linearize(from.getBasicType()));
+    };
+
+    // for ambiguity reporting
+    bool tie = false;
+    
+    // send to the generic selector
+    const TFunction* bestMatch = selectFunction(candidateList, call, convertible, better, tie);
+
+    if (bestMatch == nullptr)
         error(loc, "no matching overloaded function found", call.getName().c_str(), "");
+    else if (tie)
+        error(loc, "ambiguous best function under implicit type conversion", call.getName().c_str(), "");
 
-    return candidate;
+    return bestMatch;
 }
 
 //
@@ -3584,6 +4059,11 @@
 //
 TIntermNode* HlslParseContext::declareVariable(const TSourceLoc& loc, TString& identifier, const TType& parseType, TArraySizes* arraySizes, TIntermTyped* initializer)
 {
+    // string identifiers can nest inside < ... >, apparently with their own namespace,
+    // which is not implemented
+    if (parseType.getBasicType() == EbtString)
+        return nullptr;
+
     TType type;
     type.shallowCopy(parseType);
     if (type.isImplicitlySizedArray()) {
@@ -3833,15 +4313,21 @@
                 return nullptr;
         }
     } else if (type.isMatrix()) {
-        if (type.getMatrixCols() != (int)initList->getSequence().size()) {
-            error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
-            return nullptr;
-        }
-        TType vectorType(type, 0); // dereferenced type
-        for (int i = 0; i < type.getMatrixCols(); ++i) {
-            initList->getSequence()[i] = convertInitializerList(loc, vectorType, initList->getSequence()[i]->getAsTyped());
-            if (initList->getSequence()[i] == nullptr)
+        if (type.computeNumComponents() == (int)initList->getSequence().size()) {
+            // This means the matrix is initialized component-wise, rather than as
+            // a series of rows and columns.  We can just use the list directly as
+            // a constructor; no further processing needed.
+        } else {
+            if (type.getMatrixCols() != (int)initList->getSequence().size()) {
+                error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
                 return nullptr;
+            }
+            TType vectorType(type, 0); // dereferenced type
+            for (int i = 0; i < type.getMatrixCols(); ++i) {
+                initList->getSequence()[i] = convertInitializerList(loc, vectorType, initList->getSequence()[i]->getAsTyped());
+                if (initList->getSequence()[i] == nullptr)
+                    return nullptr;
+            }
         }
     } else if (type.isVector()) {
         if (type.getVectorSize() != (int)initList->getSequence().size()) {
@@ -4149,7 +4635,7 @@
         }
 
         TQualifier newMemberQualification = defaultQualification;
-        mergeQualifiers(memberLoc, newMemberQualification, memberQualifier, false);
+        mergeQualifiers(newMemberQualification, memberQualifier);
         memberQualifier = newMemberQualification;
     }
 
diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h
index 92641a8..ea76341 100755
--- a/hlsl/hlslParseHelper.h
+++ b/hlsl/hlslParseHelper.h
@@ -83,9 +83,18 @@
     TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
     TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
     TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
-    TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
+    bool shouldFlatten(const TType&) const;
+    void flatten(const TVariable& variable);
+    TIntermTyped* flattenAccess(TIntermTyped* base, int member);
+    void assignLocations(TVariable& variable);
+    TFunction& handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
     TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
+    void handleFunctionBody(const TSourceLoc&, TFunction&, TIntermNode* functionBody, TIntermNode*& node);
+    void remapEntryPointIO(TFunction& function);
+    void remapNonEntryPointIO(TFunction& function);
+    TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
     void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
+    TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right) const;
     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);
     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
@@ -94,11 +103,11 @@
     TIntermTyped* addOutputArgumentConversions(const TFunction&, TIntermAggregate&) const;
     void builtInOpCheck(const TSourceLoc&, const TFunction&, TIntermOperator&);
     TFunction* handleConstructorCall(const TSourceLoc&, const TType&);
-    void handleSemantic(TType& type, const TString& semantic);
-    void handlePackOffset(const TSourceLoc&, TType& type, const glslang::TString& location,
+    void handleSemantic(TSourceLoc, TQualifier&, const TString& semantic);
+    void handlePackOffset(const TSourceLoc&, TQualifier&, const glslang::TString& location,
                           const glslang::TString* component);
-    void handleRegister(const TSourceLoc&, TType& type, const glslang::TString* profile, const glslang::TString& desc,
-                        int subComponent);
+    void handleRegister(const TSourceLoc&, TQualifier&, const glslang::TString* profile, const glslang::TString& desc,
+                        int subComponent, const glslang::TString*);
 
     TIntermAggregate* handleSamplerTextureCombine(const TSourceLoc& loc, TIntermTyped* argTex, TIntermTyped* argSampler);
 
@@ -120,15 +129,15 @@
     void boolCheck(const TSourceLoc&, const TIntermTyped*);
     void globalQualifierFix(const TSourceLoc&, TQualifier&);
     bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
-    void mergeQualifiers(const TSourceLoc&, TQualifier& dst, const TQualifier& src, bool force);
+    void mergeQualifiers(TQualifier& dst, const TQualifier& src);
     int computeSamplerTypeIndex(TSampler&);
     TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&, bool& newDeclaration);
     void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes);
     void paramFix(TType& type);
     void specializationCheck(const TSourceLoc&, const TType&, const char* op);
 
-    void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&);
-    void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&, const TIntermTyped*);
+    void setLayoutQualifier(const TSourceLoc&, TQualifier&, TString&);
+    void setLayoutQualifier(const TSourceLoc&, TQualifier&, TString&, const TIntermTyped*);
     void mergeObjectLayoutQualifiers(TQualifier& dest, const TQualifier& src, bool inheritOnly);
     void checkNoShaderLayouts(const TSourceLoc&, const TShaderQualifiers&);
 
@@ -176,7 +185,7 @@
     int structNestingLevel;      // 0 if outside blocks and structures
     int controlFlowNestingLevel; // 0 if outside all flow control
     TList<TIntermSequence*> switchSequenceStack;  // case, node, case, case, node, ...; ensure only one node between cases;   stack of them for nesting
-    bool inEntrypoint;           // if inside a function, true if the function is the entry point
+    bool inEntryPoint;           // if inside a function, true if the function is the entry point
     bool postMainReturn;         // if inside a function, true if the function is the entry point and this is after a return statement
     const TType* currentFunctionType;  // the return type of the function that's currently being parsed
     bool functionReturnsValue;   // true if a non-void function has a return
@@ -187,7 +196,6 @@
     HlslParseContext& operator=(HlslParseContext&);
 
     static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2 * 2)); // see computeSamplerTypeIndex()
-    bool afterEOF;
     TQualifier globalBufferDefaults;
     TQualifier globalUniformDefaults;
     TQualifier globalInputDefaults;
@@ -195,6 +203,7 @@
     TString currentCaller;        // name of last function body entered (not valid when at global scope)
     TIdSetType inductiveLoopIds;
     TVector<TIntermTyped*> needsIndexLimitationChecking;
+    TVariable* entryPointOutput;
 
     //
     // Geometry shader input arrays:
@@ -229,6 +238,10 @@
     //    array-sizing declarations
     //
     TVector<TSymbol*> ioArraySymbolResizeList;
+
+    TMap<int, TVector<TVariable*>> flattenMap;
+    unsigned int nextInLocation;
+    unsigned int nextOutLocation;
 };
 
 } // end namespace glslang
diff --git a/hlsl/hlslParseables.cpp b/hlsl/hlslParseables.cpp
index 721da62..3f72599 100755
--- a/hlsl/hlslParseables.cpp
+++ b/hlsl/hlslParseables.cpp
@@ -218,7 +218,6 @@
 glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, const char* argType, int dim0, int dim1)
 {
     const bool isTranspose = (argOrder[0] == '^');
-    const bool isMatMul    = (argOrder[0] == '#');
     const bool isTexture   = IsTextureType(argOrder[0]);
     const bool isArrayed   = IsTextureArrayed(argOrder[0]);
     const bool isSampler   = IsSamplerType(argType[0]);
@@ -229,8 +228,6 @@
 
     if (isTranspose) {  // Take transpose of matrix dimensions
         std::swap(dim0, dim1); 
-    } else if (isMatMul) {
-        dim0 = dim1;    // set vector dimension to mat col
     } else if (isTexture) {
         if (type == 'F')       // map base type to texture of that type.
             type = 'T';        // e.g, int -> itexture, uint -> utexture, etc.
@@ -240,7 +237,7 @@
             type = 'u';
     }
 
-    if (isTranspose || isMatMul)
+    if (isTranspose)
         ++argOrder;
 
     char order = *argOrder;
@@ -312,16 +309,14 @@
         switch (order) {
         case '-': break;  // no dimensions for voids
         case 'S': break;  // no dimensions on scalars
-        case 'V': s += ('0' + char(dim0)); break;
+        case 'V':
+            s += ('0' + char(dim0));
+            break;
         case 'M': 
-            {
-                if (!UseHlslTypes)  // GLSL has column first for mat types
-                    std::swap(dim0, dim1);
-                s += ('0' + char(dim0));
-                s += 'x';
-                s += ('0' + char(dim1));
-                break;
-            }
+            s += ('0' + char(dim0));
+            s += 'x';
+            s += ('0' + char(dim1));
+            break;
         default:
             break;
         }
@@ -427,6 +422,7 @@
                 const int retRows = xRows;
                 const int retCols = yCols;
 
+                // Create a mat * mat of the appropriate dimensions
                 AppendTypeName(s, "M", "F", retRows, retCols);  // add return type
                 s.append(" ");                                  // space between type and name
                 s.append("mul");                                // intrinsic name
@@ -438,6 +434,31 @@
 
                 s.append(");\n");                               // close paren
             }
+
+            // Create M*V
+            AppendTypeName(s, "V", "F", xRows, 1);          // add return type
+            s.append(" ");                                  // space between type and name
+            s.append("mul");                                // intrinsic name
+            s.append("(");                                  // open paren
+
+            AppendTypeName(s, "M", "F", xRows, xCols);      // add X input
+            s.append(", ");
+            AppendTypeName(s, "V", "F", xCols, 1);          // add Y input
+
+            s.append(");\n");                               // close paren
+
+
+            // Create V*M
+            AppendTypeName(s, "V", "F", xCols, 1);          // add return type
+            s.append(" ");                                  // space between type and name
+            s.append("mul");                                // intrinsic name
+            s.append("(");                                  // open paren
+
+            AppendTypeName(s, "V", "F", xRows, 1);          // add Y input
+            s.append(", ");
+            AppendTypeName(s, "M", "F", xRows, xCols);      // add X input
+
+            s.append(");\n");                               // close paren
         }
     }
 }
@@ -453,8 +474,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.
@@ -466,7 +503,6 @@
     // '>' as first letter of order creates an output parameter
     // '<' as first letter of order creates an input parameter
     // '^' as first letter of order takes transpose dimensions
-    // '#' as first letter of order sets rows=cols for mats
     // '%' as first letter of order creates texture of given F/I/U type (texture, itexture, etc)
     // '@' as first letter of order creates arrayed texture of given type
     // '$' / '&' as first letter of order creates 2DMS / 2DMSArray textures
@@ -486,8 +522,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 },
@@ -500,29 +536,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 },
@@ -535,11 +571,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 },
@@ -576,24 +612,22 @@
         { "mul",                              "M",     nullptr,   "S,M",            "FI,",           EShLangAll },
         { "mul",                              "V",     nullptr,   "V,S",            "FI,",           EShLangAll },
         { "mul",                              "S",     nullptr,   "V,V",            "FI,",           EShLangAll },
-        { "mul",                              "#V",    nullptr,   "V,M",            "FI,",           EShLangAll },
         { "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 },
@@ -611,48 +645,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 },
@@ -668,8 +702,8 @@
         { "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 },
 
diff --git a/hlsl/hlslScanContext.cpp b/hlsl/hlslScanContext.cpp
index da39321..edeee64 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>
 
@@ -117,10 +117,12 @@
     (*KeywordMap)["in"] =                      EHTokIn;
     (*KeywordMap)["out"] =                     EHTokOut;
     (*KeywordMap)["inout"] =                   EHTokInOut;
+    (*KeywordMap)["layout"] =                  EHTokLayout;
 
     (*KeywordMap)["Buffer"] =                  EHTokBuffer;
     (*KeywordMap)["vector"] =                  EHTokVector;
     (*KeywordMap)["matrix"] =                  EHTokMatrix;
+    (*KeywordMap)["string"] =                  EHTokString;
 
     (*KeywordMap)["void"] =                    EHTokVoid;
     (*KeywordMap)["bool"] =                    EHTokBool;
@@ -410,6 +412,11 @@
             return token;
         }
 
+        case PpAtomConstString: {
+            parserToken->string = NewPoolTString(ppToken.name);
+            return EHTokStringConstant;
+        }
+
         case EndOfInput:               return EHTokNone;
 
         default:
@@ -457,12 +464,15 @@
     case EHTokIn:
     case EHTokOut:
     case EHTokInOut:
+    case EHTokPrecise:
+    case EHTokLayout:
         return keyword;
 
     // template types
     case EHTokBuffer:
     case EHTokVector:
     case EHTokMatrix:
+    case EHTokString:
         return keyword;
 
     // scalar types
diff --git a/hlsl/hlslTokens.h b/hlsl/hlslTokens.h
index d72b2cd..9e23cc7 100755
--- a/hlsl/hlslTokens.h
+++ b/hlsl/hlslTokens.h
@@ -64,11 +64,13 @@
     EHTokIn,
     EHTokOut,
     EHTokInOut,
+    EHTokLayout,
 
     // template types
     EHTokBuffer,
     EHTokVector,
     EHTokMatrix,
+    EHTokString,
 
     // scalar types
     EHTokVoid,
@@ -222,6 +224,7 @@
     EHTokIntConstant,
     EHTokUintConstant,
     EHTokBoolConstant,
+    EHTokStringConstant,
 
     // control flow
     EHTokFor,