Update out-param semantics in SPIR-V.

Removed a special case from `writeFunctionCallArgument` which avoided
using a scratch variable for out params; now we always use the scratch
variable and copy it back to the original variable at the end.

Change-Id: I0e446a3fde6d19554943384210bd911f6f9c8cfa
Bug: skia:11052, skia:11919, skia:12858
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/501836
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/infra/bots/gen_tasks_logic/dm_flags.go b/infra/bots/gen_tasks_logic/dm_flags.go
index 62ccae9..ef21439 100644
--- a/infra/bots/gen_tasks_logic/dm_flags.go
+++ b/infra/bots/gen_tasks_logic/dm_flags.go
@@ -935,7 +935,7 @@
 		skip("_", "tests", "_", "SkSLIntrinsicIsInf_GPU") // skia:12377
 	}
 
-	if b.matchGpu("Adreno6") && b.extraConfig("Vulkan") { // disable broken tests on Adreno 6xx Vulkan
+	if b.matchGpu("Adreno[56]") && b.extraConfig("Vulkan") { // disable broken tests on Adreno 5/6xx Vulkan
 		skip("_", "tests", "_", "SkSLInoutParameters_GPU") // skia:12869
 	}
 
diff --git a/infra/bots/tasks.json b/infra/bots/tasks.json
index e3d65de..45f1119 100755
--- a/infra/bots/tasks.json
+++ b/infra/bots/tasks.json
@@ -36831,7 +36831,7 @@
         "skia/infra/bots/run_recipe.py",
         "${ISOLATED_OUTDIR}",
         "test",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Debug-All-Android_Vulkan\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"Adreno540\\\",\\\"extra_config\\\",\\\"Android_Vulkan\\\",\\\"model\\\",\\\"Pixel2XL\\\",\\\"os\\\",\\\"Android\\\",\\\"style\\\",\\\"default\\\",\\\"--nocpu\\\",\\\"--config\\\",\\\"vk\\\",\\\"vkmsaa4\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"image\\\",\\\"colorImage\\\",\\\"svg\\\",\\\"--skip\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"GrStyledShape\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayCast_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayComparison_GPU\\\",\\\"--match\\\",\\\"~WritePixelsNonTextureMSAA_Gpu\\\",\\\"~WritePixelsMSAA_Gpu\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Debug-All-Android_Vulkan\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Debug-All-Android_Vulkan\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"Adreno540\\\",\\\"extra_config\\\",\\\"Android_Vulkan\\\",\\\"model\\\",\\\"Pixel2XL\\\",\\\"os\\\",\\\"Android\\\",\\\"style\\\",\\\"default\\\",\\\"--nocpu\\\",\\\"--config\\\",\\\"vk\\\",\\\"vkmsaa4\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"image\\\",\\\"colorImage\\\",\\\"svg\\\",\\\"--skip\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"GrStyledShape\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayCast_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayComparison_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLInoutParameters_GPU\\\",\\\"--match\\\",\\\"~WritePixelsNonTextureMSAA_Gpu\\\",\\\"~WritePixelsMSAA_Gpu\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Debug-All-Android_Vulkan\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
         "skia"
       ],
       "dependencies": [
@@ -37029,7 +37029,7 @@
         "skia/infra/bots/run_recipe.py",
         "${ISOLATED_OUTDIR}",
         "test",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Release-All-Android_Vulkan\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Release\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"Adreno540\\\",\\\"extra_config\\\",\\\"Android_Vulkan\\\",\\\"model\\\",\\\"Pixel2XL\\\",\\\"os\\\",\\\"Android\\\",\\\"style\\\",\\\"default\\\",\\\"--nocpu\\\",\\\"--config\\\",\\\"vk\\\",\\\"vkmsaa4\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"image\\\",\\\"colorImage\\\",\\\"svg\\\",\\\"--skip\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"GrStyledShape\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayCast_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayComparison_GPU\\\",\\\"--match\\\",\\\"~WritePixelsNonTextureMSAA_Gpu\\\",\\\"~WritePixelsMSAA_Gpu\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Release-All-Android_Vulkan\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Release-All-Android_Vulkan\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Release\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"Adreno540\\\",\\\"extra_config\\\",\\\"Android_Vulkan\\\",\\\"model\\\",\\\"Pixel2XL\\\",\\\"os\\\",\\\"Android\\\",\\\"style\\\",\\\"default\\\",\\\"--nocpu\\\",\\\"--config\\\",\\\"vk\\\",\\\"vkmsaa4\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"image\\\",\\\"colorImage\\\",\\\"svg\\\",\\\"--skip\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"GrStyledShape\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayCast_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLArrayComparison_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLInoutParameters_GPU\\\",\\\"--match\\\",\\\"~WritePixelsNonTextureMSAA_Gpu\\\",\\\"~WritePixelsMSAA_Gpu\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Release-All-Android_Vulkan\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
         "skia"
       ],
       "dependencies": [
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
index 07e19b3..af0bfb0 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
@@ -830,15 +830,7 @@
             std::vector<TempVar> tempVars;
             argumentIds.reserve(arguments.size());
             for (size_t i = 0; i < arguments.size(); i++) {
-                if (is_out(function.parameters()[i]->modifiers())) {
-                    argumentIds.push_back(
-                            this->writeFunctionCallArgument(*arguments[i],
-                                                            function.parameters()[i]->modifiers(),
-                                                            &tempVars,
-                                                            out));
-                } else {
-                    argumentIds.push_back(this->writeExpression(*arguments[i], out));
-                }
+                argumentIds.push_back(this->writeFunctionCallArgument(c, i, &tempVars, out));
             }
             this->writeOpCode(SpvOpExtInst, 5 + (int32_t) argumentIds.size(), out);
             this->writeWord(this->getType(c.type()), out);
@@ -861,15 +853,7 @@
             std::vector<TempVar> tempVars;
             argumentIds.reserve(arguments.size());
             for (size_t i = 0; i < arguments.size(); i++) {
-                if (is_out(function.parameters()[i]->modifiers())) {
-                    argumentIds.push_back(
-                            this->writeFunctionCallArgument(*arguments[i],
-                                                            function.parameters()[i]->modifiers(),
-                                                            &tempVars,
-                                                            out));
-                } else {
-                    argumentIds.push_back(this->writeExpression(*arguments[i], out));
-                }
+                argumentIds.push_back(this->writeFunctionCallArgument(c, i, &tempVars, out));
             }
             if (!c.type().isVoid()) {
                 this->writeOpCode((SpvOp_) intrinsicId, 3 + (int32_t) arguments.size(), out);
@@ -1185,10 +1169,14 @@
     return result;
 }
 
-SpvId SPIRVCodeGenerator::writeFunctionCallArgument(const Expression& arg,
-                                                    const Modifiers& paramModifiers,
+SpvId SPIRVCodeGenerator::writeFunctionCallArgument(const FunctionCall& call,
+                                                    int argIndex,
                                                     std::vector<TempVar>* tempVars,
                                                     OutputStream& out) {
+    const FunctionDeclaration& funcDecl = call.function();
+    const Expression& arg = *call.arguments()[argIndex];
+    const Modifiers& paramModifiers = funcDecl.parameters()[argIndex]->modifiers();
+
     // ID of temporary variable that we will use to hold this argument, or 0 if it is being
     // passed directly
     SpvId tmpVar;
@@ -1197,20 +1185,21 @@
 
     if (is_out(paramModifiers)) {
         std::unique_ptr<LValue> lv = this->getLValue(arg, out);
-        SpvId ptr = lv->getPointer();
-        if (ptr != (SpvId) -1 && lv->isMemoryObjectPointer()) {
-            return ptr;
-        }
-
-        // lvalue cannot simply be read and written via a pointer (e.g. it's a swizzle). We need to
-        // to use a temp variable.
+        // We handle out params with a temp var that we copy back to the original variable at the
+        // end of the call. GLSL guarantees that the original variable will be unchanged until the
+        // end of the call, and also that out params are written back to their original variables in
+        // a specific order (left-to-right), so it's unsafe to pass a pointer to the original value.
         if (is_in(paramModifiers)) {
             tmpValueId = lv->load(out);
         }
         tmpVar = this->nextId(&arg.type());
         tempVars->push_back(TempVar{tmpVar, &arg.type(), std::move(lv)});
+    } else if (funcDecl.isIntrinsic()) {
+        // Unlike user function calls, non-out intrinsic arguments don't need pointer parameters.
+        return this->writeExpression(arg, out);
     } else {
-        // See getFunctionType for an explanation of why we're always using pointer parameters.
+        // We always use pointer parameters when calling user functions.
+        // See getFunctionType for further explanation.
         tmpValueId = this->writeExpression(arg, out);
         tmpVar = this->nextId(nullptr);
     }
@@ -1250,10 +1239,7 @@
     std::vector<SpvId> argumentIds;
     argumentIds.reserve(arguments.size());
     for (size_t i = 0; i < arguments.size(); i++) {
-        argumentIds.push_back(this->writeFunctionCallArgument(*arguments[i],
-                                                              function.parameters()[i]->modifiers(),
-                                                              &tempVars,
-                                                              out));
+        argumentIds.push_back(this->writeFunctionCallArgument(c, i, &tempVars, out));
     }
     SpvId result = this->nextId(nullptr);
     this->writeOpCode(SpvOpFunctionCall, 4 + (int32_t) arguments.size(), out);
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
index e31da64..3d92e15 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
@@ -230,8 +230,8 @@
 
     SpvId writeIntrinsicCall(const FunctionCall& c, OutputStream& out);
 
-    SpvId writeFunctionCallArgument(const Expression& arg,
-                                    const Modifiers& paramModifiers,
+    SpvId writeFunctionCallArgument(const FunctionCall& call,
+                                    int argIndex,
                                     std::vector<TempVar>* tempVars,
                                     OutputStream& out);
 
diff --git a/tests/SkSLTest.cpp b/tests/SkSLTest.cpp
index 9ce8d9c..7c335fb 100644
--- a/tests/SkSLTest.cpp
+++ b/tests/SkSLTest.cpp
@@ -246,10 +246,7 @@
 SKSL_TEST_ES3(SkSLWhileBodyMustBeInlinedIntoAScope,
          "inliner/WhileBodyMustBeInlinedIntoAScope.sksl")
 SKSL_TEST_ES3(SkSLWhileTestCannotBeInlined,       "inliner/WhileTestCannotBeInlined.sksl")
-
-// TODO(skia:11052): SPIR-V does not yet honor `out` param semantics correctly
-SKSL_TEST_CPU(SkSLInlinerHonorsGLSLOutParamSemantics,
-         "inliner/InlinerHonorsGLSLOutParamSemantics.sksl")
+SKSL_TEST(SkSLInlinerHonorsGLSLOutParamSemantics, "inliner/InlinerHonorsGLSLOutParamSemantics.sksl")
 
 SKSL_TEST(SkSLIntrinsicAbsFloat,               "intrinsics/AbsFloat.sksl")
 SKSL_TEST(SkSLIntrinsicCeil,                   "intrinsics/Ceil.sksl")
diff --git a/tests/sksl/intrinsics/Frexp.asm.frag b/tests/sksl/intrinsics/Frexp.asm.frag
index dd5e084..52756ab 100644
--- a/tests/sksl/intrinsics/Frexp.asm.frag
+++ b/tests/sksl/intrinsics/Frexp.asm.frag
@@ -28,10 +28,10 @@
 OpDecorate %32 RelaxedPrecision
 OpDecorate %33 RelaxedPrecision
 OpDecorate %35 RelaxedPrecision
-OpDecorate %124 RelaxedPrecision
-OpDecorate %130 RelaxedPrecision
+OpDecorate %126 RelaxedPrecision
 OpDecorate %132 RelaxedPrecision
-OpDecorate %133 RelaxedPrecision
+OpDecorate %134 RelaxedPrecision
+OpDecorate %135 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -89,7 +89,8 @@
 %48 = OpVariable %_ptr_Function_int Function
 %69 = OpVariable %_ptr_Function_v2int Function
 %92 = OpVariable %_ptr_Function_v3int Function
-%125 = OpVariable %_ptr_Function_v4float Function
+%113 = OpVariable %_ptr_Function_v4int Function
+%127 = OpVariable %_ptr_Function_v4float Function
 %28 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
 %32 = OpLoad %v4float %28
 %33 = OpVectorShuffle %v4float %32 %32 1 1 1 1
@@ -166,37 +167,39 @@
 %109 = OpAccessChain %_ptr_Function_bool %ok %int_2
 OpStore %109 %108
 %112 = OpLoad %v4float %value
-%111 = OpExtInst %v4float %1 Frexp %112 %exp
+%111 = OpExtInst %v4float %1 Frexp %112 %113
+%114 = OpLoad %v4int %113
+OpStore %exp %114
 OpStore %result %111
-%113 = OpLoad %v4float %result
-%114 = OpCompositeExtract %float %113 3
-%115 = OpFOrdEqual %bool %114 %float_0_75
-OpSelectionMerge %117 None
-OpBranchConditional %115 %116 %117
-%116 = OpLabel
-%118 = OpLoad %v4int %exp
-%119 = OpCompositeExtract %int %118 3
-%120 = OpIEqual %bool %119 %int_3
-OpBranch %117
-%117 = OpLabel
-%121 = OpPhi %bool %false %104 %120 %116
-%122 = OpAccessChain %_ptr_Function_bool %ok %int_3
-OpStore %122 %121
-%124 = OpLoad %v4bool %ok
-%123 = OpAll %bool %124
-OpSelectionMerge %128 None
-OpBranchConditional %123 %126 %127
-%126 = OpLabel
-%129 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
-%130 = OpLoad %v4float %129
-OpStore %125 %130
-OpBranch %128
-%127 = OpLabel
-%131 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
-%132 = OpLoad %v4float %131
-OpStore %125 %132
-OpBranch %128
+%115 = OpLoad %v4float %result
+%116 = OpCompositeExtract %float %115 3
+%117 = OpFOrdEqual %bool %116 %float_0_75
+OpSelectionMerge %119 None
+OpBranchConditional %117 %118 %119
+%118 = OpLabel
+%120 = OpLoad %v4int %exp
+%121 = OpCompositeExtract %int %120 3
+%122 = OpIEqual %bool %121 %int_3
+OpBranch %119
+%119 = OpLabel
+%123 = OpPhi %bool %false %104 %122 %118
+%124 = OpAccessChain %_ptr_Function_bool %ok %int_3
+OpStore %124 %123
+%126 = OpLoad %v4bool %ok
+%125 = OpAll %bool %126
+OpSelectionMerge %130 None
+OpBranchConditional %125 %128 %129
 %128 = OpLabel
-%133 = OpLoad %v4float %125
-OpReturnValue %133
+%131 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
+%132 = OpLoad %v4float %131
+OpStore %127 %132
+OpBranch %130
+%129 = OpLabel
+%133 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
+%134 = OpLoad %v4float %133
+OpStore %127 %134
+OpBranch %130
+%130 = OpLabel
+%135 = OpLoad %v4float %127
+OpReturnValue %135
 OpFunctionEnd
diff --git a/tests/sksl/intrinsics/Modf.asm.frag b/tests/sksl/intrinsics/Modf.asm.frag
index 2c50bb5..1d57aa5 100644
--- a/tests/sksl/intrinsics/Modf.asm.frag
+++ b/tests/sksl/intrinsics/Modf.asm.frag
@@ -27,10 +27,10 @@
 OpDecorate %_UniformBuffer Block
 OpDecorate %10 Binding 0
 OpDecorate %10 DescriptorSet 0
-OpDecorate %137 RelaxedPrecision
-OpDecorate %144 RelaxedPrecision
+OpDecorate %139 RelaxedPrecision
 OpDecorate %146 RelaxedPrecision
-OpDecorate %147 RelaxedPrecision
+OpDecorate %148 RelaxedPrecision
+OpDecorate %149 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -100,7 +100,8 @@
 %55 = OpVariable %_ptr_Function_float Function
 %72 = OpVariable %_ptr_Function_v2float Function
 %98 = OpVariable %_ptr_Function_v3float Function
-%138 = OpVariable %_ptr_Function_v4float Function
+%123 = OpVariable %_ptr_Function_v4float Function
+%140 = OpVariable %_ptr_Function_v4float Function
 OpStore %value %32
 OpStore %expectedWhole %36
 OpStore %expectedFraction %40
@@ -180,39 +181,41 @@
 %119 = OpAccessChain %_ptr_Function_bool %ok %int_2
 OpStore %119 %118
 %122 = OpLoad %v4float %value
-%121 = OpExtInst %v4float %1 Modf %122 %whole
+%121 = OpExtInst %v4float %1 Modf %122 %123
+%124 = OpLoad %v4float %123
+OpStore %whole %124
 OpStore %fraction %121
-%123 = OpLoad %v4float %whole
-%124 = OpLoad %v4float %expectedWhole
-%125 = OpFOrdEqual %v4bool %123 %124
-%126 = OpAll %bool %125
-OpSelectionMerge %128 None
-OpBranchConditional %126 %127 %128
-%127 = OpLabel
-%129 = OpLoad %v4float %fraction
-%130 = OpLoad %v4float %expectedFraction
-%131 = OpFOrdEqual %v4bool %129 %130
-%132 = OpAll %bool %131
-OpBranch %128
-%128 = OpLabel
-%133 = OpPhi %bool %false %112 %132 %127
-%134 = OpAccessChain %_ptr_Function_bool %ok %int_3
-OpStore %134 %133
-%137 = OpLoad %v4bool %ok
-%136 = OpAll %bool %137
-OpSelectionMerge %141 None
-OpBranchConditional %136 %139 %140
-%139 = OpLabel
-%142 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
-%144 = OpLoad %v4float %142
-OpStore %138 %144
-OpBranch %141
-%140 = OpLabel
-%145 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
-%146 = OpLoad %v4float %145
-OpStore %138 %146
-OpBranch %141
+%125 = OpLoad %v4float %whole
+%126 = OpLoad %v4float %expectedWhole
+%127 = OpFOrdEqual %v4bool %125 %126
+%128 = OpAll %bool %127
+OpSelectionMerge %130 None
+OpBranchConditional %128 %129 %130
+%129 = OpLabel
+%131 = OpLoad %v4float %fraction
+%132 = OpLoad %v4float %expectedFraction
+%133 = OpFOrdEqual %v4bool %131 %132
+%134 = OpAll %bool %133
+OpBranch %130
+%130 = OpLabel
+%135 = OpPhi %bool %false %112 %134 %129
+%136 = OpAccessChain %_ptr_Function_bool %ok %int_3
+OpStore %136 %135
+%139 = OpLoad %v4bool %ok
+%138 = OpAll %bool %139
+OpSelectionMerge %143 None
+OpBranchConditional %138 %141 %142
 %141 = OpLabel
-%147 = OpLoad %v4float %138
-OpReturnValue %147
+%144 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
+%146 = OpLoad %v4float %144
+OpStore %140 %146
+OpBranch %143
+%142 = OpLabel
+%147 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
+%148 = OpLoad %v4float %147
+OpStore %140 %148
+OpBranch %143
+%143 = OpLabel
+%149 = OpLoad %v4float %140
+OpReturnValue %149
 OpFunctionEnd
diff --git a/tests/sksl/shared/ArrayTypes.asm.frag b/tests/sksl/shared/ArrayTypes.asm.frag
index e0b3cf6..f49cb87 100644
--- a/tests/sksl/shared/ArrayTypes.asm.frag
+++ b/tests/sksl/shared/ArrayTypes.asm.frag
@@ -20,7 +20,7 @@
 OpMemberDecorate %S 0 Offset 0
 OpDecorate %_arr_S_int_2 ArrayStride 16
 OpDecorate %_arr_v2float_int_2 ArrayStride 16
-OpDecorate %97 RelaxedPrecision
+OpDecorate %99 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -75,6 +75,7 @@
 %x = OpVariable %_ptr_Function__arr_v2float_int_2 Function
 %y = OpVariable %_ptr_Function__arr_v2float_int_2 Function
 %z = OpVariable %_ptr_Function__arr_S_int_2 Function
+%52 = OpVariable %_ptr_Function__arr_S_int_2 Function
 %43 = OpAccessChain %_ptr_Function_v2float %x %int_0
 OpStore %43 %17
 %45 = OpAccessChain %_ptr_Function_v2float %x %int_1
@@ -83,51 +84,53 @@
 OpStore %47 %30
 %50 = OpAccessChain %_ptr_Function_v2float %y %int_1
 OpStore %50 %49
-%52 = OpFunctionCall %void %initialize_vS %z
-%53 = OpAccessChain %_ptr_Function_v2float %x %int_0
-%54 = OpLoad %v2float %53
-%55 = OpCompositeExtract %float %54 0
-%56 = OpAccessChain %_ptr_Function_v2float %x %int_0
-%57 = OpLoad %v2float %56
-%58 = OpCompositeExtract %float %57 1
-%59 = OpFMul %float %55 %58
-%60 = OpAccessChain %_ptr_Function_v2float %z %int_0 %int_0
-%61 = OpLoad %v2float %60
-%62 = OpCompositeExtract %float %61 0
-%63 = OpFAdd %float %59 %62
-%64 = OpAccessChain %_ptr_Function_v2float %x %int_1
-%65 = OpLoad %v2float %64
-%66 = OpCompositeExtract %float %65 0
-%67 = OpAccessChain %_ptr_Function_v2float %x %int_1
-%68 = OpLoad %v2float %67
-%69 = OpCompositeExtract %float %68 1
-%70 = OpAccessChain %_ptr_Function_v2float %z %int_0 %int_0
-%71 = OpLoad %v2float %70
-%72 = OpCompositeExtract %float %71 1
-%73 = OpFMul %float %69 %72
-%74 = OpFSub %float %66 %73
-%75 = OpAccessChain %_ptr_Function_v2float %y %int_0
-%76 = OpLoad %v2float %75
-%77 = OpCompositeExtract %float %76 0
-%78 = OpAccessChain %_ptr_Function_v2float %y %int_0
-%79 = OpLoad %v2float %78
-%80 = OpCompositeExtract %float %79 1
-%81 = OpFDiv %float %77 %80
-%82 = OpAccessChain %_ptr_Function_v2float %z %int_1 %int_0
-%83 = OpLoad %v2float %82
-%84 = OpCompositeExtract %float %83 0
-%85 = OpFDiv %float %81 %84
-%86 = OpAccessChain %_ptr_Function_v2float %y %int_1
-%87 = OpLoad %v2float %86
-%88 = OpCompositeExtract %float %87 0
-%89 = OpAccessChain %_ptr_Function_v2float %y %int_1
-%90 = OpLoad %v2float %89
-%91 = OpCompositeExtract %float %90 1
-%92 = OpAccessChain %_ptr_Function_v2float %z %int_1 %int_0
-%93 = OpLoad %v2float %92
-%94 = OpCompositeExtract %float %93 1
-%95 = OpFMul %float %91 %94
-%96 = OpFAdd %float %88 %95
-%97 = OpCompositeConstruct %v4float %63 %74 %85 %96
-OpReturnValue %97
+%53 = OpFunctionCall %void %initialize_vS %52
+%54 = OpLoad %_arr_S_int_2 %52
+OpStore %z %54
+%55 = OpAccessChain %_ptr_Function_v2float %x %int_0
+%56 = OpLoad %v2float %55
+%57 = OpCompositeExtract %float %56 0
+%58 = OpAccessChain %_ptr_Function_v2float %x %int_0
+%59 = OpLoad %v2float %58
+%60 = OpCompositeExtract %float %59 1
+%61 = OpFMul %float %57 %60
+%62 = OpAccessChain %_ptr_Function_v2float %z %int_0 %int_0
+%63 = OpLoad %v2float %62
+%64 = OpCompositeExtract %float %63 0
+%65 = OpFAdd %float %61 %64
+%66 = OpAccessChain %_ptr_Function_v2float %x %int_1
+%67 = OpLoad %v2float %66
+%68 = OpCompositeExtract %float %67 0
+%69 = OpAccessChain %_ptr_Function_v2float %x %int_1
+%70 = OpLoad %v2float %69
+%71 = OpCompositeExtract %float %70 1
+%72 = OpAccessChain %_ptr_Function_v2float %z %int_0 %int_0
+%73 = OpLoad %v2float %72
+%74 = OpCompositeExtract %float %73 1
+%75 = OpFMul %float %71 %74
+%76 = OpFSub %float %68 %75
+%77 = OpAccessChain %_ptr_Function_v2float %y %int_0
+%78 = OpLoad %v2float %77
+%79 = OpCompositeExtract %float %78 0
+%80 = OpAccessChain %_ptr_Function_v2float %y %int_0
+%81 = OpLoad %v2float %80
+%82 = OpCompositeExtract %float %81 1
+%83 = OpFDiv %float %79 %82
+%84 = OpAccessChain %_ptr_Function_v2float %z %int_1 %int_0
+%85 = OpLoad %v2float %84
+%86 = OpCompositeExtract %float %85 0
+%87 = OpFDiv %float %83 %86
+%88 = OpAccessChain %_ptr_Function_v2float %y %int_1
+%89 = OpLoad %v2float %88
+%90 = OpCompositeExtract %float %89 0
+%91 = OpAccessChain %_ptr_Function_v2float %y %int_1
+%92 = OpLoad %v2float %91
+%93 = OpCompositeExtract %float %92 1
+%94 = OpAccessChain %_ptr_Function_v2float %z %int_1 %int_0
+%95 = OpLoad %v2float %94
+%96 = OpCompositeExtract %float %95 1
+%97 = OpFMul %float %93 %96
+%98 = OpFAdd %float %90 %97
+%99 = OpCompositeConstruct %v4float %65 %76 %87 %98
+OpReturnValue %99
 OpFunctionEnd
diff --git a/tests/sksl/shared/CommaSideEffects.asm.frag b/tests/sksl/shared/CommaSideEffects.asm.frag
index d40cf41..42da5a8 100644
--- a/tests/sksl/shared/CommaSideEffects.asm.frag
+++ b/tests/sksl/shared/CommaSideEffects.asm.frag
@@ -39,8 +39,8 @@
 OpDecorate %d RelaxedPrecision
 OpDecorate %42 RelaxedPrecision
 OpDecorate %45 RelaxedPrecision
-OpDecorate %49 RelaxedPrecision
-OpDecorate %50 RelaxedPrecision
+OpDecorate %46 RelaxedPrecision
+OpDecorate %48 RelaxedPrecision
 OpDecorate %51 RelaxedPrecision
 OpDecorate %52 RelaxedPrecision
 OpDecorate %53 RelaxedPrecision
@@ -52,17 +52,19 @@
 OpDecorate %59 RelaxedPrecision
 OpDecorate %60 RelaxedPrecision
 OpDecorate %61 RelaxedPrecision
+OpDecorate %62 RelaxedPrecision
 OpDecorate %63 RelaxedPrecision
 OpDecorate %65 RelaxedPrecision
-OpDecorate %71 RelaxedPrecision
+OpDecorate %67 RelaxedPrecision
 OpDecorate %73 RelaxedPrecision
-OpDecorate %79 RelaxedPrecision
+OpDecorate %75 RelaxedPrecision
 OpDecorate %81 RelaxedPrecision
-OpDecorate %87 RelaxedPrecision
+OpDecorate %83 RelaxedPrecision
 OpDecorate %89 RelaxedPrecision
-OpDecorate %98 RelaxedPrecision
+OpDecorate %91 RelaxedPrecision
 OpDecorate %100 RelaxedPrecision
-OpDecorate %101 RelaxedPrecision
+OpDecorate %102 RelaxedPrecision
+OpDecorate %103 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -113,84 +115,87 @@
 %b = OpVariable %_ptr_Function_v4float Function
 %c = OpVariable %_ptr_Function_v4float Function
 %d = OpVariable %_ptr_Function_v4float Function
-%93 = OpVariable %_ptr_Function_v4float Function
+%46 = OpVariable %_ptr_Function_v4float Function
+%95 = OpVariable %_ptr_Function_v4float Function
 %40 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
 %42 = OpLoad %v4float %40
 OpStore %b %42
 %43 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
 %45 = OpLoad %v4float %43
 OpStore %c %45
-%46 = OpFunctionCall %void %setToColorBlack_vh4 %d
-%47 = OpAccessChain %_ptr_Uniform_v4float %11 %int_2
-%49 = OpLoad %v4float %47
-OpStore %a %49
-%50 = OpLoad %v4float %a
-%51 = OpLoad %v4float %a
-%52 = OpFMul %v4float %50 %51
-OpStore %a %52
-%53 = OpLoad %v4float %b
-%54 = OpLoad %v4float %b
-%55 = OpFMul %v4float %53 %54
-OpStore %b %55
-%56 = OpLoad %v4float %c
-%57 = OpLoad %v4float %c
-%58 = OpFMul %v4float %56 %57
-OpStore %c %58
-%59 = OpLoad %v4float %d
-%60 = OpLoad %v4float %d
-%61 = OpFMul %v4float %59 %60
-OpStore %d %61
-%63 = OpLoad %v4float %a
-%64 = OpAccessChain %_ptr_Uniform_v4float %11 %int_2
-%65 = OpLoad %v4float %64
-%66 = OpFOrdEqual %v4bool %63 %65
-%68 = OpAll %bool %66
-OpSelectionMerge %70 None
-OpBranchConditional %68 %69 %70
-%69 = OpLabel
-%71 = OpLoad %v4float %b
-%72 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
-%73 = OpLoad %v4float %72
-%74 = OpFOrdEqual %v4bool %71 %73
-%75 = OpAll %bool %74
-OpBranch %70
-%70 = OpLabel
-%76 = OpPhi %bool %false %35 %75 %69
-OpSelectionMerge %78 None
-OpBranchConditional %76 %77 %78
-%77 = OpLabel
-%79 = OpLoad %v4float %c
-%80 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
-%81 = OpLoad %v4float %80
-%82 = OpFOrdEqual %v4bool %79 %81
-%83 = OpAll %bool %82
-OpBranch %78
-%78 = OpLabel
-%84 = OpPhi %bool %false %70 %83 %77
-OpSelectionMerge %86 None
-OpBranchConditional %84 %85 %86
-%85 = OpLabel
-%87 = OpLoad %v4float %d
-%88 = OpAccessChain %_ptr_Uniform_v4float %11 %int_3
-%89 = OpLoad %v4float %88
-%90 = OpFOrdEqual %v4bool %87 %89
-%91 = OpAll %bool %90
-OpBranch %86
-%86 = OpLabel
-%92 = OpPhi %bool %false %78 %91 %85
-OpSelectionMerge %96 None
-OpBranchConditional %92 %94 %95
-%94 = OpLabel
-%97 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
-%98 = OpLoad %v4float %97
-OpStore %93 %98
-OpBranch %96
-%95 = OpLabel
-%99 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
-%100 = OpLoad %v4float %99
-OpStore %93 %100
-OpBranch %96
+%47 = OpFunctionCall %void %setToColorBlack_vh4 %46
+%48 = OpLoad %v4float %46
+OpStore %d %48
+%49 = OpAccessChain %_ptr_Uniform_v4float %11 %int_2
+%51 = OpLoad %v4float %49
+OpStore %a %51
+%52 = OpLoad %v4float %a
+%53 = OpLoad %v4float %a
+%54 = OpFMul %v4float %52 %53
+OpStore %a %54
+%55 = OpLoad %v4float %b
+%56 = OpLoad %v4float %b
+%57 = OpFMul %v4float %55 %56
+OpStore %b %57
+%58 = OpLoad %v4float %c
+%59 = OpLoad %v4float %c
+%60 = OpFMul %v4float %58 %59
+OpStore %c %60
+%61 = OpLoad %v4float %d
+%62 = OpLoad %v4float %d
+%63 = OpFMul %v4float %61 %62
+OpStore %d %63
+%65 = OpLoad %v4float %a
+%66 = OpAccessChain %_ptr_Uniform_v4float %11 %int_2
+%67 = OpLoad %v4float %66
+%68 = OpFOrdEqual %v4bool %65 %67
+%70 = OpAll %bool %68
+OpSelectionMerge %72 None
+OpBranchConditional %70 %71 %72
+%71 = OpLabel
+%73 = OpLoad %v4float %b
+%74 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
+%75 = OpLoad %v4float %74
+%76 = OpFOrdEqual %v4bool %73 %75
+%77 = OpAll %bool %76
+OpBranch %72
+%72 = OpLabel
+%78 = OpPhi %bool %false %35 %77 %71
+OpSelectionMerge %80 None
+OpBranchConditional %78 %79 %80
+%79 = OpLabel
+%81 = OpLoad %v4float %c
+%82 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
+%83 = OpLoad %v4float %82
+%84 = OpFOrdEqual %v4bool %81 %83
+%85 = OpAll %bool %84
+OpBranch %80
+%80 = OpLabel
+%86 = OpPhi %bool %false %72 %85 %79
+OpSelectionMerge %88 None
+OpBranchConditional %86 %87 %88
+%87 = OpLabel
+%89 = OpLoad %v4float %d
+%90 = OpAccessChain %_ptr_Uniform_v4float %11 %int_3
+%91 = OpLoad %v4float %90
+%92 = OpFOrdEqual %v4bool %89 %91
+%93 = OpAll %bool %92
+OpBranch %88
+%88 = OpLabel
+%94 = OpPhi %bool %false %80 %93 %87
+OpSelectionMerge %98 None
+OpBranchConditional %94 %96 %97
 %96 = OpLabel
-%101 = OpLoad %v4float %93
-OpReturnValue %101
+%99 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
+%100 = OpLoad %v4float %99
+OpStore %95 %100
+OpBranch %98
+%97 = OpLabel
+%101 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
+%102 = OpLoad %v4float %101
+OpStore %95 %102
+OpBranch %98
+%98 = OpLabel
+%103 = OpLoad %v4float %95
+OpReturnValue %103
 OpFunctionEnd
diff --git a/tests/sksl/shared/Functions.asm.frag b/tests/sksl/shared/Functions.asm.frag
index 2d4a24b..2735ce2 100644
--- a/tests/sksl/shared/Functions.asm.frag
+++ b/tests/sksl/shared/Functions.asm.frag
@@ -26,9 +26,9 @@
 OpDecorate %12 Binding 0
 OpDecorate %12 DescriptorSet 0
 OpDecorate %_arr_float_int_2 ArrayStride 16
-OpDecorate %73 RelaxedPrecision
-OpDecorate %75 RelaxedPrecision
 OpDecorate %76 RelaxedPrecision
+OpDecorate %78 RelaxedPrecision
+OpDecorate %79 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -104,24 +104,29 @@
 %58 = OpFunctionParameter %_ptr_Function_v2float
 %59 = OpLabel
 %x = OpVariable %_ptr_Function_float Function
-%66 = OpVariable %_ptr_Function_v4float Function
+%63 = OpVariable %_ptr_Function_float Function
+%69 = OpVariable %_ptr_Function_v4float Function
 OpStore %x %float_10
-%62 = OpFunctionCall %void %bar_vf %x
-%63 = OpLoad %float %x
-%65 = OpFOrdEqual %bool %63 %float_200
-OpSelectionMerge %70 None
-OpBranchConditional %65 %68 %69
-%68 = OpLabel
-%71 = OpAccessChain %_ptr_Uniform_v4float %12 %int_0
-%73 = OpLoad %v4float %71
-OpStore %66 %73
-OpBranch %70
-%69 = OpLabel
-%74 = OpAccessChain %_ptr_Uniform_v4float %12 %int_1
-%75 = OpLoad %v4float %74
-OpStore %66 %75
-OpBranch %70
-%70 = OpLabel
-%76 = OpLoad %v4float %66
-OpReturnValue %76
+%62 = OpLoad %float %x
+OpStore %63 %62
+%64 = OpFunctionCall %void %bar_vf %63
+%65 = OpLoad %float %63
+OpStore %x %65
+%66 = OpLoad %float %x
+%68 = OpFOrdEqual %bool %66 %float_200
+OpSelectionMerge %73 None
+OpBranchConditional %68 %71 %72
+%71 = OpLabel
+%74 = OpAccessChain %_ptr_Uniform_v4float %12 %int_0
+%76 = OpLoad %v4float %74
+OpStore %69 %76
+OpBranch %73
+%72 = OpLabel
+%77 = OpAccessChain %_ptr_Uniform_v4float %12 %int_1
+%78 = OpLoad %v4float %77
+OpStore %69 %78
+OpBranch %73
+%73 = OpLabel
+%79 = OpLoad %v4float %69
+OpReturnValue %79
 OpFunctionEnd
diff --git a/tests/sksl/shared/InoutParameters.asm.frag b/tests/sksl/shared/InoutParameters.asm.frag
index ceed0d5..c5f2a33 100644
--- a/tests/sksl/shared/InoutParameters.asm.frag
+++ b/tests/sksl/shared/InoutParameters.asm.frag
@@ -24,11 +24,26 @@
 OpDecorate %14 Binding 0
 OpDecorate %14 DescriptorSet 0
 OpDecorate %35 RelaxedPrecision
-OpDecorate %41 RelaxedPrecision
-OpDecorate %42 RelaxedPrecision
+OpDecorate %38 RelaxedPrecision
+OpDecorate %40 RelaxedPrecision
 OpDecorate %43 RelaxedPrecision
+OpDecorate %44 RelaxedPrecision
+OpDecorate %45 RelaxedPrecision
+OpDecorate %48 RelaxedPrecision
+OpDecorate %49 RelaxedPrecision
+OpDecorate %51 RelaxedPrecision
 OpDecorate %c RelaxedPrecision
 OpDecorate %56 RelaxedPrecision
+OpDecorate %58 RelaxedPrecision
+OpDecorate %59 RelaxedPrecision
+OpDecorate %61 RelaxedPrecision
+OpDecorate %62 RelaxedPrecision
+OpDecorate %63 RelaxedPrecision
+OpDecorate %65 RelaxedPrecision
+OpDecorate %66 RelaxedPrecision
+OpDecorate %67 RelaxedPrecision
+OpDecorate %69 RelaxedPrecision
+OpDecorate %71 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -50,7 +65,7 @@
 %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
 %int = OpTypeInt 32 1
 %int_0 = OpConstant %int 0
-%47 = OpTypeFunction %v4float %_ptr_Function_v2float
+%52 = OpTypeFunction %v4float %_ptr_Function_v2float
 %false = OpConstantFalse %bool
 %_entrypoint_v = OpFunction %void None %19
 %20 = OpLabel
@@ -71,32 +86,56 @@
 %outParameterWriteIndirect_vh4 = OpFunction %void None %27
 %36 = OpFunctionParameter %_ptr_Function_v4float
 %37 = OpLabel
-%38 = OpFunctionCall %void %outParameterWrite_vh4 %36
+%38 = OpVariable %_ptr_Function_v4float Function
+%39 = OpFunctionCall %void %outParameterWrite_vh4 %38
+%40 = OpLoad %v4float %38
+OpStore %36 %40
 OpReturn
 OpFunctionEnd
 %inoutParameterWrite_vh4 = OpFunction %void None %27
-%39 = OpFunctionParameter %_ptr_Function_v4float
-%40 = OpLabel
-%41 = OpLoad %v4float %39
-%42 = OpLoad %v4float %39
-%43 = OpFMul %v4float %41 %42
-OpStore %39 %43
+%41 = OpFunctionParameter %_ptr_Function_v4float
+%42 = OpLabel
+%43 = OpLoad %v4float %41
+%44 = OpLoad %v4float %41
+%45 = OpFMul %v4float %43 %44
+OpStore %41 %45
 OpReturn
 OpFunctionEnd
 %inoutParameterWriteIndirect_vh4 = OpFunction %void None %27
-%44 = OpFunctionParameter %_ptr_Function_v4float
-%45 = OpLabel
-%46 = OpFunctionCall %void %inoutParameterWrite_vh4 %44
+%46 = OpFunctionParameter %_ptr_Function_v4float
+%47 = OpLabel
+%49 = OpVariable %_ptr_Function_v4float Function
+%48 = OpLoad %v4float %46
+OpStore %49 %48
+%50 = OpFunctionCall %void %inoutParameterWrite_vh4 %49
+%51 = OpLoad %v4float %49
+OpStore %46 %51
 OpReturn
 OpFunctionEnd
-%main = OpFunction %v4float None %47
-%48 = OpFunctionParameter %_ptr_Function_v2float
-%49 = OpLabel
+%main = OpFunction %v4float None %52
+%53 = OpFunctionParameter %_ptr_Function_v2float
+%54 = OpLabel
 %c = OpVariable %_ptr_Function_v4float Function
-%51 = OpFunctionCall %void %outParameterWrite_vh4 %c
-%52 = OpFunctionCall %void %outParameterWriteIndirect_vh4 %c
-%53 = OpFunctionCall %void %inoutParameterWrite_vh4 %c
-%54 = OpFunctionCall %void %inoutParameterWriteIndirect_vh4 %c
-%56 = OpLoad %v4float %c
-OpReturnValue %56
+%56 = OpVariable %_ptr_Function_v4float Function
+%59 = OpVariable %_ptr_Function_v4float Function
+%63 = OpVariable %_ptr_Function_v4float Function
+%67 = OpVariable %_ptr_Function_v4float Function
+%57 = OpFunctionCall %void %outParameterWrite_vh4 %56
+%58 = OpLoad %v4float %56
+OpStore %c %58
+%60 = OpFunctionCall %void %outParameterWriteIndirect_vh4 %59
+%61 = OpLoad %v4float %59
+OpStore %c %61
+%62 = OpLoad %v4float %c
+OpStore %63 %62
+%64 = OpFunctionCall %void %inoutParameterWrite_vh4 %63
+%65 = OpLoad %v4float %63
+OpStore %c %65
+%66 = OpLoad %v4float %c
+OpStore %67 %66
+%68 = OpFunctionCall %void %inoutParameterWriteIndirect_vh4 %67
+%69 = OpLoad %v4float %67
+OpStore %c %69
+%71 = OpLoad %v4float %c
+OpReturnValue %71
 OpFunctionEnd
diff --git a/tests/sksl/shared/OutParams.asm.frag b/tests/sksl/shared/OutParams.asm.frag
index 5621226..8bbc64e 100644
--- a/tests/sksl/shared/OutParams.asm.frag
+++ b/tests/sksl/shared/OutParams.asm.frag
@@ -129,59 +129,73 @@
 OpDecorate %237 RelaxedPrecision
 OpDecorate %238 RelaxedPrecision
 OpDecorate %h RelaxedPrecision
+OpDecorate %245 RelaxedPrecision
+OpDecorate %247 RelaxedPrecision
 OpDecorate %h2 RelaxedPrecision
+OpDecorate %249 RelaxedPrecision
+OpDecorate %251 RelaxedPrecision
 OpDecorate %h3 RelaxedPrecision
+OpDecorate %253 RelaxedPrecision
+OpDecorate %255 RelaxedPrecision
 OpDecorate %h4 RelaxedPrecision
-OpDecorate %254 RelaxedPrecision
-OpDecorate %256 RelaxedPrecision
 OpDecorate %257 RelaxedPrecision
 OpDecorate %259 RelaxedPrecision
-OpDecorate %260 RelaxedPrecision
-OpDecorate %261 RelaxedPrecision
 OpDecorate %262 RelaxedPrecision
 OpDecorate %264 RelaxedPrecision
 OpDecorate %265 RelaxedPrecision
-OpDecorate %266 RelaxedPrecision
-OpDecorate %h2x2 RelaxedPrecision
-OpDecorate %h3x3 RelaxedPrecision
-OpDecorate %h4x4 RelaxedPrecision
+OpDecorate %267 RelaxedPrecision
+OpDecorate %268 RelaxedPrecision
+OpDecorate %269 RelaxedPrecision
+OpDecorate %270 RelaxedPrecision
+OpDecorate %272 RelaxedPrecision
+OpDecorate %273 RelaxedPrecision
 OpDecorate %274 RelaxedPrecision
+OpDecorate %h2x2 RelaxedPrecision
 OpDecorate %276 RelaxedPrecision
+OpDecorate %278 RelaxedPrecision
+OpDecorate %h3x3 RelaxedPrecision
 OpDecorate %280 RelaxedPrecision
 OpDecorate %282 RelaxedPrecision
+OpDecorate %h4x4 RelaxedPrecision
+OpDecorate %284 RelaxedPrecision
 OpDecorate %286 RelaxedPrecision
 OpDecorate %288 RelaxedPrecision
-OpDecorate %354 RelaxedPrecision
-OpDecorate %358 RelaxedPrecision
-OpDecorate %359 RelaxedPrecision
-OpDecorate %360 RelaxedPrecision
-OpDecorate %361 RelaxedPrecision
-OpDecorate %362 RelaxedPrecision
-OpDecorate %363 RelaxedPrecision
-OpDecorate %364 RelaxedPrecision
-OpDecorate %365 RelaxedPrecision
-OpDecorate %366 RelaxedPrecision
-OpDecorate %367 RelaxedPrecision
-OpDecorate %369 RelaxedPrecision
-OpDecorate %370 RelaxedPrecision
-OpDecorate %371 RelaxedPrecision
-OpDecorate %373 RelaxedPrecision
-OpDecorate %374 RelaxedPrecision
-OpDecorate %375 RelaxedPrecision
-OpDecorate %377 RelaxedPrecision
-OpDecorate %378 RelaxedPrecision
-OpDecorate %379 RelaxedPrecision
-OpDecorate %382 RelaxedPrecision
+OpDecorate %290 RelaxedPrecision
+OpDecorate %294 RelaxedPrecision
+OpDecorate %296 RelaxedPrecision
+OpDecorate %300 RelaxedPrecision
+OpDecorate %302 RelaxedPrecision
+OpDecorate %398 RelaxedPrecision
+OpDecorate %402 RelaxedPrecision
+OpDecorate %403 RelaxedPrecision
+OpDecorate %404 RelaxedPrecision
+OpDecorate %405 RelaxedPrecision
+OpDecorate %406 RelaxedPrecision
+OpDecorate %407 RelaxedPrecision
+OpDecorate %408 RelaxedPrecision
 OpDecorate %409 RelaxedPrecision
-OpDecorate %424 RelaxedPrecision
-OpDecorate %427 RelaxedPrecision
-OpDecorate %430 RelaxedPrecision
-OpDecorate %435 RelaxedPrecision
-OpDecorate %440 RelaxedPrecision
-OpDecorate %444 RelaxedPrecision
-OpDecorate %450 RelaxedPrecision
-OpDecorate %452 RelaxedPrecision
+OpDecorate %410 RelaxedPrecision
+OpDecorate %411 RelaxedPrecision
+OpDecorate %413 RelaxedPrecision
+OpDecorate %414 RelaxedPrecision
+OpDecorate %415 RelaxedPrecision
+OpDecorate %417 RelaxedPrecision
+OpDecorate %418 RelaxedPrecision
+OpDecorate %419 RelaxedPrecision
+OpDecorate %421 RelaxedPrecision
+OpDecorate %422 RelaxedPrecision
+OpDecorate %423 RelaxedPrecision
+OpDecorate %426 RelaxedPrecision
 OpDecorate %453 RelaxedPrecision
+OpDecorate %468 RelaxedPrecision
+OpDecorate %471 RelaxedPrecision
+OpDecorate %474 RelaxedPrecision
+OpDecorate %479 RelaxedPrecision
+OpDecorate %484 RelaxedPrecision
+OpDecorate %488 RelaxedPrecision
+OpDecorate %494 RelaxedPrecision
+OpDecorate %496 RelaxedPrecision
+OpDecorate %497 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -501,253 +515,319 @@
 %242 = OpFunctionParameter %_ptr_Function_v2float
 %243 = OpLabel
 %h = OpVariable %_ptr_Function_float Function
+%245 = OpVariable %_ptr_Function_float Function
 %h2 = OpVariable %_ptr_Function_v2float Function
+%249 = OpVariable %_ptr_Function_v2float Function
 %h3 = OpVariable %_ptr_Function_v3float Function
+%253 = OpVariable %_ptr_Function_v3float Function
 %h4 = OpVariable %_ptr_Function_v4float Function
-%254 = OpVariable %_ptr_Function_float Function
-%257 = OpVariable %_ptr_Function_v2float Function
-%262 = OpVariable %_ptr_Function_v4float Function
+%257 = OpVariable %_ptr_Function_v4float Function
+%262 = OpVariable %_ptr_Function_float Function
+%265 = OpVariable %_ptr_Function_v2float Function
+%270 = OpVariable %_ptr_Function_v4float Function
 %h2x2 = OpVariable %_ptr_Function_mat2v2float Function
+%276 = OpVariable %_ptr_Function_mat2v2float Function
 %h3x3 = OpVariable %_ptr_Function_mat3v3float Function
+%280 = OpVariable %_ptr_Function_mat3v3float Function
 %h4x4 = OpVariable %_ptr_Function_mat4v4float Function
-%274 = OpVariable %_ptr_Function_v3float Function
-%280 = OpVariable %_ptr_Function_float Function
-%286 = OpVariable %_ptr_Function_float Function
+%284 = OpVariable %_ptr_Function_mat4v4float Function
+%288 = OpVariable %_ptr_Function_v3float Function
+%294 = OpVariable %_ptr_Function_float Function
+%300 = OpVariable %_ptr_Function_float Function
 %i = OpVariable %_ptr_Function_int Function
+%304 = OpVariable %_ptr_Function_int Function
 %i2 = OpVariable %_ptr_Function_v2int Function
+%308 = OpVariable %_ptr_Function_v2int Function
 %i3 = OpVariable %_ptr_Function_v3int Function
+%312 = OpVariable %_ptr_Function_v3int Function
 %i4 = OpVariable %_ptr_Function_v4int Function
-%297 = OpVariable %_ptr_Function_v3int Function
-%303 = OpVariable %_ptr_Function_int Function
+%316 = OpVariable %_ptr_Function_v4int Function
+%319 = OpVariable %_ptr_Function_v3int Function
+%325 = OpVariable %_ptr_Function_int Function
 %f = OpVariable %_ptr_Function_float Function
+%329 = OpVariable %_ptr_Function_float Function
 %f2 = OpVariable %_ptr_Function_v2float Function
+%333 = OpVariable %_ptr_Function_v2float Function
 %f3 = OpVariable %_ptr_Function_v3float Function
+%337 = OpVariable %_ptr_Function_v3float Function
 %f4 = OpVariable %_ptr_Function_v4float Function
-%314 = OpVariable %_ptr_Function_v2float Function
-%320 = OpVariable %_ptr_Function_float Function
+%341 = OpVariable %_ptr_Function_v4float Function
+%344 = OpVariable %_ptr_Function_v2float Function
+%350 = OpVariable %_ptr_Function_float Function
 %f2x2 = OpVariable %_ptr_Function_mat2v2float Function
+%354 = OpVariable %_ptr_Function_mat2v2float Function
 %f3x3 = OpVariable %_ptr_Function_mat3v3float Function
+%358 = OpVariable %_ptr_Function_mat3v3float Function
 %f4x4 = OpVariable %_ptr_Function_mat4v4float Function
-%331 = OpVariable %_ptr_Function_float Function
+%362 = OpVariable %_ptr_Function_mat4v4float Function
+%367 = OpVariable %_ptr_Function_float Function
 %b = OpVariable %_ptr_Function_bool Function
+%371 = OpVariable %_ptr_Function_bool Function
 %b2 = OpVariable %_ptr_Function_v2bool Function
+%375 = OpVariable %_ptr_Function_v2bool Function
 %b3 = OpVariable %_ptr_Function_v3bool Function
+%379 = OpVariable %_ptr_Function_v3bool Function
 %b4 = OpVariable %_ptr_Function_v4bool Function
-%342 = OpVariable %_ptr_Function_v2bool Function
-%348 = OpVariable %_ptr_Function_bool Function
+%383 = OpVariable %_ptr_Function_v4bool Function
+%386 = OpVariable %_ptr_Function_v2bool Function
+%392 = OpVariable %_ptr_Function_bool Function
 %ok = OpVariable %_ptr_Function_bool Function
-%445 = OpVariable %_ptr_Function_v4float Function
-%245 = OpFunctionCall %void %out_half_vh %h
-%247 = OpFunctionCall %void %out_half2_vh2 %h2
-%249 = OpFunctionCall %void %out_half3_vh3 %h3
-%251 = OpFunctionCall %void %out_half4_vh4 %h4
-%252 = OpAccessChain %_ptr_Function_float %h3 %int_1
-%255 = OpFunctionCall %void %out_half_vh %254
-%256 = OpLoad %float %254
-OpStore %252 %256
-%258 = OpFunctionCall %void %out_half2_vh2 %257
-%259 = OpLoad %v2float %257
-%260 = OpLoad %v3float %h3
-%261 = OpVectorShuffle %v3float %260 %259 3 1 4
-OpStore %h3 %261
-%263 = OpFunctionCall %void %out_half4_vh4 %262
-%264 = OpLoad %v4float %262
-%265 = OpLoad %v4float %h4
-%266 = OpVectorShuffle %v4float %265 %264 6 7 4 5
-OpStore %h4 %266
-%268 = OpFunctionCall %void %out_half2x2_vh22 %h2x2
-%270 = OpFunctionCall %void %out_half3x3_vh33 %h3x3
-%272 = OpFunctionCall %void %out_half4x4_vh44 %h4x4
-%273 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_1
-%275 = OpFunctionCall %void %out_half3_vh3 %274
-%276 = OpLoad %v3float %274
-OpStore %273 %276
-%278 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_3
-%279 = OpAccessChain %_ptr_Function_float %278 %int_3
-%281 = OpFunctionCall %void %out_half_vh %280
-%282 = OpLoad %float %280
-OpStore %279 %282
-%284 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
-%285 = OpAccessChain %_ptr_Function_float %284 %int_0
-%287 = OpFunctionCall %void %out_half_vh %286
-%288 = OpLoad %float %286
-OpStore %285 %288
-%290 = OpFunctionCall %void %out_int_vi %i
-%292 = OpFunctionCall %void %out_int2_vi2 %i2
-%294 = OpFunctionCall %void %out_int3_vi3 %i3
-%296 = OpFunctionCall %void %out_int4_vi4 %i4
-%298 = OpFunctionCall %void %out_int3_vi3 %297
-%299 = OpLoad %v3int %297
-%300 = OpLoad %v4int %i4
-%301 = OpVectorShuffle %v4int %300 %299 4 5 6 3
-OpStore %i4 %301
-%302 = OpAccessChain %_ptr_Function_int %i2 %int_1
-%304 = OpFunctionCall %void %out_int_vi %303
-%305 = OpLoad %int %303
-OpStore %302 %305
-%307 = OpFunctionCall %void %out_float_vf %f
-%309 = OpFunctionCall %void %out_float2_vf2 %f2
-%311 = OpFunctionCall %void %out_float3_vf3 %f3
-%313 = OpFunctionCall %void %out_float4_vf4 %f4
-%315 = OpFunctionCall %void %out_float2_vf2 %314
-%316 = OpLoad %v2float %314
-%317 = OpLoad %v3float %f3
-%318 = OpVectorShuffle %v3float %317 %316 3 4 2
-OpStore %f3 %318
-%319 = OpAccessChain %_ptr_Function_float %f2 %int_0
-%321 = OpFunctionCall %void %out_float_vf %320
-%322 = OpLoad %float %320
-OpStore %319 %322
-%324 = OpFunctionCall %void %out_float2x2_vf22 %f2x2
-%326 = OpFunctionCall %void %out_float3x3_vf33 %f3x3
-%328 = OpFunctionCall %void %out_float4x4_vf44 %f4x4
-%329 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
-%330 = OpAccessChain %_ptr_Function_float %329 %int_0
-%332 = OpFunctionCall %void %out_float_vf %331
-%333 = OpLoad %float %331
-OpStore %330 %333
-%335 = OpFunctionCall %void %out_bool_vb %b
-%337 = OpFunctionCall %void %out_bool2_vb2 %b2
-%339 = OpFunctionCall %void %out_bool3_vb3 %b3
-%341 = OpFunctionCall %void %out_bool4_vb4 %b4
-%343 = OpFunctionCall %void %out_bool2_vb2 %342
-%344 = OpLoad %v2bool %342
-%345 = OpLoad %v4bool %b4
-%346 = OpVectorShuffle %v4bool %345 %344 4 1 2 5
-OpStore %b4 %346
-%347 = OpAccessChain %_ptr_Function_bool %b3 %int_2
-%349 = OpFunctionCall %void %out_bool_vb %348
-%350 = OpLoad %bool %348
-OpStore %347 %350
+%489 = OpVariable %_ptr_Function_v4float Function
+%246 = OpFunctionCall %void %out_half_vh %245
+%247 = OpLoad %float %245
+OpStore %h %247
+%250 = OpFunctionCall %void %out_half2_vh2 %249
+%251 = OpLoad %v2float %249
+OpStore %h2 %251
+%254 = OpFunctionCall %void %out_half3_vh3 %253
+%255 = OpLoad %v3float %253
+OpStore %h3 %255
+%258 = OpFunctionCall %void %out_half4_vh4 %257
+%259 = OpLoad %v4float %257
+OpStore %h4 %259
+%260 = OpAccessChain %_ptr_Function_float %h3 %int_1
+%263 = OpFunctionCall %void %out_half_vh %262
+%264 = OpLoad %float %262
+OpStore %260 %264
+%266 = OpFunctionCall %void %out_half2_vh2 %265
+%267 = OpLoad %v2float %265
+%268 = OpLoad %v3float %h3
+%269 = OpVectorShuffle %v3float %268 %267 3 1 4
+OpStore %h3 %269
+%271 = OpFunctionCall %void %out_half4_vh4 %270
+%272 = OpLoad %v4float %270
+%273 = OpLoad %v4float %h4
+%274 = OpVectorShuffle %v4float %273 %272 6 7 4 5
+OpStore %h4 %274
+%277 = OpFunctionCall %void %out_half2x2_vh22 %276
+%278 = OpLoad %mat2v2float %276
+OpStore %h2x2 %278
+%281 = OpFunctionCall %void %out_half3x3_vh33 %280
+%282 = OpLoad %mat3v3float %280
+OpStore %h3x3 %282
+%285 = OpFunctionCall %void %out_half4x4_vh44 %284
+%286 = OpLoad %mat4v4float %284
+OpStore %h4x4 %286
+%287 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_1
+%289 = OpFunctionCall %void %out_half3_vh3 %288
+%290 = OpLoad %v3float %288
+OpStore %287 %290
+%292 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_3
+%293 = OpAccessChain %_ptr_Function_float %292 %int_3
+%295 = OpFunctionCall %void %out_half_vh %294
+%296 = OpLoad %float %294
+OpStore %293 %296
+%298 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
+%299 = OpAccessChain %_ptr_Function_float %298 %int_0
+%301 = OpFunctionCall %void %out_half_vh %300
+%302 = OpLoad %float %300
+OpStore %299 %302
+%305 = OpFunctionCall %void %out_int_vi %304
+%306 = OpLoad %int %304
+OpStore %i %306
+%309 = OpFunctionCall %void %out_int2_vi2 %308
+%310 = OpLoad %v2int %308
+OpStore %i2 %310
+%313 = OpFunctionCall %void %out_int3_vi3 %312
+%314 = OpLoad %v3int %312
+OpStore %i3 %314
+%317 = OpFunctionCall %void %out_int4_vi4 %316
+%318 = OpLoad %v4int %316
+OpStore %i4 %318
+%320 = OpFunctionCall %void %out_int3_vi3 %319
+%321 = OpLoad %v3int %319
+%322 = OpLoad %v4int %i4
+%323 = OpVectorShuffle %v4int %322 %321 4 5 6 3
+OpStore %i4 %323
+%324 = OpAccessChain %_ptr_Function_int %i2 %int_1
+%326 = OpFunctionCall %void %out_int_vi %325
+%327 = OpLoad %int %325
+OpStore %324 %327
+%330 = OpFunctionCall %void %out_float_vf %329
+%331 = OpLoad %float %329
+OpStore %f %331
+%334 = OpFunctionCall %void %out_float2_vf2 %333
+%335 = OpLoad %v2float %333
+OpStore %f2 %335
+%338 = OpFunctionCall %void %out_float3_vf3 %337
+%339 = OpLoad %v3float %337
+OpStore %f3 %339
+%342 = OpFunctionCall %void %out_float4_vf4 %341
+%343 = OpLoad %v4float %341
+OpStore %f4 %343
+%345 = OpFunctionCall %void %out_float2_vf2 %344
+%346 = OpLoad %v2float %344
+%347 = OpLoad %v3float %f3
+%348 = OpVectorShuffle %v3float %347 %346 3 4 2
+OpStore %f3 %348
+%349 = OpAccessChain %_ptr_Function_float %f2 %int_0
+%351 = OpFunctionCall %void %out_float_vf %350
+%352 = OpLoad %float %350
+OpStore %349 %352
+%355 = OpFunctionCall %void %out_float2x2_vf22 %354
+%356 = OpLoad %mat2v2float %354
+OpStore %f2x2 %356
+%359 = OpFunctionCall %void %out_float3x3_vf33 %358
+%360 = OpLoad %mat3v3float %358
+OpStore %f3x3 %360
+%363 = OpFunctionCall %void %out_float4x4_vf44 %362
+%364 = OpLoad %mat4v4float %362
+OpStore %f4x4 %364
+%365 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
+%366 = OpAccessChain %_ptr_Function_float %365 %int_0
+%368 = OpFunctionCall %void %out_float_vf %367
+%369 = OpLoad %float %367
+OpStore %366 %369
+%372 = OpFunctionCall %void %out_bool_vb %371
+%373 = OpLoad %bool %371
+OpStore %b %373
+%376 = OpFunctionCall %void %out_bool2_vb2 %375
+%377 = OpLoad %v2bool %375
+OpStore %b2 %377
+%380 = OpFunctionCall %void %out_bool3_vb3 %379
+%381 = OpLoad %v3bool %379
+OpStore %b3 %381
+%384 = OpFunctionCall %void %out_bool4_vb4 %383
+%385 = OpLoad %v4bool %383
+OpStore %b4 %385
+%387 = OpFunctionCall %void %out_bool2_vb2 %386
+%388 = OpLoad %v2bool %386
+%389 = OpLoad %v4bool %b4
+%390 = OpVectorShuffle %v4bool %389 %388 4 1 2 5
+OpStore %b4 %390
+%391 = OpAccessChain %_ptr_Function_bool %b3 %int_2
+%393 = OpFunctionCall %void %out_bool_vb %392
+%394 = OpLoad %bool %392
+OpStore %391 %394
 OpStore %ok %true
-%354 = OpLoad %bool %ok
-OpSelectionMerge %356 None
-OpBranchConditional %354 %355 %356
-%355 = OpLabel
-%358 = OpLoad %float %h
-%359 = OpLoad %v2float %h2
-%360 = OpCompositeExtract %float %359 0
-%361 = OpFMul %float %358 %360
-%362 = OpLoad %v3float %h3
-%363 = OpCompositeExtract %float %362 0
-%364 = OpFMul %float %361 %363
-%365 = OpLoad %v4float %h4
-%366 = OpCompositeExtract %float %365 0
-%367 = OpFMul %float %364 %366
-%368 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
-%369 = OpLoad %v2float %368
-%370 = OpCompositeExtract %float %369 0
-%371 = OpFMul %float %367 %370
-%372 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_0
-%373 = OpLoad %v3float %372
-%374 = OpCompositeExtract %float %373 0
-%375 = OpFMul %float %371 %374
-%376 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_0
-%377 = OpLoad %v4float %376
-%378 = OpCompositeExtract %float %377 0
-%379 = OpFMul %float %375 %378
-%380 = OpFOrdEqual %bool %float_1 %379
-OpBranch %356
-%356 = OpLabel
-%381 = OpPhi %bool %false %243 %380 %355
-OpStore %ok %381
-%382 = OpLoad %bool %ok
-OpSelectionMerge %384 None
-OpBranchConditional %382 %383 %384
-%383 = OpLabel
-%385 = OpLoad %float %f
-%386 = OpLoad %v2float %f2
-%387 = OpCompositeExtract %float %386 0
-%388 = OpFMul %float %385 %387
-%389 = OpLoad %v3float %f3
-%390 = OpCompositeExtract %float %389 0
-%391 = OpFMul %float %388 %390
-%392 = OpLoad %v4float %f4
-%393 = OpCompositeExtract %float %392 0
-%394 = OpFMul %float %391 %393
-%395 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
-%396 = OpLoad %v2float %395
-%397 = OpCompositeExtract %float %396 0
-%398 = OpFMul %float %394 %397
-%399 = OpAccessChain %_ptr_Function_v3float %f3x3 %int_0
-%400 = OpLoad %v3float %399
-%401 = OpCompositeExtract %float %400 0
-%402 = OpFMul %float %398 %401
-%403 = OpAccessChain %_ptr_Function_v4float %f4x4 %int_0
-%404 = OpLoad %v4float %403
-%405 = OpCompositeExtract %float %404 0
-%406 = OpFMul %float %402 %405
-%407 = OpFOrdEqual %bool %float_1 %406
-OpBranch %384
-%384 = OpLabel
-%408 = OpPhi %bool %false %356 %407 %383
-OpStore %ok %408
-%409 = OpLoad %bool %ok
-OpSelectionMerge %411 None
-OpBranchConditional %409 %410 %411
-%410 = OpLabel
-%412 = OpLoad %int %i
-%413 = OpLoad %v2int %i2
-%414 = OpCompositeExtract %int %413 0
-%415 = OpIMul %int %412 %414
-%416 = OpLoad %v3int %i3
-%417 = OpCompositeExtract %int %416 0
-%418 = OpIMul %int %415 %417
-%419 = OpLoad %v4int %i4
-%420 = OpCompositeExtract %int %419 0
-%421 = OpIMul %int %418 %420
-%422 = OpIEqual %bool %int_1 %421
-OpBranch %411
-%411 = OpLabel
-%423 = OpPhi %bool %false %384 %422 %410
-OpStore %ok %423
-%424 = OpLoad %bool %ok
-OpSelectionMerge %426 None
-OpBranchConditional %424 %425 %426
-%425 = OpLabel
-%427 = OpLoad %bool %b
-OpSelectionMerge %429 None
-OpBranchConditional %427 %428 %429
+%398 = OpLoad %bool %ok
+OpSelectionMerge %400 None
+OpBranchConditional %398 %399 %400
+%399 = OpLabel
+%402 = OpLoad %float %h
+%403 = OpLoad %v2float %h2
+%404 = OpCompositeExtract %float %403 0
+%405 = OpFMul %float %402 %404
+%406 = OpLoad %v3float %h3
+%407 = OpCompositeExtract %float %406 0
+%408 = OpFMul %float %405 %407
+%409 = OpLoad %v4float %h4
+%410 = OpCompositeExtract %float %409 0
+%411 = OpFMul %float %408 %410
+%412 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
+%413 = OpLoad %v2float %412
+%414 = OpCompositeExtract %float %413 0
+%415 = OpFMul %float %411 %414
+%416 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_0
+%417 = OpLoad %v3float %416
+%418 = OpCompositeExtract %float %417 0
+%419 = OpFMul %float %415 %418
+%420 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_0
+%421 = OpLoad %v4float %420
+%422 = OpCompositeExtract %float %421 0
+%423 = OpFMul %float %419 %422
+%424 = OpFOrdEqual %bool %float_1 %423
+OpBranch %400
+%400 = OpLabel
+%425 = OpPhi %bool %false %243 %424 %399
+OpStore %ok %425
+%426 = OpLoad %bool %ok
+OpSelectionMerge %428 None
+OpBranchConditional %426 %427 %428
+%427 = OpLabel
+%429 = OpLoad %float %f
+%430 = OpLoad %v2float %f2
+%431 = OpCompositeExtract %float %430 0
+%432 = OpFMul %float %429 %431
+%433 = OpLoad %v3float %f3
+%434 = OpCompositeExtract %float %433 0
+%435 = OpFMul %float %432 %434
+%436 = OpLoad %v4float %f4
+%437 = OpCompositeExtract %float %436 0
+%438 = OpFMul %float %435 %437
+%439 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
+%440 = OpLoad %v2float %439
+%441 = OpCompositeExtract %float %440 0
+%442 = OpFMul %float %438 %441
+%443 = OpAccessChain %_ptr_Function_v3float %f3x3 %int_0
+%444 = OpLoad %v3float %443
+%445 = OpCompositeExtract %float %444 0
+%446 = OpFMul %float %442 %445
+%447 = OpAccessChain %_ptr_Function_v4float %f4x4 %int_0
+%448 = OpLoad %v4float %447
+%449 = OpCompositeExtract %float %448 0
+%450 = OpFMul %float %446 %449
+%451 = OpFOrdEqual %bool %float_1 %450
+OpBranch %428
 %428 = OpLabel
-%430 = OpLoad %v2bool %b2
-%431 = OpCompositeExtract %bool %430 0
-OpBranch %429
-%429 = OpLabel
-%432 = OpPhi %bool %false %425 %431 %428
-OpSelectionMerge %434 None
-OpBranchConditional %432 %433 %434
-%433 = OpLabel
-%435 = OpLoad %v3bool %b3
-%436 = OpCompositeExtract %bool %435 0
-OpBranch %434
-%434 = OpLabel
-%437 = OpPhi %bool %false %429 %436 %433
-OpSelectionMerge %439 None
-OpBranchConditional %437 %438 %439
-%438 = OpLabel
-%440 = OpLoad %v4bool %b4
-%441 = OpCompositeExtract %bool %440 0
-OpBranch %439
-%439 = OpLabel
-%442 = OpPhi %bool %false %434 %441 %438
-OpBranch %426
-%426 = OpLabel
-%443 = OpPhi %bool %false %411 %442 %439
-OpStore %ok %443
-%444 = OpLoad %bool %ok
-OpSelectionMerge %448 None
-OpBranchConditional %444 %446 %447
-%446 = OpLabel
-%449 = OpAccessChain %_ptr_Uniform_v4float %32 %int_0
-%450 = OpLoad %v4float %449
-OpStore %445 %450
-OpBranch %448
-%447 = OpLabel
-%451 = OpAccessChain %_ptr_Uniform_v4float %32 %int_1
-%452 = OpLoad %v4float %451
-OpStore %445 %452
-OpBranch %448
-%448 = OpLabel
-%453 = OpLoad %v4float %445
-OpReturnValue %453
+%452 = OpPhi %bool %false %400 %451 %427
+OpStore %ok %452
+%453 = OpLoad %bool %ok
+OpSelectionMerge %455 None
+OpBranchConditional %453 %454 %455
+%454 = OpLabel
+%456 = OpLoad %int %i
+%457 = OpLoad %v2int %i2
+%458 = OpCompositeExtract %int %457 0
+%459 = OpIMul %int %456 %458
+%460 = OpLoad %v3int %i3
+%461 = OpCompositeExtract %int %460 0
+%462 = OpIMul %int %459 %461
+%463 = OpLoad %v4int %i4
+%464 = OpCompositeExtract %int %463 0
+%465 = OpIMul %int %462 %464
+%466 = OpIEqual %bool %int_1 %465
+OpBranch %455
+%455 = OpLabel
+%467 = OpPhi %bool %false %428 %466 %454
+OpStore %ok %467
+%468 = OpLoad %bool %ok
+OpSelectionMerge %470 None
+OpBranchConditional %468 %469 %470
+%469 = OpLabel
+%471 = OpLoad %bool %b
+OpSelectionMerge %473 None
+OpBranchConditional %471 %472 %473
+%472 = OpLabel
+%474 = OpLoad %v2bool %b2
+%475 = OpCompositeExtract %bool %474 0
+OpBranch %473
+%473 = OpLabel
+%476 = OpPhi %bool %false %469 %475 %472
+OpSelectionMerge %478 None
+OpBranchConditional %476 %477 %478
+%477 = OpLabel
+%479 = OpLoad %v3bool %b3
+%480 = OpCompositeExtract %bool %479 0
+OpBranch %478
+%478 = OpLabel
+%481 = OpPhi %bool %false %473 %480 %477
+OpSelectionMerge %483 None
+OpBranchConditional %481 %482 %483
+%482 = OpLabel
+%484 = OpLoad %v4bool %b4
+%485 = OpCompositeExtract %bool %484 0
+OpBranch %483
+%483 = OpLabel
+%486 = OpPhi %bool %false %478 %485 %482
+OpBranch %470
+%470 = OpLabel
+%487 = OpPhi %bool %false %455 %486 %483
+OpStore %ok %487
+%488 = OpLoad %bool %ok
+OpSelectionMerge %492 None
+OpBranchConditional %488 %490 %491
+%490 = OpLabel
+%493 = OpAccessChain %_ptr_Uniform_v4float %32 %int_0
+%494 = OpLoad %v4float %493
+OpStore %489 %494
+OpBranch %492
+%491 = OpLabel
+%495 = OpAccessChain %_ptr_Uniform_v4float %32 %int_1
+%496 = OpLoad %v4float %495
+OpStore %489 %496
+OpBranch %492
+%492 = OpLabel
+%497 = OpLoad %v4float %489
+OpReturnValue %497
 OpFunctionEnd
diff --git a/tests/sksl/shared/OutParamsNoInline.asm.frag b/tests/sksl/shared/OutParamsNoInline.asm.frag
index 5621226..8bbc64e 100644
--- a/tests/sksl/shared/OutParamsNoInline.asm.frag
+++ b/tests/sksl/shared/OutParamsNoInline.asm.frag
@@ -129,59 +129,73 @@
 OpDecorate %237 RelaxedPrecision
 OpDecorate %238 RelaxedPrecision
 OpDecorate %h RelaxedPrecision
+OpDecorate %245 RelaxedPrecision
+OpDecorate %247 RelaxedPrecision
 OpDecorate %h2 RelaxedPrecision
+OpDecorate %249 RelaxedPrecision
+OpDecorate %251 RelaxedPrecision
 OpDecorate %h3 RelaxedPrecision
+OpDecorate %253 RelaxedPrecision
+OpDecorate %255 RelaxedPrecision
 OpDecorate %h4 RelaxedPrecision
-OpDecorate %254 RelaxedPrecision
-OpDecorate %256 RelaxedPrecision
 OpDecorate %257 RelaxedPrecision
 OpDecorate %259 RelaxedPrecision
-OpDecorate %260 RelaxedPrecision
-OpDecorate %261 RelaxedPrecision
 OpDecorate %262 RelaxedPrecision
 OpDecorate %264 RelaxedPrecision
 OpDecorate %265 RelaxedPrecision
-OpDecorate %266 RelaxedPrecision
-OpDecorate %h2x2 RelaxedPrecision
-OpDecorate %h3x3 RelaxedPrecision
-OpDecorate %h4x4 RelaxedPrecision
+OpDecorate %267 RelaxedPrecision
+OpDecorate %268 RelaxedPrecision
+OpDecorate %269 RelaxedPrecision
+OpDecorate %270 RelaxedPrecision
+OpDecorate %272 RelaxedPrecision
+OpDecorate %273 RelaxedPrecision
 OpDecorate %274 RelaxedPrecision
+OpDecorate %h2x2 RelaxedPrecision
 OpDecorate %276 RelaxedPrecision
+OpDecorate %278 RelaxedPrecision
+OpDecorate %h3x3 RelaxedPrecision
 OpDecorate %280 RelaxedPrecision
 OpDecorate %282 RelaxedPrecision
+OpDecorate %h4x4 RelaxedPrecision
+OpDecorate %284 RelaxedPrecision
 OpDecorate %286 RelaxedPrecision
 OpDecorate %288 RelaxedPrecision
-OpDecorate %354 RelaxedPrecision
-OpDecorate %358 RelaxedPrecision
-OpDecorate %359 RelaxedPrecision
-OpDecorate %360 RelaxedPrecision
-OpDecorate %361 RelaxedPrecision
-OpDecorate %362 RelaxedPrecision
-OpDecorate %363 RelaxedPrecision
-OpDecorate %364 RelaxedPrecision
-OpDecorate %365 RelaxedPrecision
-OpDecorate %366 RelaxedPrecision
-OpDecorate %367 RelaxedPrecision
-OpDecorate %369 RelaxedPrecision
-OpDecorate %370 RelaxedPrecision
-OpDecorate %371 RelaxedPrecision
-OpDecorate %373 RelaxedPrecision
-OpDecorate %374 RelaxedPrecision
-OpDecorate %375 RelaxedPrecision
-OpDecorate %377 RelaxedPrecision
-OpDecorate %378 RelaxedPrecision
-OpDecorate %379 RelaxedPrecision
-OpDecorate %382 RelaxedPrecision
+OpDecorate %290 RelaxedPrecision
+OpDecorate %294 RelaxedPrecision
+OpDecorate %296 RelaxedPrecision
+OpDecorate %300 RelaxedPrecision
+OpDecorate %302 RelaxedPrecision
+OpDecorate %398 RelaxedPrecision
+OpDecorate %402 RelaxedPrecision
+OpDecorate %403 RelaxedPrecision
+OpDecorate %404 RelaxedPrecision
+OpDecorate %405 RelaxedPrecision
+OpDecorate %406 RelaxedPrecision
+OpDecorate %407 RelaxedPrecision
+OpDecorate %408 RelaxedPrecision
 OpDecorate %409 RelaxedPrecision
-OpDecorate %424 RelaxedPrecision
-OpDecorate %427 RelaxedPrecision
-OpDecorate %430 RelaxedPrecision
-OpDecorate %435 RelaxedPrecision
-OpDecorate %440 RelaxedPrecision
-OpDecorate %444 RelaxedPrecision
-OpDecorate %450 RelaxedPrecision
-OpDecorate %452 RelaxedPrecision
+OpDecorate %410 RelaxedPrecision
+OpDecorate %411 RelaxedPrecision
+OpDecorate %413 RelaxedPrecision
+OpDecorate %414 RelaxedPrecision
+OpDecorate %415 RelaxedPrecision
+OpDecorate %417 RelaxedPrecision
+OpDecorate %418 RelaxedPrecision
+OpDecorate %419 RelaxedPrecision
+OpDecorate %421 RelaxedPrecision
+OpDecorate %422 RelaxedPrecision
+OpDecorate %423 RelaxedPrecision
+OpDecorate %426 RelaxedPrecision
 OpDecorate %453 RelaxedPrecision
+OpDecorate %468 RelaxedPrecision
+OpDecorate %471 RelaxedPrecision
+OpDecorate %474 RelaxedPrecision
+OpDecorate %479 RelaxedPrecision
+OpDecorate %484 RelaxedPrecision
+OpDecorate %488 RelaxedPrecision
+OpDecorate %494 RelaxedPrecision
+OpDecorate %496 RelaxedPrecision
+OpDecorate %497 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -501,253 +515,319 @@
 %242 = OpFunctionParameter %_ptr_Function_v2float
 %243 = OpLabel
 %h = OpVariable %_ptr_Function_float Function
+%245 = OpVariable %_ptr_Function_float Function
 %h2 = OpVariable %_ptr_Function_v2float Function
+%249 = OpVariable %_ptr_Function_v2float Function
 %h3 = OpVariable %_ptr_Function_v3float Function
+%253 = OpVariable %_ptr_Function_v3float Function
 %h4 = OpVariable %_ptr_Function_v4float Function
-%254 = OpVariable %_ptr_Function_float Function
-%257 = OpVariable %_ptr_Function_v2float Function
-%262 = OpVariable %_ptr_Function_v4float Function
+%257 = OpVariable %_ptr_Function_v4float Function
+%262 = OpVariable %_ptr_Function_float Function
+%265 = OpVariable %_ptr_Function_v2float Function
+%270 = OpVariable %_ptr_Function_v4float Function
 %h2x2 = OpVariable %_ptr_Function_mat2v2float Function
+%276 = OpVariable %_ptr_Function_mat2v2float Function
 %h3x3 = OpVariable %_ptr_Function_mat3v3float Function
+%280 = OpVariable %_ptr_Function_mat3v3float Function
 %h4x4 = OpVariable %_ptr_Function_mat4v4float Function
-%274 = OpVariable %_ptr_Function_v3float Function
-%280 = OpVariable %_ptr_Function_float Function
-%286 = OpVariable %_ptr_Function_float Function
+%284 = OpVariable %_ptr_Function_mat4v4float Function
+%288 = OpVariable %_ptr_Function_v3float Function
+%294 = OpVariable %_ptr_Function_float Function
+%300 = OpVariable %_ptr_Function_float Function
 %i = OpVariable %_ptr_Function_int Function
+%304 = OpVariable %_ptr_Function_int Function
 %i2 = OpVariable %_ptr_Function_v2int Function
+%308 = OpVariable %_ptr_Function_v2int Function
 %i3 = OpVariable %_ptr_Function_v3int Function
+%312 = OpVariable %_ptr_Function_v3int Function
 %i4 = OpVariable %_ptr_Function_v4int Function
-%297 = OpVariable %_ptr_Function_v3int Function
-%303 = OpVariable %_ptr_Function_int Function
+%316 = OpVariable %_ptr_Function_v4int Function
+%319 = OpVariable %_ptr_Function_v3int Function
+%325 = OpVariable %_ptr_Function_int Function
 %f = OpVariable %_ptr_Function_float Function
+%329 = OpVariable %_ptr_Function_float Function
 %f2 = OpVariable %_ptr_Function_v2float Function
+%333 = OpVariable %_ptr_Function_v2float Function
 %f3 = OpVariable %_ptr_Function_v3float Function
+%337 = OpVariable %_ptr_Function_v3float Function
 %f4 = OpVariable %_ptr_Function_v4float Function
-%314 = OpVariable %_ptr_Function_v2float Function
-%320 = OpVariable %_ptr_Function_float Function
+%341 = OpVariable %_ptr_Function_v4float Function
+%344 = OpVariable %_ptr_Function_v2float Function
+%350 = OpVariable %_ptr_Function_float Function
 %f2x2 = OpVariable %_ptr_Function_mat2v2float Function
+%354 = OpVariable %_ptr_Function_mat2v2float Function
 %f3x3 = OpVariable %_ptr_Function_mat3v3float Function
+%358 = OpVariable %_ptr_Function_mat3v3float Function
 %f4x4 = OpVariable %_ptr_Function_mat4v4float Function
-%331 = OpVariable %_ptr_Function_float Function
+%362 = OpVariable %_ptr_Function_mat4v4float Function
+%367 = OpVariable %_ptr_Function_float Function
 %b = OpVariable %_ptr_Function_bool Function
+%371 = OpVariable %_ptr_Function_bool Function
 %b2 = OpVariable %_ptr_Function_v2bool Function
+%375 = OpVariable %_ptr_Function_v2bool Function
 %b3 = OpVariable %_ptr_Function_v3bool Function
+%379 = OpVariable %_ptr_Function_v3bool Function
 %b4 = OpVariable %_ptr_Function_v4bool Function
-%342 = OpVariable %_ptr_Function_v2bool Function
-%348 = OpVariable %_ptr_Function_bool Function
+%383 = OpVariable %_ptr_Function_v4bool Function
+%386 = OpVariable %_ptr_Function_v2bool Function
+%392 = OpVariable %_ptr_Function_bool Function
 %ok = OpVariable %_ptr_Function_bool Function
-%445 = OpVariable %_ptr_Function_v4float Function
-%245 = OpFunctionCall %void %out_half_vh %h
-%247 = OpFunctionCall %void %out_half2_vh2 %h2
-%249 = OpFunctionCall %void %out_half3_vh3 %h3
-%251 = OpFunctionCall %void %out_half4_vh4 %h4
-%252 = OpAccessChain %_ptr_Function_float %h3 %int_1
-%255 = OpFunctionCall %void %out_half_vh %254
-%256 = OpLoad %float %254
-OpStore %252 %256
-%258 = OpFunctionCall %void %out_half2_vh2 %257
-%259 = OpLoad %v2float %257
-%260 = OpLoad %v3float %h3
-%261 = OpVectorShuffle %v3float %260 %259 3 1 4
-OpStore %h3 %261
-%263 = OpFunctionCall %void %out_half4_vh4 %262
-%264 = OpLoad %v4float %262
-%265 = OpLoad %v4float %h4
-%266 = OpVectorShuffle %v4float %265 %264 6 7 4 5
-OpStore %h4 %266
-%268 = OpFunctionCall %void %out_half2x2_vh22 %h2x2
-%270 = OpFunctionCall %void %out_half3x3_vh33 %h3x3
-%272 = OpFunctionCall %void %out_half4x4_vh44 %h4x4
-%273 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_1
-%275 = OpFunctionCall %void %out_half3_vh3 %274
-%276 = OpLoad %v3float %274
-OpStore %273 %276
-%278 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_3
-%279 = OpAccessChain %_ptr_Function_float %278 %int_3
-%281 = OpFunctionCall %void %out_half_vh %280
-%282 = OpLoad %float %280
-OpStore %279 %282
-%284 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
-%285 = OpAccessChain %_ptr_Function_float %284 %int_0
-%287 = OpFunctionCall %void %out_half_vh %286
-%288 = OpLoad %float %286
-OpStore %285 %288
-%290 = OpFunctionCall %void %out_int_vi %i
-%292 = OpFunctionCall %void %out_int2_vi2 %i2
-%294 = OpFunctionCall %void %out_int3_vi3 %i3
-%296 = OpFunctionCall %void %out_int4_vi4 %i4
-%298 = OpFunctionCall %void %out_int3_vi3 %297
-%299 = OpLoad %v3int %297
-%300 = OpLoad %v4int %i4
-%301 = OpVectorShuffle %v4int %300 %299 4 5 6 3
-OpStore %i4 %301
-%302 = OpAccessChain %_ptr_Function_int %i2 %int_1
-%304 = OpFunctionCall %void %out_int_vi %303
-%305 = OpLoad %int %303
-OpStore %302 %305
-%307 = OpFunctionCall %void %out_float_vf %f
-%309 = OpFunctionCall %void %out_float2_vf2 %f2
-%311 = OpFunctionCall %void %out_float3_vf3 %f3
-%313 = OpFunctionCall %void %out_float4_vf4 %f4
-%315 = OpFunctionCall %void %out_float2_vf2 %314
-%316 = OpLoad %v2float %314
-%317 = OpLoad %v3float %f3
-%318 = OpVectorShuffle %v3float %317 %316 3 4 2
-OpStore %f3 %318
-%319 = OpAccessChain %_ptr_Function_float %f2 %int_0
-%321 = OpFunctionCall %void %out_float_vf %320
-%322 = OpLoad %float %320
-OpStore %319 %322
-%324 = OpFunctionCall %void %out_float2x2_vf22 %f2x2
-%326 = OpFunctionCall %void %out_float3x3_vf33 %f3x3
-%328 = OpFunctionCall %void %out_float4x4_vf44 %f4x4
-%329 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
-%330 = OpAccessChain %_ptr_Function_float %329 %int_0
-%332 = OpFunctionCall %void %out_float_vf %331
-%333 = OpLoad %float %331
-OpStore %330 %333
-%335 = OpFunctionCall %void %out_bool_vb %b
-%337 = OpFunctionCall %void %out_bool2_vb2 %b2
-%339 = OpFunctionCall %void %out_bool3_vb3 %b3
-%341 = OpFunctionCall %void %out_bool4_vb4 %b4
-%343 = OpFunctionCall %void %out_bool2_vb2 %342
-%344 = OpLoad %v2bool %342
-%345 = OpLoad %v4bool %b4
-%346 = OpVectorShuffle %v4bool %345 %344 4 1 2 5
-OpStore %b4 %346
-%347 = OpAccessChain %_ptr_Function_bool %b3 %int_2
-%349 = OpFunctionCall %void %out_bool_vb %348
-%350 = OpLoad %bool %348
-OpStore %347 %350
+%489 = OpVariable %_ptr_Function_v4float Function
+%246 = OpFunctionCall %void %out_half_vh %245
+%247 = OpLoad %float %245
+OpStore %h %247
+%250 = OpFunctionCall %void %out_half2_vh2 %249
+%251 = OpLoad %v2float %249
+OpStore %h2 %251
+%254 = OpFunctionCall %void %out_half3_vh3 %253
+%255 = OpLoad %v3float %253
+OpStore %h3 %255
+%258 = OpFunctionCall %void %out_half4_vh4 %257
+%259 = OpLoad %v4float %257
+OpStore %h4 %259
+%260 = OpAccessChain %_ptr_Function_float %h3 %int_1
+%263 = OpFunctionCall %void %out_half_vh %262
+%264 = OpLoad %float %262
+OpStore %260 %264
+%266 = OpFunctionCall %void %out_half2_vh2 %265
+%267 = OpLoad %v2float %265
+%268 = OpLoad %v3float %h3
+%269 = OpVectorShuffle %v3float %268 %267 3 1 4
+OpStore %h3 %269
+%271 = OpFunctionCall %void %out_half4_vh4 %270
+%272 = OpLoad %v4float %270
+%273 = OpLoad %v4float %h4
+%274 = OpVectorShuffle %v4float %273 %272 6 7 4 5
+OpStore %h4 %274
+%277 = OpFunctionCall %void %out_half2x2_vh22 %276
+%278 = OpLoad %mat2v2float %276
+OpStore %h2x2 %278
+%281 = OpFunctionCall %void %out_half3x3_vh33 %280
+%282 = OpLoad %mat3v3float %280
+OpStore %h3x3 %282
+%285 = OpFunctionCall %void %out_half4x4_vh44 %284
+%286 = OpLoad %mat4v4float %284
+OpStore %h4x4 %286
+%287 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_1
+%289 = OpFunctionCall %void %out_half3_vh3 %288
+%290 = OpLoad %v3float %288
+OpStore %287 %290
+%292 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_3
+%293 = OpAccessChain %_ptr_Function_float %292 %int_3
+%295 = OpFunctionCall %void %out_half_vh %294
+%296 = OpLoad %float %294
+OpStore %293 %296
+%298 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
+%299 = OpAccessChain %_ptr_Function_float %298 %int_0
+%301 = OpFunctionCall %void %out_half_vh %300
+%302 = OpLoad %float %300
+OpStore %299 %302
+%305 = OpFunctionCall %void %out_int_vi %304
+%306 = OpLoad %int %304
+OpStore %i %306
+%309 = OpFunctionCall %void %out_int2_vi2 %308
+%310 = OpLoad %v2int %308
+OpStore %i2 %310
+%313 = OpFunctionCall %void %out_int3_vi3 %312
+%314 = OpLoad %v3int %312
+OpStore %i3 %314
+%317 = OpFunctionCall %void %out_int4_vi4 %316
+%318 = OpLoad %v4int %316
+OpStore %i4 %318
+%320 = OpFunctionCall %void %out_int3_vi3 %319
+%321 = OpLoad %v3int %319
+%322 = OpLoad %v4int %i4
+%323 = OpVectorShuffle %v4int %322 %321 4 5 6 3
+OpStore %i4 %323
+%324 = OpAccessChain %_ptr_Function_int %i2 %int_1
+%326 = OpFunctionCall %void %out_int_vi %325
+%327 = OpLoad %int %325
+OpStore %324 %327
+%330 = OpFunctionCall %void %out_float_vf %329
+%331 = OpLoad %float %329
+OpStore %f %331
+%334 = OpFunctionCall %void %out_float2_vf2 %333
+%335 = OpLoad %v2float %333
+OpStore %f2 %335
+%338 = OpFunctionCall %void %out_float3_vf3 %337
+%339 = OpLoad %v3float %337
+OpStore %f3 %339
+%342 = OpFunctionCall %void %out_float4_vf4 %341
+%343 = OpLoad %v4float %341
+OpStore %f4 %343
+%345 = OpFunctionCall %void %out_float2_vf2 %344
+%346 = OpLoad %v2float %344
+%347 = OpLoad %v3float %f3
+%348 = OpVectorShuffle %v3float %347 %346 3 4 2
+OpStore %f3 %348
+%349 = OpAccessChain %_ptr_Function_float %f2 %int_0
+%351 = OpFunctionCall %void %out_float_vf %350
+%352 = OpLoad %float %350
+OpStore %349 %352
+%355 = OpFunctionCall %void %out_float2x2_vf22 %354
+%356 = OpLoad %mat2v2float %354
+OpStore %f2x2 %356
+%359 = OpFunctionCall %void %out_float3x3_vf33 %358
+%360 = OpLoad %mat3v3float %358
+OpStore %f3x3 %360
+%363 = OpFunctionCall %void %out_float4x4_vf44 %362
+%364 = OpLoad %mat4v4float %362
+OpStore %f4x4 %364
+%365 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
+%366 = OpAccessChain %_ptr_Function_float %365 %int_0
+%368 = OpFunctionCall %void %out_float_vf %367
+%369 = OpLoad %float %367
+OpStore %366 %369
+%372 = OpFunctionCall %void %out_bool_vb %371
+%373 = OpLoad %bool %371
+OpStore %b %373
+%376 = OpFunctionCall %void %out_bool2_vb2 %375
+%377 = OpLoad %v2bool %375
+OpStore %b2 %377
+%380 = OpFunctionCall %void %out_bool3_vb3 %379
+%381 = OpLoad %v3bool %379
+OpStore %b3 %381
+%384 = OpFunctionCall %void %out_bool4_vb4 %383
+%385 = OpLoad %v4bool %383
+OpStore %b4 %385
+%387 = OpFunctionCall %void %out_bool2_vb2 %386
+%388 = OpLoad %v2bool %386
+%389 = OpLoad %v4bool %b4
+%390 = OpVectorShuffle %v4bool %389 %388 4 1 2 5
+OpStore %b4 %390
+%391 = OpAccessChain %_ptr_Function_bool %b3 %int_2
+%393 = OpFunctionCall %void %out_bool_vb %392
+%394 = OpLoad %bool %392
+OpStore %391 %394
 OpStore %ok %true
-%354 = OpLoad %bool %ok
-OpSelectionMerge %356 None
-OpBranchConditional %354 %355 %356
-%355 = OpLabel
-%358 = OpLoad %float %h
-%359 = OpLoad %v2float %h2
-%360 = OpCompositeExtract %float %359 0
-%361 = OpFMul %float %358 %360
-%362 = OpLoad %v3float %h3
-%363 = OpCompositeExtract %float %362 0
-%364 = OpFMul %float %361 %363
-%365 = OpLoad %v4float %h4
-%366 = OpCompositeExtract %float %365 0
-%367 = OpFMul %float %364 %366
-%368 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
-%369 = OpLoad %v2float %368
-%370 = OpCompositeExtract %float %369 0
-%371 = OpFMul %float %367 %370
-%372 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_0
-%373 = OpLoad %v3float %372
-%374 = OpCompositeExtract %float %373 0
-%375 = OpFMul %float %371 %374
-%376 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_0
-%377 = OpLoad %v4float %376
-%378 = OpCompositeExtract %float %377 0
-%379 = OpFMul %float %375 %378
-%380 = OpFOrdEqual %bool %float_1 %379
-OpBranch %356
-%356 = OpLabel
-%381 = OpPhi %bool %false %243 %380 %355
-OpStore %ok %381
-%382 = OpLoad %bool %ok
-OpSelectionMerge %384 None
-OpBranchConditional %382 %383 %384
-%383 = OpLabel
-%385 = OpLoad %float %f
-%386 = OpLoad %v2float %f2
-%387 = OpCompositeExtract %float %386 0
-%388 = OpFMul %float %385 %387
-%389 = OpLoad %v3float %f3
-%390 = OpCompositeExtract %float %389 0
-%391 = OpFMul %float %388 %390
-%392 = OpLoad %v4float %f4
-%393 = OpCompositeExtract %float %392 0
-%394 = OpFMul %float %391 %393
-%395 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
-%396 = OpLoad %v2float %395
-%397 = OpCompositeExtract %float %396 0
-%398 = OpFMul %float %394 %397
-%399 = OpAccessChain %_ptr_Function_v3float %f3x3 %int_0
-%400 = OpLoad %v3float %399
-%401 = OpCompositeExtract %float %400 0
-%402 = OpFMul %float %398 %401
-%403 = OpAccessChain %_ptr_Function_v4float %f4x4 %int_0
-%404 = OpLoad %v4float %403
-%405 = OpCompositeExtract %float %404 0
-%406 = OpFMul %float %402 %405
-%407 = OpFOrdEqual %bool %float_1 %406
-OpBranch %384
-%384 = OpLabel
-%408 = OpPhi %bool %false %356 %407 %383
-OpStore %ok %408
-%409 = OpLoad %bool %ok
-OpSelectionMerge %411 None
-OpBranchConditional %409 %410 %411
-%410 = OpLabel
-%412 = OpLoad %int %i
-%413 = OpLoad %v2int %i2
-%414 = OpCompositeExtract %int %413 0
-%415 = OpIMul %int %412 %414
-%416 = OpLoad %v3int %i3
-%417 = OpCompositeExtract %int %416 0
-%418 = OpIMul %int %415 %417
-%419 = OpLoad %v4int %i4
-%420 = OpCompositeExtract %int %419 0
-%421 = OpIMul %int %418 %420
-%422 = OpIEqual %bool %int_1 %421
-OpBranch %411
-%411 = OpLabel
-%423 = OpPhi %bool %false %384 %422 %410
-OpStore %ok %423
-%424 = OpLoad %bool %ok
-OpSelectionMerge %426 None
-OpBranchConditional %424 %425 %426
-%425 = OpLabel
-%427 = OpLoad %bool %b
-OpSelectionMerge %429 None
-OpBranchConditional %427 %428 %429
+%398 = OpLoad %bool %ok
+OpSelectionMerge %400 None
+OpBranchConditional %398 %399 %400
+%399 = OpLabel
+%402 = OpLoad %float %h
+%403 = OpLoad %v2float %h2
+%404 = OpCompositeExtract %float %403 0
+%405 = OpFMul %float %402 %404
+%406 = OpLoad %v3float %h3
+%407 = OpCompositeExtract %float %406 0
+%408 = OpFMul %float %405 %407
+%409 = OpLoad %v4float %h4
+%410 = OpCompositeExtract %float %409 0
+%411 = OpFMul %float %408 %410
+%412 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
+%413 = OpLoad %v2float %412
+%414 = OpCompositeExtract %float %413 0
+%415 = OpFMul %float %411 %414
+%416 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_0
+%417 = OpLoad %v3float %416
+%418 = OpCompositeExtract %float %417 0
+%419 = OpFMul %float %415 %418
+%420 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_0
+%421 = OpLoad %v4float %420
+%422 = OpCompositeExtract %float %421 0
+%423 = OpFMul %float %419 %422
+%424 = OpFOrdEqual %bool %float_1 %423
+OpBranch %400
+%400 = OpLabel
+%425 = OpPhi %bool %false %243 %424 %399
+OpStore %ok %425
+%426 = OpLoad %bool %ok
+OpSelectionMerge %428 None
+OpBranchConditional %426 %427 %428
+%427 = OpLabel
+%429 = OpLoad %float %f
+%430 = OpLoad %v2float %f2
+%431 = OpCompositeExtract %float %430 0
+%432 = OpFMul %float %429 %431
+%433 = OpLoad %v3float %f3
+%434 = OpCompositeExtract %float %433 0
+%435 = OpFMul %float %432 %434
+%436 = OpLoad %v4float %f4
+%437 = OpCompositeExtract %float %436 0
+%438 = OpFMul %float %435 %437
+%439 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
+%440 = OpLoad %v2float %439
+%441 = OpCompositeExtract %float %440 0
+%442 = OpFMul %float %438 %441
+%443 = OpAccessChain %_ptr_Function_v3float %f3x3 %int_0
+%444 = OpLoad %v3float %443
+%445 = OpCompositeExtract %float %444 0
+%446 = OpFMul %float %442 %445
+%447 = OpAccessChain %_ptr_Function_v4float %f4x4 %int_0
+%448 = OpLoad %v4float %447
+%449 = OpCompositeExtract %float %448 0
+%450 = OpFMul %float %446 %449
+%451 = OpFOrdEqual %bool %float_1 %450
+OpBranch %428
 %428 = OpLabel
-%430 = OpLoad %v2bool %b2
-%431 = OpCompositeExtract %bool %430 0
-OpBranch %429
-%429 = OpLabel
-%432 = OpPhi %bool %false %425 %431 %428
-OpSelectionMerge %434 None
-OpBranchConditional %432 %433 %434
-%433 = OpLabel
-%435 = OpLoad %v3bool %b3
-%436 = OpCompositeExtract %bool %435 0
-OpBranch %434
-%434 = OpLabel
-%437 = OpPhi %bool %false %429 %436 %433
-OpSelectionMerge %439 None
-OpBranchConditional %437 %438 %439
-%438 = OpLabel
-%440 = OpLoad %v4bool %b4
-%441 = OpCompositeExtract %bool %440 0
-OpBranch %439
-%439 = OpLabel
-%442 = OpPhi %bool %false %434 %441 %438
-OpBranch %426
-%426 = OpLabel
-%443 = OpPhi %bool %false %411 %442 %439
-OpStore %ok %443
-%444 = OpLoad %bool %ok
-OpSelectionMerge %448 None
-OpBranchConditional %444 %446 %447
-%446 = OpLabel
-%449 = OpAccessChain %_ptr_Uniform_v4float %32 %int_0
-%450 = OpLoad %v4float %449
-OpStore %445 %450
-OpBranch %448
-%447 = OpLabel
-%451 = OpAccessChain %_ptr_Uniform_v4float %32 %int_1
-%452 = OpLoad %v4float %451
-OpStore %445 %452
-OpBranch %448
-%448 = OpLabel
-%453 = OpLoad %v4float %445
-OpReturnValue %453
+%452 = OpPhi %bool %false %400 %451 %427
+OpStore %ok %452
+%453 = OpLoad %bool %ok
+OpSelectionMerge %455 None
+OpBranchConditional %453 %454 %455
+%454 = OpLabel
+%456 = OpLoad %int %i
+%457 = OpLoad %v2int %i2
+%458 = OpCompositeExtract %int %457 0
+%459 = OpIMul %int %456 %458
+%460 = OpLoad %v3int %i3
+%461 = OpCompositeExtract %int %460 0
+%462 = OpIMul %int %459 %461
+%463 = OpLoad %v4int %i4
+%464 = OpCompositeExtract %int %463 0
+%465 = OpIMul %int %462 %464
+%466 = OpIEqual %bool %int_1 %465
+OpBranch %455
+%455 = OpLabel
+%467 = OpPhi %bool %false %428 %466 %454
+OpStore %ok %467
+%468 = OpLoad %bool %ok
+OpSelectionMerge %470 None
+OpBranchConditional %468 %469 %470
+%469 = OpLabel
+%471 = OpLoad %bool %b
+OpSelectionMerge %473 None
+OpBranchConditional %471 %472 %473
+%472 = OpLabel
+%474 = OpLoad %v2bool %b2
+%475 = OpCompositeExtract %bool %474 0
+OpBranch %473
+%473 = OpLabel
+%476 = OpPhi %bool %false %469 %475 %472
+OpSelectionMerge %478 None
+OpBranchConditional %476 %477 %478
+%477 = OpLabel
+%479 = OpLoad %v3bool %b3
+%480 = OpCompositeExtract %bool %479 0
+OpBranch %478
+%478 = OpLabel
+%481 = OpPhi %bool %false %473 %480 %477
+OpSelectionMerge %483 None
+OpBranchConditional %481 %482 %483
+%482 = OpLabel
+%484 = OpLoad %v4bool %b4
+%485 = OpCompositeExtract %bool %484 0
+OpBranch %483
+%483 = OpLabel
+%486 = OpPhi %bool %false %478 %485 %482
+OpBranch %470
+%470 = OpLabel
+%487 = OpPhi %bool %false %455 %486 %483
+OpStore %ok %487
+%488 = OpLoad %bool %ok
+OpSelectionMerge %492 None
+OpBranchConditional %488 %490 %491
+%490 = OpLabel
+%493 = OpAccessChain %_ptr_Uniform_v4float %32 %int_0
+%494 = OpLoad %v4float %493
+OpStore %489 %494
+OpBranch %492
+%491 = OpLabel
+%495 = OpAccessChain %_ptr_Uniform_v4float %32 %int_1
+%496 = OpLoad %v4float %495
+OpStore %489 %496
+OpBranch %492
+%492 = OpLabel
+%497 = OpLoad %v4float %489
+OpReturnValue %497
 OpFunctionEnd
diff --git a/tests/sksl/shared/OutParamsTricky.asm.frag b/tests/sksl/shared/OutParamsTricky.asm.frag
index 4086cad..dca346a 100644
--- a/tests/sksl/shared/OutParamsTricky.asm.frag
+++ b/tests/sksl/shared/OutParamsTricky.asm.frag
@@ -44,11 +44,14 @@
 OpDecorate %59 RelaxedPrecision
 OpDecorate %result RelaxedPrecision
 OpDecorate %65 RelaxedPrecision
+OpDecorate %66 RelaxedPrecision
 OpDecorate %67 RelaxedPrecision
-OpDecorate %68 RelaxedPrecision
-OpDecorate %80 RelaxedPrecision
+OpDecorate %69 RelaxedPrecision
+OpDecorate %70 RelaxedPrecision
+OpDecorate %71 RelaxedPrecision
 OpDecorate %83 RelaxedPrecision
-OpDecorate %84 RelaxedPrecision
+OpDecorate %86 RelaxedPrecision
+OpDecorate %87 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -75,7 +78,7 @@
 %60 = OpTypeFunction %v4float %_ptr_Function_v2float
 %float_3 = OpConstant %float 3
 %65 = OpConstantComposite %v4float %float_0 %float_1 %float_2 %float_3
-%68 = OpConstantComposite %v4float %float_2 %float_3 %float_0 %float_5
+%71 = OpConstantComposite %v4float %float_2 %float_3 %float_0 %float_5
 %v4bool = OpTypeVector %bool 4
 %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
 %int = OpTypeInt 32 1
@@ -135,25 +138,30 @@
 %61 = OpFunctionParameter %_ptr_Function_v2float
 %62 = OpLabel
 %result = OpVariable %_ptr_Function_v4float Function
-%72 = OpVariable %_ptr_Function_v4float Function
+%67 = OpVariable %_ptr_Function_v4float Function
+%75 = OpVariable %_ptr_Function_v4float Function
 OpStore %result %65
-%66 = OpFunctionCall %void %func_vh4 %result
-%67 = OpLoad %v4float %result
-%69 = OpFOrdEqual %v4bool %67 %68
-%71 = OpAll %bool %69
-OpSelectionMerge %75 None
-OpBranchConditional %71 %73 %74
-%73 = OpLabel
-%76 = OpAccessChain %_ptr_Uniform_v4float %12 %int_0
-%80 = OpLoad %v4float %76
-OpStore %72 %80
-OpBranch %75
-%74 = OpLabel
-%81 = OpAccessChain %_ptr_Uniform_v4float %12 %int_1
-%83 = OpLoad %v4float %81
-OpStore %72 %83
-OpBranch %75
-%75 = OpLabel
-%84 = OpLoad %v4float %72
-OpReturnValue %84
+%66 = OpLoad %v4float %result
+OpStore %67 %66
+%68 = OpFunctionCall %void %func_vh4 %67
+%69 = OpLoad %v4float %67
+OpStore %result %69
+%70 = OpLoad %v4float %result
+%72 = OpFOrdEqual %v4bool %70 %71
+%74 = OpAll %bool %72
+OpSelectionMerge %78 None
+OpBranchConditional %74 %76 %77
+%76 = OpLabel
+%79 = OpAccessChain %_ptr_Uniform_v4float %12 %int_0
+%83 = OpLoad %v4float %79
+OpStore %75 %83
+OpBranch %78
+%77 = OpLabel
+%84 = OpAccessChain %_ptr_Uniform_v4float %12 %int_1
+%86 = OpLoad %v4float %84
+OpStore %75 %86
+OpBranch %78
+%78 = OpLabel
+%87 = OpLoad %v4float %75
+OpReturnValue %87
 OpFunctionEnd
diff --git a/tests/sksl/shared/StructsInFunctions.asm.frag b/tests/sksl/shared/StructsInFunctions.asm.frag
index 5e0f182..b44a116 100644
--- a/tests/sksl/shared/StructsInFunctions.asm.frag
+++ b/tests/sksl/shared/StructsInFunctions.asm.frag
@@ -49,37 +49,38 @@
 OpMemberDecorate %S 1 Offset 4
 OpDecorate %41 RelaxedPrecision
 OpDecorate %70 RelaxedPrecision
+OpDecorate %73 RelaxedPrecision
 OpMemberDecorate %Nested 0 Offset 0
 OpMemberDecorate %Nested 0 RelaxedPrecision
 OpMemberDecorate %Nested 1 Offset 16
 OpMemberDecorate %Nested 1 RelaxedPrecision
-OpDecorate %84 RelaxedPrecision
-OpDecorate %86 RelaxedPrecision
 OpDecorate %87 RelaxedPrecision
 OpDecorate %89 RelaxedPrecision
+OpDecorate %90 RelaxedPrecision
+OpDecorate %92 RelaxedPrecision
 OpMemberDecorate %Compound 0 Offset 0
 OpMemberDecorate %Compound 1 Offset 16
-OpDecorate %108 RelaxedPrecision
-OpDecorate %109 RelaxedPrecision
-OpDecorate %114 RelaxedPrecision
-OpDecorate %115 RelaxedPrecision
-OpDecorate %137 RelaxedPrecision
-OpDecorate %138 RelaxedPrecision
-OpDecorate %149 RelaxedPrecision
-OpDecorate %161 RelaxedPrecision
-OpDecorate %173 RelaxedPrecision
-OpDecorate %174 RelaxedPrecision
-OpDecorate %197 RelaxedPrecision
-OpDecorate %198 RelaxedPrecision
-OpDecorate %221 RelaxedPrecision
-OpDecorate %247 RelaxedPrecision
-OpDecorate %248 RelaxedPrecision
-OpDecorate %263 RelaxedPrecision
-OpDecorate %264 RelaxedPrecision
-OpDecorate %275 RelaxedPrecision
-OpDecorate %282 RelaxedPrecision
-OpDecorate %284 RelaxedPrecision
+OpDecorate %111 RelaxedPrecision
+OpDecorate %112 RelaxedPrecision
+OpDecorate %117 RelaxedPrecision
+OpDecorate %118 RelaxedPrecision
+OpDecorate %140 RelaxedPrecision
+OpDecorate %141 RelaxedPrecision
+OpDecorate %152 RelaxedPrecision
+OpDecorate %164 RelaxedPrecision
+OpDecorate %176 RelaxedPrecision
+OpDecorate %177 RelaxedPrecision
+OpDecorate %200 RelaxedPrecision
+OpDecorate %201 RelaxedPrecision
+OpDecorate %224 RelaxedPrecision
+OpDecorate %250 RelaxedPrecision
+OpDecorate %251 RelaxedPrecision
+OpDecorate %266 RelaxedPrecision
+OpDecorate %267 RelaxedPrecision
+OpDecorate %278 RelaxedPrecision
 OpDecorate %285 RelaxedPrecision
+OpDecorate %287 RelaxedPrecision
+OpDecorate %288 RelaxedPrecision
 %float = OpTypeFloat 32
 %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -118,11 +119,11 @@
 %_ptr_Function_Compound = OpTypePointer Function %Compound
 %float_3 = OpConstant %float 3
 %float_4 = OpConstant %float 4
-%99 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+%102 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
 %int_5 = OpConstant %int 5
 %int_6 = OpConstant %int 6
 %int_7 = OpConstant %int 7
-%103 = OpConstantComposite %v3int %int_5 %int_6 %int_7
+%106 = OpConstantComposite %v3int %int_5 %int_6 %int_7
 %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
 %_ptr_Function_bool = OpTypePointer Function %bool
 %false = OpConstantFalse %bool
@@ -182,253 +183,258 @@
 %s_0 = OpVariable %_ptr_Function_S Function
 %x = OpVariable %_ptr_Function_float Function
 %71 = OpVariable %_ptr_Function_S Function
+%74 = OpVariable %_ptr_Function_S Function
 %expected = OpVariable %_ptr_Function_S Function
 %n1 = OpVariable %_ptr_Function_Nested Function
 %n2 = OpVariable %_ptr_Function_Nested Function
 %n3 = OpVariable %_ptr_Function_Nested Function
-%90 = OpVariable %_ptr_Function_S Function
+%93 = OpVariable %_ptr_Function_S Function
 %c1 = OpVariable %_ptr_Function_Compound Function
 %c2 = OpVariable %_ptr_Function_Compound Function
 %c3 = OpVariable %_ptr_Function_Compound Function
 %valid = OpVariable %_ptr_Function_bool Function
-%276 = OpVariable %_ptr_Function_v4float Function
+%279 = OpVariable %_ptr_Function_v4float Function
 %68 = OpFunctionCall %S %returns_a_struct_S
 OpStore %s_0 %68
 %70 = OpLoad %S %s_0
 OpStore %71 %70
 %72 = OpFunctionCall %float %accepts_a_struct_fS %71
 OpStore %x %72
-%73 = OpFunctionCall %void %modifies_a_struct_vS %s_0
-%75 = OpFunctionCall %S %constructs_a_struct_S
-OpStore %expected %75
-%81 = OpFunctionCall %S %returns_a_struct_S
-%82 = OpAccessChain %_ptr_Function_S %n1 %int_0
-OpStore %82 %81
-%83 = OpAccessChain %_ptr_Function_S %n1 %int_0
-%84 = OpLoad %S %83
-%85 = OpAccessChain %_ptr_Function_S %n1 %int_1
+%73 = OpLoad %S %s_0
+OpStore %74 %73
+%75 = OpFunctionCall %void %modifies_a_struct_vS %74
+%76 = OpLoad %S %74
+OpStore %s_0 %76
+%78 = OpFunctionCall %S %constructs_a_struct_S
+OpStore %expected %78
+%84 = OpFunctionCall %S %returns_a_struct_S
+%85 = OpAccessChain %_ptr_Function_S %n1 %int_0
 OpStore %85 %84
-%86 = OpLoad %Nested %n1
-OpStore %n2 %86
-%87 = OpLoad %Nested %n2
-OpStore %n3 %87
-%88 = OpAccessChain %_ptr_Function_S %n3 %int_1
-%89 = OpLoad %S %88
-OpStore %90 %89
-%91 = OpFunctionCall %void %modifies_a_struct_vS %90
-%92 = OpLoad %S %90
-OpStore %88 %92
-%104 = OpCompositeConstruct %Compound %99 %103
-OpStore %c1 %104
-%106 = OpAccessChain %_ptr_Uniform_v4float %14 %int_1
-%108 = OpLoad %v4float %106
-%109 = OpCompositeExtract %float %108 1
-%110 = OpCompositeConstruct %v4float %109 %float_2 %float_3 %float_4
-%111 = OpCompositeConstruct %Compound %110 %103
-OpStore %c2 %111
-%113 = OpAccessChain %_ptr_Uniform_v4float %14 %int_1
-%114 = OpLoad %v4float %113
-%115 = OpCompositeExtract %float %114 0
-%116 = OpCompositeConstruct %v4float %115 %float_2 %float_3 %float_4
-%117 = OpCompositeConstruct %Compound %116 %103
-OpStore %c3 %117
-%121 = OpLoad %float %x
-%122 = OpFOrdEqual %bool %121 %float_3
-OpSelectionMerge %124 None
-OpBranchConditional %122 %123 %124
-%123 = OpLabel
-%125 = OpAccessChain %_ptr_Function_float %s_0 %int_0
-%126 = OpLoad %float %125
-%127 = OpFOrdEqual %bool %126 %float_2
-OpBranch %124
-%124 = OpLabel
-%128 = OpPhi %bool %false %66 %127 %123
-OpSelectionMerge %130 None
-OpBranchConditional %128 %129 %130
-%129 = OpLabel
-%131 = OpAccessChain %_ptr_Function_int %s_0 %int_1
-%132 = OpLoad %int %131
-%133 = OpIEqual %bool %132 %int_3
-OpBranch %130
-%130 = OpLabel
-%134 = OpPhi %bool %false %124 %133 %129
-OpSelectionMerge %136 None
-OpBranchConditional %134 %135 %136
-%135 = OpLabel
-%137 = OpLoad %S %s_0
-%138 = OpLoad %S %expected
-%139 = OpCompositeExtract %float %137 0
-%140 = OpCompositeExtract %float %138 0
-%141 = OpFOrdEqual %bool %139 %140
-%142 = OpCompositeExtract %int %137 1
-%143 = OpCompositeExtract %int %138 1
-%144 = OpIEqual %bool %142 %143
-%145 = OpLogicalAnd %bool %144 %141
-OpBranch %136
-%136 = OpLabel
-%146 = OpPhi %bool %false %130 %145 %135
-OpSelectionMerge %148 None
-OpBranchConditional %146 %147 %148
-%147 = OpLabel
-%149 = OpLoad %S %s_0
-%150 = OpCompositeConstruct %S %float_2 %int_3
-%151 = OpCompositeExtract %float %149 0
-%152 = OpCompositeExtract %float %150 0
-%153 = OpFOrdEqual %bool %151 %152
-%154 = OpCompositeExtract %int %149 1
-%155 = OpCompositeExtract %int %150 1
-%156 = OpIEqual %bool %154 %155
-%157 = OpLogicalAnd %bool %156 %153
-OpBranch %148
-%148 = OpLabel
-%158 = OpPhi %bool %false %136 %157 %147
-OpSelectionMerge %160 None
-OpBranchConditional %158 %159 %160
-%159 = OpLabel
-%161 = OpLoad %S %s_0
-%162 = OpFunctionCall %S %returns_a_struct_S
-%163 = OpCompositeExtract %float %161 0
-%164 = OpCompositeExtract %float %162 0
-%165 = OpFOrdNotEqual %bool %163 %164
-%166 = OpCompositeExtract %int %161 1
-%167 = OpCompositeExtract %int %162 1
-%168 = OpINotEqual %bool %166 %167
-%169 = OpLogicalOr %bool %168 %165
-OpBranch %160
-%160 = OpLabel
-%170 = OpPhi %bool %false %148 %169 %159
-OpSelectionMerge %172 None
-OpBranchConditional %170 %171 %172
-%171 = OpLabel
-%173 = OpLoad %Nested %n1
-%174 = OpLoad %Nested %n2
-%175 = OpCompositeExtract %S %173 0
-%176 = OpCompositeExtract %S %174 0
-%177 = OpCompositeExtract %float %175 0
-%178 = OpCompositeExtract %float %176 0
-%179 = OpFOrdEqual %bool %177 %178
-%180 = OpCompositeExtract %int %175 1
-%181 = OpCompositeExtract %int %176 1
-%182 = OpIEqual %bool %180 %181
-%183 = OpLogicalAnd %bool %182 %179
-%184 = OpCompositeExtract %S %173 1
-%185 = OpCompositeExtract %S %174 1
-%186 = OpCompositeExtract %float %184 0
-%187 = OpCompositeExtract %float %185 0
-%188 = OpFOrdEqual %bool %186 %187
-%189 = OpCompositeExtract %int %184 1
-%190 = OpCompositeExtract %int %185 1
-%191 = OpIEqual %bool %189 %190
-%192 = OpLogicalAnd %bool %191 %188
-%193 = OpLogicalAnd %bool %192 %183
-OpBranch %172
-%172 = OpLabel
-%194 = OpPhi %bool %false %160 %193 %171
-OpSelectionMerge %196 None
-OpBranchConditional %194 %195 %196
-%195 = OpLabel
-%197 = OpLoad %Nested %n1
-%198 = OpLoad %Nested %n3
-%199 = OpCompositeExtract %S %197 0
-%200 = OpCompositeExtract %S %198 0
-%201 = OpCompositeExtract %float %199 0
-%202 = OpCompositeExtract %float %200 0
-%203 = OpFOrdNotEqual %bool %201 %202
-%204 = OpCompositeExtract %int %199 1
-%205 = OpCompositeExtract %int %200 1
-%206 = OpINotEqual %bool %204 %205
-%207 = OpLogicalOr %bool %206 %203
-%208 = OpCompositeExtract %S %197 1
-%209 = OpCompositeExtract %S %198 1
-%210 = OpCompositeExtract %float %208 0
-%211 = OpCompositeExtract %float %209 0
-%212 = OpFOrdNotEqual %bool %210 %211
-%213 = OpCompositeExtract %int %208 1
-%214 = OpCompositeExtract %int %209 1
-%215 = OpINotEqual %bool %213 %214
-%216 = OpLogicalOr %bool %215 %212
-%217 = OpLogicalOr %bool %216 %207
-OpBranch %196
-%196 = OpLabel
-%218 = OpPhi %bool %false %172 %217 %195
-OpSelectionMerge %220 None
-OpBranchConditional %218 %219 %220
-%219 = OpLabel
-%221 = OpLoad %Nested %n3
-%222 = OpCompositeConstruct %S %float_1 %int_2
-%223 = OpCompositeConstruct %S %float_2 %int_3
-%224 = OpCompositeConstruct %Nested %222 %223
-%225 = OpCompositeExtract %S %221 0
-%226 = OpCompositeExtract %S %224 0
-%227 = OpCompositeExtract %float %225 0
-%228 = OpCompositeExtract %float %226 0
-%229 = OpFOrdEqual %bool %227 %228
-%230 = OpCompositeExtract %int %225 1
-%231 = OpCompositeExtract %int %226 1
-%232 = OpIEqual %bool %230 %231
-%233 = OpLogicalAnd %bool %232 %229
-%234 = OpCompositeExtract %S %221 1
-%235 = OpCompositeExtract %S %224 1
-%236 = OpCompositeExtract %float %234 0
-%237 = OpCompositeExtract %float %235 0
-%238 = OpFOrdEqual %bool %236 %237
-%239 = OpCompositeExtract %int %234 1
-%240 = OpCompositeExtract %int %235 1
-%241 = OpIEqual %bool %239 %240
-%242 = OpLogicalAnd %bool %241 %238
-%243 = OpLogicalAnd %bool %242 %233
-OpBranch %220
-%220 = OpLabel
-%244 = OpPhi %bool %false %196 %243 %219
-OpSelectionMerge %246 None
-OpBranchConditional %244 %245 %246
-%245 = OpLabel
-%247 = OpLoad %Compound %c1
-%248 = OpLoad %Compound %c2
-%249 = OpCompositeExtract %v4float %247 0
-%250 = OpCompositeExtract %v4float %248 0
-%251 = OpFOrdEqual %v4bool %249 %250
-%253 = OpAll %bool %251
-%254 = OpCompositeExtract %v3int %247 1
-%255 = OpCompositeExtract %v3int %248 1
-%256 = OpIEqual %v3bool %254 %255
-%258 = OpAll %bool %256
-%259 = OpLogicalAnd %bool %258 %253
-OpBranch %246
-%246 = OpLabel
-%260 = OpPhi %bool %false %220 %259 %245
-OpSelectionMerge %262 None
-OpBranchConditional %260 %261 %262
-%261 = OpLabel
-%263 = OpLoad %Compound %c2
-%264 = OpLoad %Compound %c3
-%265 = OpCompositeExtract %v4float %263 0
-%266 = OpCompositeExtract %v4float %264 0
-%267 = OpFOrdNotEqual %v4bool %265 %266
-%268 = OpAny %bool %267
-%269 = OpCompositeExtract %v3int %263 1
-%270 = OpCompositeExtract %v3int %264 1
-%271 = OpINotEqual %v3bool %269 %270
-%272 = OpAny %bool %271
-%273 = OpLogicalOr %bool %272 %268
-OpBranch %262
-%262 = OpLabel
-%274 = OpPhi %bool %false %246 %273 %261
-OpStore %valid %274
-%275 = OpLoad %bool %valid
-OpSelectionMerge %280 None
-OpBranchConditional %275 %278 %279
-%278 = OpLabel
-%281 = OpAccessChain %_ptr_Uniform_v4float %14 %int_1
-%282 = OpLoad %v4float %281
-OpStore %276 %282
-OpBranch %280
-%279 = OpLabel
-%283 = OpAccessChain %_ptr_Uniform_v4float %14 %int_0
-%284 = OpLoad %v4float %283
-OpStore %276 %284
-OpBranch %280
-%280 = OpLabel
-%285 = OpLoad %v4float %276
-OpReturnValue %285
+%86 = OpAccessChain %_ptr_Function_S %n1 %int_0
+%87 = OpLoad %S %86
+%88 = OpAccessChain %_ptr_Function_S %n1 %int_1
+OpStore %88 %87
+%89 = OpLoad %Nested %n1
+OpStore %n2 %89
+%90 = OpLoad %Nested %n2
+OpStore %n3 %90
+%91 = OpAccessChain %_ptr_Function_S %n3 %int_1
+%92 = OpLoad %S %91
+OpStore %93 %92
+%94 = OpFunctionCall %void %modifies_a_struct_vS %93
+%95 = OpLoad %S %93
+OpStore %91 %95
+%107 = OpCompositeConstruct %Compound %102 %106
+OpStore %c1 %107
+%109 = OpAccessChain %_ptr_Uniform_v4float %14 %int_1
+%111 = OpLoad %v4float %109
+%112 = OpCompositeExtract %float %111 1
+%113 = OpCompositeConstruct %v4float %112 %float_2 %float_3 %float_4
+%114 = OpCompositeConstruct %Compound %113 %106
+OpStore %c2 %114
+%116 = OpAccessChain %_ptr_Uniform_v4float %14 %int_1
+%117 = OpLoad %v4float %116
+%118 = OpCompositeExtract %float %117 0
+%119 = OpCompositeConstruct %v4float %118 %float_2 %float_3 %float_4
+%120 = OpCompositeConstruct %Compound %119 %106
+OpStore %c3 %120
+%124 = OpLoad %float %x
+%125 = OpFOrdEqual %bool %124 %float_3
+OpSelectionMerge %127 None
+OpBranchConditional %125 %126 %127
+%126 = OpLabel
+%128 = OpAccessChain %_ptr_Function_float %s_0 %int_0
+%129 = OpLoad %float %128
+%130 = OpFOrdEqual %bool %129 %float_2
+OpBranch %127
+%127 = OpLabel
+%131 = OpPhi %bool %false %66 %130 %126
+OpSelectionMerge %133 None
+OpBranchConditional %131 %132 %133
+%132 = OpLabel
+%134 = OpAccessChain %_ptr_Function_int %s_0 %int_1
+%135 = OpLoad %int %134
+%136 = OpIEqual %bool %135 %int_3
+OpBranch %133
+%133 = OpLabel
+%137 = OpPhi %bool %false %127 %136 %132
+OpSelectionMerge %139 None
+OpBranchConditional %137 %138 %139
+%138 = OpLabel
+%140 = OpLoad %S %s_0
+%141 = OpLoad %S %expected
+%142 = OpCompositeExtract %float %140 0
+%143 = OpCompositeExtract %float %141 0
+%144 = OpFOrdEqual %bool %142 %143
+%145 = OpCompositeExtract %int %140 1
+%146 = OpCompositeExtract %int %141 1
+%147 = OpIEqual %bool %145 %146
+%148 = OpLogicalAnd %bool %147 %144
+OpBranch %139
+%139 = OpLabel
+%149 = OpPhi %bool %false %133 %148 %138
+OpSelectionMerge %151 None
+OpBranchConditional %149 %150 %151
+%150 = OpLabel
+%152 = OpLoad %S %s_0
+%153 = OpCompositeConstruct %S %float_2 %int_3
+%154 = OpCompositeExtract %float %152 0
+%155 = OpCompositeExtract %float %153 0
+%156 = OpFOrdEqual %bool %154 %155
+%157 = OpCompositeExtract %int %152 1
+%158 = OpCompositeExtract %int %153 1
+%159 = OpIEqual %bool %157 %158
+%160 = OpLogicalAnd %bool %159 %156
+OpBranch %151
+%151 = OpLabel
+%161 = OpPhi %bool %false %139 %160 %150
+OpSelectionMerge %163 None
+OpBranchConditional %161 %162 %163
+%162 = OpLabel
+%164 = OpLoad %S %s_0
+%165 = OpFunctionCall %S %returns_a_struct_S
+%166 = OpCompositeExtract %float %164 0
+%167 = OpCompositeExtract %float %165 0
+%168 = OpFOrdNotEqual %bool %166 %167
+%169 = OpCompositeExtract %int %164 1
+%170 = OpCompositeExtract %int %165 1
+%171 = OpINotEqual %bool %169 %170
+%172 = OpLogicalOr %bool %171 %168
+OpBranch %163
+%163 = OpLabel
+%173 = OpPhi %bool %false %151 %172 %162
+OpSelectionMerge %175 None
+OpBranchConditional %173 %174 %175
+%174 = OpLabel
+%176 = OpLoad %Nested %n1
+%177 = OpLoad %Nested %n2
+%178 = OpCompositeExtract %S %176 0
+%179 = OpCompositeExtract %S %177 0
+%180 = OpCompositeExtract %float %178 0
+%181 = OpCompositeExtract %float %179 0
+%182 = OpFOrdEqual %bool %180 %181
+%183 = OpCompositeExtract %int %178 1
+%184 = OpCompositeExtract %int %179 1
+%185 = OpIEqual %bool %183 %184
+%186 = OpLogicalAnd %bool %185 %182
+%187 = OpCompositeExtract %S %176 1
+%188 = OpCompositeExtract %S %177 1
+%189 = OpCompositeExtract %float %187 0
+%190 = OpCompositeExtract %float %188 0
+%191 = OpFOrdEqual %bool %189 %190
+%192 = OpCompositeExtract %int %187 1
+%193 = OpCompositeExtract %int %188 1
+%194 = OpIEqual %bool %192 %193
+%195 = OpLogicalAnd %bool %194 %191
+%196 = OpLogicalAnd %bool %195 %186
+OpBranch %175
+%175 = OpLabel
+%197 = OpPhi %bool %false %163 %196 %174
+OpSelectionMerge %199 None
+OpBranchConditional %197 %198 %199
+%198 = OpLabel
+%200 = OpLoad %Nested %n1
+%201 = OpLoad %Nested %n3
+%202 = OpCompositeExtract %S %200 0
+%203 = OpCompositeExtract %S %201 0
+%204 = OpCompositeExtract %float %202 0
+%205 = OpCompositeExtract %float %203 0
+%206 = OpFOrdNotEqual %bool %204 %205
+%207 = OpCompositeExtract %int %202 1
+%208 = OpCompositeExtract %int %203 1
+%209 = OpINotEqual %bool %207 %208
+%210 = OpLogicalOr %bool %209 %206
+%211 = OpCompositeExtract %S %200 1
+%212 = OpCompositeExtract %S %201 1
+%213 = OpCompositeExtract %float %211 0
+%214 = OpCompositeExtract %float %212 0
+%215 = OpFOrdNotEqual %bool %213 %214
+%216 = OpCompositeExtract %int %211 1
+%217 = OpCompositeExtract %int %212 1
+%218 = OpINotEqual %bool %216 %217
+%219 = OpLogicalOr %bool %218 %215
+%220 = OpLogicalOr %bool %219 %210
+OpBranch %199
+%199 = OpLabel
+%221 = OpPhi %bool %false %175 %220 %198
+OpSelectionMerge %223 None
+OpBranchConditional %221 %222 %223
+%222 = OpLabel
+%224 = OpLoad %Nested %n3
+%225 = OpCompositeConstruct %S %float_1 %int_2
+%226 = OpCompositeConstruct %S %float_2 %int_3
+%227 = OpCompositeConstruct %Nested %225 %226
+%228 = OpCompositeExtract %S %224 0
+%229 = OpCompositeExtract %S %227 0
+%230 = OpCompositeExtract %float %228 0
+%231 = OpCompositeExtract %float %229 0
+%232 = OpFOrdEqual %bool %230 %231
+%233 = OpCompositeExtract %int %228 1
+%234 = OpCompositeExtract %int %229 1
+%235 = OpIEqual %bool %233 %234
+%236 = OpLogicalAnd %bool %235 %232
+%237 = OpCompositeExtract %S %224 1
+%238 = OpCompositeExtract %S %227 1
+%239 = OpCompositeExtract %float %237 0
+%240 = OpCompositeExtract %float %238 0
+%241 = OpFOrdEqual %bool %239 %240
+%242 = OpCompositeExtract %int %237 1
+%243 = OpCompositeExtract %int %238 1
+%244 = OpIEqual %bool %242 %243
+%245 = OpLogicalAnd %bool %244 %241
+%246 = OpLogicalAnd %bool %245 %236
+OpBranch %223
+%223 = OpLabel
+%247 = OpPhi %bool %false %199 %246 %222
+OpSelectionMerge %249 None
+OpBranchConditional %247 %248 %249
+%248 = OpLabel
+%250 = OpLoad %Compound %c1
+%251 = OpLoad %Compound %c2
+%252 = OpCompositeExtract %v4float %250 0
+%253 = OpCompositeExtract %v4float %251 0
+%254 = OpFOrdEqual %v4bool %252 %253
+%256 = OpAll %bool %254
+%257 = OpCompositeExtract %v3int %250 1
+%258 = OpCompositeExtract %v3int %251 1
+%259 = OpIEqual %v3bool %257 %258
+%261 = OpAll %bool %259
+%262 = OpLogicalAnd %bool %261 %256
+OpBranch %249
+%249 = OpLabel
+%263 = OpPhi %bool %false %223 %262 %248
+OpSelectionMerge %265 None
+OpBranchConditional %263 %264 %265
+%264 = OpLabel
+%266 = OpLoad %Compound %c2
+%267 = OpLoad %Compound %c3
+%268 = OpCompositeExtract %v4float %266 0
+%269 = OpCompositeExtract %v4float %267 0
+%270 = OpFOrdNotEqual %v4bool %268 %269
+%271 = OpAny %bool %270
+%272 = OpCompositeExtract %v3int %266 1
+%273 = OpCompositeExtract %v3int %267 1
+%274 = OpINotEqual %v3bool %272 %273
+%275 = OpAny %bool %274
+%276 = OpLogicalOr %bool %275 %271
+OpBranch %265
+%265 = OpLabel
+%277 = OpPhi %bool %false %249 %276 %264
+OpStore %valid %277
+%278 = OpLoad %bool %valid
+OpSelectionMerge %283 None
+OpBranchConditional %278 %281 %282
+%281 = OpLabel
+%284 = OpAccessChain %_ptr_Uniform_v4float %14 %int_1
+%285 = OpLoad %v4float %284
+OpStore %279 %285
+OpBranch %283
+%282 = OpLabel
+%286 = OpAccessChain %_ptr_Uniform_v4float %14 %int_0
+%287 = OpLoad %v4float %286
+OpStore %279 %287
+OpBranch %283
+%283 = OpLabel
+%288 = OpLoad %v4float %279
+OpReturnValue %288
 OpFunctionEnd