diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 8e49e93..88569f5 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -3219,7 +3219,7 @@
     //       adjusting this late means inconsistencies with earlier code, which for reflection is an issue
     // Until reflection is brought in sync with these adjustments, don't apply to $Global,
     // which is the most likely to rely on reflection, and least likely to rely implicit layouts
-    if (glslangIntermediate->usingHlslOFfsets() &&
+    if (glslangIntermediate->usingHlslOffsets() &&
         ! memberType.isArray() && memberType.isVector() && structType.getTypeName().compare("$Global") != 0) {
         int dummySize;
         int componentAlignment = glslangIntermediate->getBaseAlignmentScalar(memberType, dummySize);
@@ -7003,6 +7003,80 @@
     GlslangToSpv(intermediate, spirv, &logger, options);
 }
 
+#if ENABLE_OPT
+
+// Apply the SPIRV-Tools validator to generated SPIR-V.
+void SpirvToolsLegalize(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger* logger, const SpvOptions* options)
+{
+    spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+
+    spvtools::Optimizer optimizer(target_env);
+    optimizer.SetMessageConsumer(
+        [](spv_message_level_t level, const char *source, const spv_position_t &position, const char *message) {
+            auto &out = std::cerr;
+            switch (level)
+            {
+            case SPV_MSG_FATAL:
+            case SPV_MSG_INTERNAL_ERROR:
+            case SPV_MSG_ERROR:
+                out << "error: ";
+                break;
+            case SPV_MSG_WARNING:
+                out << "warning: ";
+                break;
+            case SPV_MSG_INFO:
+            case SPV_MSG_DEBUG:
+                out << "info: ";
+                break;
+            default:
+                break;
+            }
+            if (source)
+            {
+                out << source << ":";
+            }
+            out << position.line << ":" << position.column << ":" << position.index << ":";
+            if (message)
+            {
+                out << " " << message;
+            }
+            out << std::endl;
+        });
+
+    optimizer.RegisterPass(CreateMergeReturnPass());
+    optimizer.RegisterPass(CreateInlineExhaustivePass());
+    optimizer.RegisterPass(CreateEliminateDeadFunctionsPass());
+    optimizer.RegisterPass(CreateScalarReplacementPass());
+    optimizer.RegisterPass(CreateLocalAccessChainConvertPass());
+    optimizer.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass());
+    optimizer.RegisterPass(CreateLocalSingleStoreElimPass());
+    optimizer.RegisterPass(CreateSimplificationPass());
+    optimizer.RegisterPass(CreateAggressiveDCEPass());
+    optimizer.RegisterPass(CreateVectorDCEPass());
+    optimizer.RegisterPass(CreateDeadInsertElimPass());
+    optimizer.RegisterPass(CreateAggressiveDCEPass());
+    optimizer.RegisterPass(CreateDeadBranchElimPass());
+    optimizer.RegisterPass(CreateBlockMergePass());
+    optimizer.RegisterPass(CreateLocalMultiStoreElimPass());
+    optimizer.RegisterPass(CreateIfConversionPass());
+    optimizer.RegisterPass(CreateSimplificationPass());
+    optimizer.RegisterPass(CreateAggressiveDCEPass());
+    optimizer.RegisterPass(CreateVectorDCEPass());
+    optimizer.RegisterPass(CreateDeadInsertElimPass());
+    if (options->optimizeSize) {
+        optimizer.RegisterPass(CreateRedundancyEliminationPass());
+        // TODO(greg-lunarg): Add this when AMD driver issues are resolved
+        // optimizer.RegisterPass(CreateCommonUniformElimPass());
+    }
+    optimizer.RegisterPass(CreateAggressiveDCEPass());
+    optimizer.RegisterPass(CreateCFGCleanupPass());
+
+    optimizer.Run(spirv.data(), spirv.size(), &spirv);
+}
+
+#endif
+
 void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
                   spv::SpvBuildLogger* logger, SpvOptions* options)
 {
@@ -7025,74 +7099,9 @@
 #if ENABLE_OPT
     // If from HLSL, run spirv-opt to "legalize" the SPIR-V for Vulkan
     // eg. forward and remove memory writes of opaque types.
-    if ((intermediate.getSource() == EShSourceHlsl ||
-                options->optimizeSize) &&
+    if ((intermediate.getSource() == EShSourceHlsl || options->optimizeSize) &&
             !options->disableOptimizer) {
-        spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
-
-        spvtools::Optimizer optimizer(target_env);
-        optimizer.SetMessageConsumer(
-            [](spv_message_level_t level, const char *source, const spv_position_t &position, const char *message) {
-                auto &out = std::cerr;
-                switch (level)
-                {
-                case SPV_MSG_FATAL:
-                case SPV_MSG_INTERNAL_ERROR:
-                case SPV_MSG_ERROR:
-                    out << "error: ";
-                    break;
-                case SPV_MSG_WARNING:
-                    out << "warning: ";
-                    break;
-                case SPV_MSG_INFO:
-                case SPV_MSG_DEBUG:
-                    out << "info: ";
-                    break;
-                default:
-                    break;
-                }
-                if (source)
-                {
-                    out << source << ":";
-                }
-                out << position.line << ":" << position.column << ":" << position.index << ":";
-                if (message)
-                {
-                    out << " " << message;
-                }
-                out << std::endl;
-            });
-
-        optimizer.RegisterPass(CreateMergeReturnPass());
-        optimizer.RegisterPass(CreateInlineExhaustivePass());
-        optimizer.RegisterPass(CreateEliminateDeadFunctionsPass());
-        optimizer.RegisterPass(CreateScalarReplacementPass());
-        optimizer.RegisterPass(CreateLocalAccessChainConvertPass());
-        optimizer.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass());
-        optimizer.RegisterPass(CreateLocalSingleStoreElimPass());
-        optimizer.RegisterPass(CreateSimplificationPass());
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateVectorDCEPass());
-        optimizer.RegisterPass(CreateDeadInsertElimPass());
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateDeadBranchElimPass());
-        optimizer.RegisterPass(CreateBlockMergePass());
-        optimizer.RegisterPass(CreateLocalMultiStoreElimPass());
-        optimizer.RegisterPass(CreateIfConversionPass());
-        optimizer.RegisterPass(CreateSimplificationPass());
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateVectorDCEPass());
-        optimizer.RegisterPass(CreateDeadInsertElimPass());
-        if (options->optimizeSize) {
-            optimizer.RegisterPass(CreateRedundancyEliminationPass());
-            // TODO(greg-lunarg): Add this when AMD driver issues are resolved
-            // optimizer.RegisterPass(CreateCommonUniformElimPass());
-        }
-        optimizer.RegisterPass(CreateAggressiveDCEPass());
-        optimizer.RegisterPass(CreateCFGCleanupPass());
-
-        if (!optimizer.Run(spirv.data(), spirv.size(), &spirv))
-            return;
+        SpirvToolsLegalize(intermediate, spirv, logger, options);
     }
 #endif
 
