tint/msl: Fix emission of private variables

In order to avoid declaring too many function parameters, we
previously modified this transform to redeclare private variables that
are only used inside a single function as function-scope
variables. This was broken as it meant that their values did not
persist across multiple calls to the same function.

Instead, wrap all private variables in a structure and pass it around
as a pointer.

Fixed: tint:1875
Change-Id: I83f5eb1071d57b9c6af56d6cf21b3a32c6e94260
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/124800
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/transform/module_scope_var_to_entry_point_param.cc b/src/tint/transform/module_scope_var_to_entry_point_param.cc
index 044133c..e82b1bd 100644
--- a/src/tint/transform/module_scope_var_to_entry_point_param.cc
+++ b/src/tint/transform/module_scope_var_to_entry_point_param.cc
@@ -33,7 +33,7 @@
 namespace tint::transform {
 namespace {
 
-using WorkgroupParameterMemberList = utils::Vector<const ast::StructMember*, 8>;
+using StructMemberList = utils::Vector<const ast::StructMember*, 8>;
 
 // The name of the struct member for arrays that are wrapped in structures.
 const char* kWrappedArrayMemberName = "arr";
@@ -114,7 +114,7 @@
                                      const sem::Variable* var,
                                      Symbol new_var_symbol,
                                      std::function<Symbol()> workgroup_param,
-                                     WorkgroupParameterMemberList& workgroup_parameter_members,
+                                     StructMemberList& workgroup_parameter_members,
                                      bool& is_pointer,
                                      bool& is_wrapped) {
         auto* ty = var->Type()->UnwrapRef();
@@ -188,21 +188,14 @@
                         member_ptr);
                     ctx.InsertFront(func->body->statements, ctx.dst->Decl(local_var));
                     is_pointer = true;
-
-                    break;
+                } else {
+                    auto* disable_validation =
+                        ctx.dst->Disable(ast::DisabledValidation::kIgnoreAddressSpace);
+                    auto* initializer = ctx.Clone(var->Declaration()->initializer);
+                    auto* local_var = ctx.dst->Var(new_var_symbol, store_type(), sc, initializer,
+                                                   utils::Vector{disable_validation});
+                    ctx.InsertFront(func->body->statements, ctx.dst->Decl(local_var));
                 }
-                [[fallthrough]];
-            }
-            case builtin::AddressSpace::kPrivate: {
-                // Variables in the Private and Workgroup address spaces are redeclared at function
-                // scope. Disable address space validation on this variable.
-                auto* disable_validation =
-                    ctx.dst->Disable(ast::DisabledValidation::kIgnoreAddressSpace);
-                auto* initializer = ctx.Clone(var->Declaration()->initializer);
-                auto* local_var = ctx.dst->Var(new_var_symbol, store_type(), sc, initializer,
-                                               utils::Vector{disable_validation});
-                ctx.InsertFront(func->body->statements, ctx.dst->Decl(local_var));
-
                 break;
             }
             case builtin::AddressSpace::kPushConstant: {
@@ -234,6 +227,8 @@
         auto sc = var->AddressSpace();
         switch (sc) {
             case builtin::AddressSpace::kPrivate:
+                // Private variables are passed all together in a struct.
+                return;
             case builtin::AddressSpace::kStorage:
             case builtin::AddressSpace::kUniform:
             case builtin::AddressSpace::kHandle:
@@ -275,12 +270,12 @@
     /// @param var the variable to replace
     /// @param new_var the symbol to use for replacement
     /// @param is_pointer true if `new_var` is a pointer to the new variable
-    /// @param is_wrapped true if `new_var` is an array wrapped in a structure
+    /// @param member_name if valid, the name of the struct member that holds this variable
     void ReplaceUsesInFunction(const ast::Function* func,
                                const sem::Variable* var,
                                Symbol new_var,
                                bool is_pointer,
-                               bool is_wrapped) {
+                               Symbol member_name) {
         for (auto* user : var->Users()) {
             if (user->Stmt()->Function()->Declaration() == func) {
                 const ast::Expression* expr = ctx.dst->Expr(new_var);
@@ -288,16 +283,16 @@
                     // If this identifier is used by an address-of operator, just remove the
                     // address-of instead of adding a deref, since we already have a pointer.
                     auto* ident = user->Declaration()->As<ast::IdentifierExpression>();
-                    if (ident_to_address_of_.count(ident)) {
+                    if (ident_to_address_of_.count(ident) && !member_name.IsValid()) {
                         ctx.Replace(ident_to_address_of_[ident], expr);
                         continue;
                     }
 
                     expr = ctx.dst->Deref(expr);
                 }
-                if (is_wrapped) {
-                    // Get the member from the wrapper structure.
-                    expr = ctx.dst->MemberAccessor(expr, kWrappedArrayMemberName);
+                if (member_name.IsValid()) {
+                    // Get the member from the containing structure.
+                    expr = ctx.dst->MemberAccessor(expr, member_name);
                 }
                 ctx.Replace(user->Declaration(), expr);
             }
@@ -312,8 +307,34 @@
 
         utils::Vector<const ast::Function*, 8> functions_to_process;
 
+        // Collect private variables into a single structure.
+        StructMemberList private_struct_members;
+        utils::Vector<std::function<const ast::AssignmentStatement*()>, 4> private_initializers;
+        std::unordered_set<const ast::Function*> uses_privates;
+
         // Build a list of functions that transitively reference any module-scope variables.
         for (auto* decl : ctx.src->Sem().Module()->DependencyOrderedDeclarations()) {
+            if (auto* var = decl->As<ast::Var>()) {
+                auto* sem_var = ctx.src->Sem().Get(var);
+                if (sem_var->AddressSpace() == builtin::AddressSpace::kPrivate) {
+                    // Create a member in the private variable struct.
+                    auto* ty = sem_var->Type()->UnwrapRef();
+                    auto name = ctx.Clone(var->name->symbol);
+                    private_struct_members.Push(ctx.dst->Member(name, CreateASTTypeFor(ctx, ty)));
+                    CloneStructTypes(ty);
+
+                    // Create a statement to assign the initializer if present.
+                    if (var->initializer) {
+                        private_initializers.Push([&, name, var]() {
+                            return ctx.dst->Assign(
+                                ctx.dst->MemberAccessor(PrivateStructVariableName(), name),
+                                ctx.Clone(var->initializer));
+                        });
+                    }
+                }
+                continue;
+            }
+
             auto* func_ast = decl->As<ast::Function>();
             if (!func_ast) {
                 continue;
@@ -324,8 +345,10 @@
             bool needs_processing = false;
             for (auto* var : func_sem->TransitivelyReferencedGlobals()) {
                 if (var->AddressSpace() != builtin::AddressSpace::kUndefined) {
+                    if (var->AddressSpace() == builtin::AddressSpace::kPrivate) {
+                        uses_privates.insert(func_ast);
+                    }
                     needs_processing = true;
-                    break;
                 }
             }
             if (needs_processing) {
@@ -339,6 +362,14 @@
             }
         }
 
+        if (!private_struct_members.IsEmpty()) {
+            // Create the private variable struct.
+            ctx.dst->Structure(PrivateStructName(), std::move(private_struct_members));
+            // Passing a pointer to a private variable will now involve passing a pointer to the
+            // member of a structure, so enable the extension that allows this.
+            ctx.dst->Enable(builtin::Extension::kChromiumExperimentalFullPtrParameters);
+        }
+
         // Build a list of `&ident` expressions. We'll use this later to avoid generating
         // expressions of the form `&*ident`, which break WGSL validation rules when this expression
         // is passed to a function.
@@ -370,7 +401,7 @@
             // We aggregate all workgroup variables into a struct to avoid hitting MSL's limit for
             // threadgroup memory arguments.
             Symbol workgroup_parameter_symbol;
-            WorkgroupParameterMemberList workgroup_parameter_members;
+            StructMemberList workgroup_parameter_members;
             auto workgroup_param = [&]() {
                 if (!workgroup_parameter_symbol.IsValid()) {
                     workgroup_parameter_symbol = ctx.dst->Sym();
@@ -378,12 +409,43 @@
                 return workgroup_parameter_symbol;
             };
 
+            // If this function references any private variables, it needs to take the private
+            // variable struct as a parameter (or declare it, if it is an entry point function).
+            if (uses_privates.count(func_ast)) {
+                if (is_entry_point) {
+                    // Create a local declaration for the private variable struct.
+                    auto* var = ctx.dst->Var(
+                        PrivateStructVariableName(), ctx.dst->ty(PrivateStructName()),
+                        builtin::AddressSpace::kPrivate,
+                        utils::Vector{
+                            ctx.dst->Disable(ast::DisabledValidation::kIgnoreAddressSpace),
+                        });
+                    ctx.InsertFront(func_ast->body->statements, ctx.dst->Decl(var));
+
+                    // Initialize the members of that struct with the original initializers.
+                    for (auto init : private_initializers) {
+                        ctx.InsertFront(func_ast->body->statements, init());
+                    }
+                } else {
+                    // Create a parameter that is a pointer to the private variable struct.
+                    auto ptr = ctx.dst->ty.pointer(ctx.dst->ty(PrivateStructName()),
+                                                   builtin::AddressSpace::kPrivate);
+                    auto* param = ctx.dst->Param(PrivateStructVariableName(), ptr);
+                    ctx.InsertBack(func_ast->params, param);
+                }
+            }
+
             // Process and redeclare all variables referenced by the function.
             for (auto* var : func_sem->TransitivelyReferencedGlobals()) {
                 if (var->AddressSpace() == builtin::AddressSpace::kUndefined) {
                     continue;
                 }
-                if (local_private_vars_.count(var)) {
+                if (var->AddressSpace() == builtin::AddressSpace::kPrivate) {
+                    // Private variable are collected into a single struct that is passed by
+                    // pointer (handled above), so we just need to replace the uses here.
+                    ReplaceUsesInFunction(func_ast, var, PrivateStructVariableName(),
+                                          /* is_pointer */ !is_entry_point,
+                                          ctx.Clone(var->Declaration()->name->symbol));
                     continue;
                 }
 
@@ -396,49 +458,25 @@
                 // Track whether the new variable was wrapped in a struct or not.
                 bool is_wrapped = false;
 
-                // Check if this is a private variable that is only referenced by this function.
-                bool local_private = false;
-                if (var->AddressSpace() == builtin::AddressSpace::kPrivate) {
-                    local_private = true;
-                    for (auto* user : var->Users()) {
-                        auto* stmt = user->Stmt();
-                        if (!stmt || stmt->Function() != func_sem) {
-                            local_private = false;
-                            break;
-                        }
-                    }
-                }
-
-                if (local_private) {
-                    // Redeclare the variable at function scope.
-                    auto* disable_validation =
-                        ctx.dst->Disable(ast::DisabledValidation::kIgnoreAddressSpace);
-                    auto* initializer = ctx.Clone(var->Declaration()->initializer);
-                    auto* local_var = ctx.dst->Var(new_var_symbol,
-                                                   CreateASTTypeFor(ctx, var->Type()->UnwrapRef()),
-                                                   builtin::AddressSpace::kPrivate, initializer,
-                                                   utils::Vector{disable_validation});
-                    ctx.InsertFront(func_ast->body->statements, ctx.dst->Decl(local_var));
-                    local_private_vars_.insert(var);
+                // Process the variable to redeclare it as a parameter or local variable.
+                if (is_entry_point) {
+                    ProcessVariableInEntryPoint(func_ast, var, new_var_symbol, workgroup_param,
+                                                workgroup_parameter_members, is_pointer,
+                                                is_wrapped);
                 } else {
-                    // Process the variable to redeclare it as a parameter or local variable.
-                    if (is_entry_point) {
-                        ProcessVariableInEntryPoint(func_ast, var, new_var_symbol, workgroup_param,
-                                                    workgroup_parameter_members, is_pointer,
-                                                    is_wrapped);
-                    } else {
-                        ProcessVariableInUserFunction(func_ast, var, new_var_symbol, is_pointer);
-                        if (var->AddressSpace() == builtin::AddressSpace::kWorkgroup) {
-                            needs_pointer_aliasing = true;
-                        }
+                    ProcessVariableInUserFunction(func_ast, var, new_var_symbol, is_pointer);
+                    if (var->AddressSpace() == builtin::AddressSpace::kWorkgroup) {
+                        needs_pointer_aliasing = true;
                     }
-
-                    // Record the replacement symbol.
-                    var_to_newvar[var] = {new_var_symbol, is_pointer, is_wrapped};
                 }
 
+                // Record the replacement symbol.
+                var_to_newvar[var] = {new_var_symbol, is_pointer, is_wrapped};
+
                 // Replace all uses of the module-scope variable.
-                ReplaceUsesInFunction(func_ast, var, new_var_symbol, is_pointer, is_wrapped);
+                ReplaceUsesInFunction(
+                    func_ast, var, new_var_symbol, is_pointer,
+                    is_wrapped ? ctx.dst->Sym(kWrappedArrayMemberName) : Symbol());
             }
 
             // Allow pointer aliasing if needed.
@@ -468,6 +506,15 @@
                 auto* call_sem = ctx.src->Sem().Get(call)->Unwrap()->As<sem::Call>();
                 auto* target_sem = call_sem->Target()->As<sem::Function>();
 
+                // Pass the private variable struct pointer if needed.
+                if (uses_privates.count(target_sem->Declaration())) {
+                    const ast::Expression* arg = ctx.dst->Expr(PrivateStructVariableName());
+                    if (is_entry_point) {
+                        arg = ctx.dst->AddressOf(arg);
+                    }
+                    ctx.InsertBack(call->args, arg);
+                }
+
                 // Add new arguments for any variables that are needed by the callee.
                 // For entry points, pass non-handle types as pointers.
                 for (auto* target_var : target_sem->TransitivelyReferencedGlobals()) {
@@ -509,16 +556,35 @@
         }
     }
 
+    /// @returns the name of the structure that contains all of the module-scope private variables
+    Symbol PrivateStructName() {
+        if (!private_struct_name.IsValid()) {
+            private_struct_name = ctx.dst->Symbols().New("tint_private_vars_struct");
+        }
+        return private_struct_name;
+    }
+
+    /// @returns the name of the variable that contains all of the module-scope private variables
+    Symbol PrivateStructVariableName() {
+        if (!private_struct_variable_name.IsValid()) {
+            private_struct_variable_name = ctx.dst->Symbols().New("tint_private_vars");
+        }
+        return private_struct_variable_name;
+    }
+
   private:
     // The structures that have already been cloned by this transform.
     std::unordered_set<const sem::Struct*> cloned_structs_;
 
-    // Set of a private variables that are local to a single function.
-    std::unordered_set<const sem::Variable*> local_private_vars_;
-
     // Map from identifier expression to the address-of expression that uses it.
     std::unordered_map<const ast::IdentifierExpression*, const ast::UnaryOpExpression*>
         ident_to_address_of_;
+
+    // The name of the structure that contains all the module-scope private variables.
+    Symbol private_struct_name;
+
+    // The name of the structure variable that contains all the module-scope private variables.
+    Symbol private_struct_variable_name;
 };
 
 ModuleScopeVarToEntryPointParam::ModuleScopeVarToEntryPointParam() = default;
diff --git a/src/tint/transform/module_scope_var_to_entry_point_param_test.cc b/src/tint/transform/module_scope_var_to_entry_point_param_test.cc
index a9aaa28..5991a1a 100644
--- a/src/tint/transform/module_scope_var_to_entry_point_param_test.cc
+++ b/src/tint/transform/module_scope_var_to_entry_point_param_test.cc
@@ -49,11 +49,17 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  p : f32,
+}
+
 @compute @workgroup_size(1)
 fn main() {
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
   @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol : f32;
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol_1 : f32;
-  tint_symbol = tint_symbol_1;
+  tint_symbol = tint_private_vars.p;
 }
 )";
 
@@ -74,11 +80,17 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  p : f32,
+}
+
 @compute @workgroup_size(1)
 fn main() {
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
   @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol : f32;
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol_1 : f32;
-  tint_symbol = tint_symbol_1;
+  tint_symbol = tint_private_vars.p;
 }
 )";
 
@@ -118,32 +130,38 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  p : f32,
+}
+
 fn no_uses() {
 }
 
-fn zoo(@internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<private, f32>) {
-  *(tint_symbol) = (*(tint_symbol) * 2.0);
+fn zoo(tint_private_vars : ptr<private, tint_private_vars_struct>) {
+  (*(tint_private_vars)).p = ((*(tint_private_vars)).p * 2.0);
 }
 
 @internal(disable_validation__ignore_pointer_aliasing)
-fn bar(a : f32, b : f32, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_1 : ptr<private, f32>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_2 : ptr<workgroup, f32>) {
-  *(tint_symbol_1) = a;
-  *(tint_symbol_2) = b;
-  zoo(tint_symbol_1);
+fn bar(a : f32, b : f32, tint_private_vars : ptr<private, tint_private_vars_struct>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<workgroup, f32>) {
+  (*(tint_private_vars)).p = a;
+  *(tint_symbol) = b;
+  zoo(tint_private_vars);
 }
 
 @internal(disable_validation__ignore_pointer_aliasing)
-fn foo(a : f32, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_3 : ptr<private, f32>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_4 : ptr<workgroup, f32>) {
+fn foo(a : f32, tint_private_vars : ptr<private, tint_private_vars_struct>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_1 : ptr<workgroup, f32>) {
   let b : f32 = 2.0;
-  bar(a, b, tint_symbol_3, tint_symbol_4);
+  bar(a, b, tint_private_vars, tint_symbol_1);
   no_uses();
 }
 
 @compute @workgroup_size(1)
 fn main() {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol_5 : f32;
-  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol_6 : f32;
-  foo(1.0, &(tint_symbol_5), &(tint_symbol_6));
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol_2 : f32;
+  foo(1.0, &(tint_private_vars), &(tint_symbol_2));
 }
 )";
 
@@ -183,17 +201,23 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  p : f32,
+}
+
 @compute @workgroup_size(1)
 fn main() {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol_5 : f32;
-  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol_6 : f32;
-  foo(1.0, &(tint_symbol_5), &(tint_symbol_6));
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol_2 : f32;
+  foo(1.0, &(tint_private_vars), &(tint_symbol_2));
 }
 
 @internal(disable_validation__ignore_pointer_aliasing)
-fn foo(a : f32, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_3 : ptr<private, f32>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_4 : ptr<workgroup, f32>) {
+fn foo(a : f32, tint_private_vars : ptr<private, tint_private_vars_struct>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_1 : ptr<workgroup, f32>) {
   let b : f32 = 2.0;
-  bar(a, b, tint_symbol_3, tint_symbol_4);
+  bar(a, b, tint_private_vars, tint_symbol_1);
   no_uses();
 }
 
@@ -201,14 +225,14 @@
 }
 
 @internal(disable_validation__ignore_pointer_aliasing)
-fn bar(a : f32, b : f32, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_1 : ptr<private, f32>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_2 : ptr<workgroup, f32>) {
-  *(tint_symbol_1) = a;
-  *(tint_symbol_2) = b;
-  zoo(tint_symbol_1);
+fn bar(a : f32, b : f32, tint_private_vars : ptr<private, tint_private_vars_struct>, @internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<workgroup, f32>) {
+  (*(tint_private_vars)).p = a;
+  *(tint_symbol) = b;
+  zoo(tint_private_vars);
 }
 
-fn zoo(@internal(disable_validation__ignore_address_space) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<private, f32>) {
-  *(tint_symbol) = (*(tint_symbol) * 2.0);
+fn zoo(tint_private_vars : ptr<private, tint_private_vars_struct>) {
+  (*(tint_private_vars)).p = ((*(tint_private_vars)).p * 2.0);
 }
 )";
 
@@ -229,11 +253,19 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  a : f32,
+  b : f32,
+}
+
 @compute @workgroup_size(1)
 fn main() {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol : f32 = 1.0;
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol_1 : f32 = f32();
-  let x : f32 = (tint_symbol + tint_symbol_1);
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  tint_private_vars.a = 1.0;
+  tint_private_vars.b = f32();
+  let x : f32 = (tint_private_vars.a + tint_private_vars.b);
 }
 )";
 
@@ -254,11 +286,19 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  a : f32,
+  b : f32,
+}
+
 @compute @workgroup_size(1)
 fn main() {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol : f32 = 1.0;
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol_1 : f32 = f32();
-  let x : f32 = (tint_symbol + tint_symbol_1);
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  tint_private_vars.a = 1.0;
+  tint_private_vars.b = f32();
+  let x : f32 = (tint_private_vars.a + tint_private_vars.b);
 }
 )";
 
@@ -282,12 +322,18 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  p : f32,
+}
+
 @compute @workgroup_size(1)
 fn main() {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol : f32;
-  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol_1 : f32;
-  let p_ptr : ptr<private, f32> = &(tint_symbol);
-  let w_ptr : ptr<workgroup, f32> = &(tint_symbol_1);
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol : f32;
+  let p_ptr : ptr<private, f32> = &(tint_private_vars.p);
+  let w_ptr : ptr<workgroup, f32> = &(tint_symbol);
   let x : f32 = (*(p_ptr) + *(w_ptr));
   *(p_ptr) = x;
 }
@@ -313,12 +359,18 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  p : f32,
+}
+
 @compute @workgroup_size(1)
 fn main() {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol : f32;
-  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol_1 : f32;
-  let p_ptr : ptr<private, f32> = &(tint_symbol);
-  let w_ptr : ptr<workgroup, f32> = &(tint_symbol_1);
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  @internal(disable_validation__ignore_address_space) var<workgroup> tint_symbol : f32;
+  let p_ptr : ptr<private, f32> = &(tint_private_vars.p);
+  let w_ptr : ptr<workgroup, f32> = &(tint_symbol);
   let x : f32 = (*(p_ptr) + *(w_ptr));
   *(p_ptr) = x;
 }
@@ -1151,6 +1203,7 @@
 
 var<private> p : f32;
 var<workgroup> w : f32;
+var<private> p_with_init : f32 = 42;
 
 @group(0) @binding(0)
 var<uniform> ub : S;
@@ -1166,6 +1219,13 @@
 )";
 
     auto* expect = R"(
+enable chromium_experimental_full_ptr_parameters;
+
+struct tint_private_vars_struct {
+  p : f32,
+  p_with_init : f32,
+}
+
 struct S {
   a : f32,
 }
@@ -1180,16 +1240,22 @@
     EXPECT_EQ(expect, str(got));
 }
 
-// Test that a private variable that is only referenced by a single user-defined function is
-// promoted to a function scope variable, rather than passed as a parameter.
-TEST_F(ModuleScopeVarToEntryPointParamTest, PromotePrivateToFunctionScope) {
+TEST_F(ModuleScopeVarToEntryPointParamTest, MultiplePrivateVariables) {
     auto* src = R"(
-var<private> p : f32;
+struct S {
+  a : f32,
+  b : f32,
+  c : f32,
+}
 
-fn foo(a : f32) -> f32 {
-  let x = p;
-  p = x * a;
-  return p;
+var<private> a : f32;
+var<private> b : f32 = 42;
+var<private> c : S = S(1, 2, 3);
+var<private> d : S;
+var<private> unused : f32;
+
+fn foo(x : f32) -> f32 {
+  return (a + b + c.a + d.c) * x;
 }
 
 @compute @workgroup_size(1)
@@ -1199,16 +1265,32 @@
 )";
 
     auto* expect = R"(
-fn foo(a : f32) -> f32 {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol : f32;
-  let x = tint_symbol;
-  tint_symbol = (x * a);
-  return tint_symbol;
+enable chromium_experimental_full_ptr_parameters;
+
+struct S {
+  a : f32,
+  b : f32,
+  c : f32,
+}
+
+struct tint_private_vars_struct {
+  a : f32,
+  b : f32,
+  c : S,
+  d : S,
+  unused : f32,
+}
+
+fn foo(x : f32, tint_private_vars : ptr<private, tint_private_vars_struct>) -> f32 {
+  return (((((*(tint_private_vars)).a + (*(tint_private_vars)).b) + (*(tint_private_vars)).c.a) + (*(tint_private_vars)).d.c) * x);
 }
 
 @compute @workgroup_size(1)
 fn main() {
-  _ = foo(1.0);
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  tint_private_vars.b = 42;
+  tint_private_vars.c = S(1, 2, 3);
+  _ = foo(1.0, &(tint_private_vars));
 }
 )";
 
@@ -1217,36 +1299,59 @@
     EXPECT_EQ(expect, str(got));
 }
 
-// Test that a private variable that is only referenced by a single user-defined function is
-// promoted to a function scope variable, rather than passed as a parameter.
-TEST_F(ModuleScopeVarToEntryPointParamTest, PromotePrivateToFunctionScope_OutOfOrder) {
+TEST_F(ModuleScopeVarToEntryPointParamTest, MultiplePrivateVariables_OutOfOrder) {
     auto* src = R"(
-var<private> p : f32;
+var<private> a : f32;
+var<private> c : S = S(1, 2, 3);
+var<private> unused : f32;
 
 @compute @workgroup_size(1)
 fn main() {
   _ = foo(1.0);
 }
 
-fn foo(a : f32) -> f32 {
-  let x = p;
-  p = x * a;
-  return p;
+fn foo(x : f32) -> f32 {
+  return (a + b + c.a + d.c) * x;
 }
 
+var<private> b : f32 = 42;
+
+struct S {
+  a : f32,
+  b : f32,
+  c : f32,
+}
+
+var<private> d : S;
 )";
 
     auto* expect = R"(
-@compute @workgroup_size(1)
-fn main() {
-  _ = foo(1.0);
+enable chromium_experimental_full_ptr_parameters;
+
+struct S {
+  a : f32,
+  b : f32,
+  c : f32,
 }
 
-fn foo(a : f32) -> f32 {
-  @internal(disable_validation__ignore_address_space) var<private> tint_symbol : f32;
-  let x = tint_symbol;
-  tint_symbol = (x * a);
-  return tint_symbol;
+struct tint_private_vars_struct {
+  a : f32,
+  c : S,
+  unused : f32,
+  b : f32,
+  d : S,
+}
+
+@compute @workgroup_size(1)
+fn main() {
+  @internal(disable_validation__ignore_address_space) var<private> tint_private_vars : tint_private_vars_struct;
+  tint_private_vars.c = S(1, 2, 3);
+  tint_private_vars.b = 42;
+  _ = foo(1.0, &(tint_private_vars));
+}
+
+fn foo(x : f32, tint_private_vars : ptr<private, tint_private_vars_struct>) -> f32 {
+  return (((((*(tint_private_vars)).a + (*(tint_private_vars)).b) + (*(tint_private_vars)).c.a) + (*(tint_private_vars)).d.c) * x);
 }
 )";
 
diff --git a/src/tint/writer/msl/generator_impl_builtin_test.cc b/src/tint/writer/msl/generator_impl_builtin_test.cc
index 6c70abe..9868d5e 100644
--- a/src/tint/writer/msl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/msl/generator_impl_builtin_test.cc
@@ -1089,9 +1089,13 @@
 T tint_dot3(vec<T,3> a, vec<T,3> b) {
   return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
 }
+struct tint_private_vars_struct {
+  int3 v;
+};
+
 kernel void test_function() {
-  thread int3 tint_symbol = 0;
-  int r = tint_dot3(tint_symbol, tint_symbol);
+  thread tint_private_vars_struct tint_private_vars = {};
+  int r = tint_dot3(tint_private_vars.v, tint_private_vars.v);
   return;
 }
 
diff --git a/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc b/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
index fa0c53f..f4b0578 100644
--- a/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -527,7 +527,10 @@
     gen.increment_indent();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_THAT(gen.result(), HasSubstr("thread float tint_symbol_1 = 0.0f;\n"));
+    EXPECT_THAT(gen.result(), HasSubstr(R"(thread tint_private_vars_struct tint_private_vars = {};
+    float const tint_symbol = tint_private_vars.a;
+    return;
+)"));
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Workgroup) {
diff --git a/test/tint/array/assign_to_function_var.wgsl.expected.msl b/test/tint/array/assign_to_function_var.wgsl.expected.msl
index a57b60e..a63f260 100644
--- a/test/tint/array/assign_to_function_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_function_var.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<int4, 4> src_private;
+};
+
 struct S {
   /* 0x0000 */ tint_array<int4, 4> arr;
 };
@@ -28,8 +32,7 @@
   return tint_symbol_2;
 }
 
-void foo(tint_array<int4, 4> src_param, threadgroup tint_array<int4, 4>* const tint_symbol_5, const constant S* const tint_symbol_6, device S* const tint_symbol_7) {
-  thread tint_array<int4, 4> tint_symbol_4 = {};
+void foo(tint_array<int4, 4> src_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<int4, 4>* const tint_symbol_4, const constant S* const tint_symbol_5, device S* const tint_symbol_6) {
   tint_array<int4, 4> src_function = {};
   tint_array<int4, 4> dst = {};
   tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
@@ -39,12 +42,12 @@
   tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
   dst = src_let;
   dst = src_function;
-  dst = tint_symbol_4;
-  dst = *(tint_symbol_5);
+  dst = (*(tint_private_vars)).src_private;
+  dst = *(tint_symbol_4);
   S const tint_symbol = ret_struct_arr();
   dst = tint_symbol.arr;
+  dst = (*(tint_symbol_5)).arr;
   dst = (*(tint_symbol_6)).arr;
-  dst = (*(tint_symbol_7)).arr;
   tint_array<tint_array<tint_array<int, 2>, 3>, 4> dst_nested = {};
   tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
   dst_nested = src_nested;
diff --git a/test/tint/array/assign_to_private_var.wgsl.expected.msl b/test/tint/array/assign_to_private_var.wgsl.expected.msl
index 20a35cd..d96bf73 100644
--- a/test/tint/array/assign_to_private_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_private_var.wgsl.expected.msl
@@ -14,6 +14,12 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<int4, 4> src_private;
+  tint_array<int4, 4> dst;
+  tint_array<tint_array<tint_array<int, 2>, 3>, 4> dst_nested;
+};
+
 struct S {
   /* 0x0000 */ tint_array<int4, 4> arr;
 };
@@ -28,25 +34,22 @@
   return tint_symbol_2;
 }
 
-void foo(tint_array<int4, 4> src_param, threadgroup tint_array<int4, 4>* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8) {
-  thread tint_array<int4, 4> tint_symbol_4 = {};
-  thread tint_array<int4, 4> tint_symbol_5 = {};
-  thread tint_array<tint_array<tint_array<int, 2>, 3>, 4> tint_symbol_9 = {};
+void foo(tint_array<int4, 4> src_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<int4, 4>* const tint_symbol_4, const constant S* const tint_symbol_5, device S* const tint_symbol_6) {
   tint_array<int4, 4> src_function = {};
   tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
-  tint_symbol_4 = tint_symbol_3;
-  tint_symbol_4 = src_param;
-  tint_symbol_4 = ret_arr();
+  (*(tint_private_vars)).dst = tint_symbol_3;
+  (*(tint_private_vars)).dst = src_param;
+  (*(tint_private_vars)).dst = ret_arr();
   tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
-  tint_symbol_4 = src_let;
-  tint_symbol_4 = src_function;
-  tint_symbol_4 = tint_symbol_5;
-  tint_symbol_4 = *(tint_symbol_6);
+  (*(tint_private_vars)).dst = src_let;
+  (*(tint_private_vars)).dst = src_function;
+  (*(tint_private_vars)).dst = (*(tint_private_vars)).src_private;
+  (*(tint_private_vars)).dst = *(tint_symbol_4);
   S const tint_symbol = ret_struct_arr();
-  tint_symbol_4 = tint_symbol.arr;
-  tint_symbol_4 = (*(tint_symbol_7)).arr;
-  tint_symbol_4 = (*(tint_symbol_8)).arr;
+  (*(tint_private_vars)).dst = tint_symbol.arr;
+  (*(tint_private_vars)).dst = (*(tint_symbol_5)).arr;
+  (*(tint_private_vars)).dst = (*(tint_symbol_6)).arr;
   tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
-  tint_symbol_9 = src_nested;
+  (*(tint_private_vars)).dst_nested = src_nested;
 }
 
diff --git a/test/tint/array/assign_to_storage_var.wgsl.expected.msl b/test/tint/array/assign_to_storage_var.wgsl.expected.msl
index 54070c6..06a713d 100644
--- a/test/tint/array/assign_to_storage_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_storage_var.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<int4, 4> src_private;
+};
+
 struct S {
   /* 0x0000 */ tint_array<int4, 4> arr;
 };
@@ -32,8 +36,7 @@
   return tint_symbol_2;
 }
 
-void foo(tint_array<int4, 4> src_param, device S* const tint_symbol_4, threadgroup tint_array<int4, 4>* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8, device S_nested* const tint_symbol_9) {
-  thread tint_array<int4, 4> tint_symbol_5 = {};
+void foo(tint_array<int4, 4> src_param, thread tint_private_vars_struct* const tint_private_vars, device S* const tint_symbol_4, threadgroup tint_array<int4, 4>* const tint_symbol_5, const constant S* const tint_symbol_6, device S* const tint_symbol_7, device S_nested* const tint_symbol_8) {
   tint_array<int4, 4> src_function = {};
   tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
   (*(tint_symbol_4)).arr = tint_symbol_3;
@@ -42,13 +45,13 @@
   tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
   (*(tint_symbol_4)).arr = src_let;
   (*(tint_symbol_4)).arr = src_function;
-  (*(tint_symbol_4)).arr = tint_symbol_5;
-  (*(tint_symbol_4)).arr = *(tint_symbol_6);
+  (*(tint_symbol_4)).arr = (*(tint_private_vars)).src_private;
+  (*(tint_symbol_4)).arr = *(tint_symbol_5);
   S const tint_symbol = ret_struct_arr();
   (*(tint_symbol_4)).arr = tint_symbol.arr;
+  (*(tint_symbol_4)).arr = (*(tint_symbol_6)).arr;
   (*(tint_symbol_4)).arr = (*(tint_symbol_7)).arr;
-  (*(tint_symbol_4)).arr = (*(tint_symbol_8)).arr;
   tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
-  (*(tint_symbol_9)).arr = src_nested;
+  (*(tint_symbol_8)).arr = src_nested;
 }
 
diff --git a/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl b/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl
index a356fab..a6a6a5a 100644
--- a/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<int4, 4> src_private;
+};
+
 struct S {
   /* 0x0000 */ tint_array<int4, 4> arr;
 };
@@ -28,8 +32,7 @@
   return tint_symbol_2;
 }
 
-void foo(tint_array<int4, 4> src_param, threadgroup tint_array<int4, 4>* const tint_symbol_4, threadgroup tint_array<int4, 4>* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8, threadgroup tint_array<tint_array<tint_array<int, 2>, 3>, 4>* const tint_symbol_9) {
-  thread tint_array<int4, 4> tint_symbol_5 = {};
+void foo(tint_array<int4, 4> src_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<int4, 4>* const tint_symbol_4, threadgroup tint_array<int4, 4>* const tint_symbol_5, const constant S* const tint_symbol_6, device S* const tint_symbol_7, threadgroup tint_array<tint_array<tint_array<int, 2>, 3>, 4>* const tint_symbol_8) {
   tint_array<int4, 4> src_function = {};
   tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
   *(tint_symbol_4) = tint_symbol_3;
@@ -38,13 +41,13 @@
   tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
   *(tint_symbol_4) = src_let;
   *(tint_symbol_4) = src_function;
-  *(tint_symbol_4) = tint_symbol_5;
-  *(tint_symbol_4) = *(tint_symbol_6);
+  *(tint_symbol_4) = (*(tint_private_vars)).src_private;
+  *(tint_symbol_4) = *(tint_symbol_5);
   S const tint_symbol = ret_struct_arr();
   *(tint_symbol_4) = tint_symbol.arr;
+  *(tint_symbol_4) = (*(tint_symbol_6)).arr;
   *(tint_symbol_4) = (*(tint_symbol_7)).arr;
-  *(tint_symbol_4) = (*(tint_symbol_8)).arr;
   tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
-  *(tint_symbol_9) = src_nested;
+  *(tint_symbol_8) = src_nested;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index fe8fe73..14cefda 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<float2x2, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<float2x2, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float2x2, 4> const l_a = *(tint_symbol_3);
-  float2x2 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  float2 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<float2x2, 4> const l_a = *(tint_symbol_2);
+  float2x2 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  float2 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2_f32/to_private.wgsl.expected.msl
index bf586af..19c149c 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x2_f32/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<float2x2, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float2x2, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].yx;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<float2x2, 4> p;
+};
+
+kernel void f(const constant tint_array<float2x2, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].yx;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 1b83f6b..0589421 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -35,20 +39,21 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<half2x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_3));
-  half2x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_3))[p_a_i_save]);
-  half3 const l_a_i_i = half3((*(tint_symbol_3))[p_a_i_save][p_a_i_i_save].elements);
+  tint_array<half2x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+  half2x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_2))[p_a_i_save]);
+  half3 const l_a_i_i = half3((*(tint_symbol_2))[p_a_i_save][p_a_i_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.msl
index e004d81..b83c6e8 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<half2x3, 4> p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -35,12 +39,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<half2x3, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_1(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2]);
-  tint_symbol[1][0] = half3((*(tint_symbol_1))[0][1].elements).zxy;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1].elements[0];
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_1(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite((*(tint_symbol))[2]);
+  tint_private_vars.p[1][0] = half3((*(tint_symbol))[0][1].elements).zxy;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 1e8f133..4a958fe 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -35,20 +39,21 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float2x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_3));
-  float2x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_3))[p_a_i_save]);
-  float3 const l_a_i_i = float3((*(tint_symbol_3))[p_a_i_save][p_a_i_i_save].elements);
+  tint_array<float2x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+  float2x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_2))[p_a_i_save]);
+  float3 const l_a_i_i = float3((*(tint_symbol_2))[p_a_i_save][p_a_i_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x3_f32/to_private.wgsl.expected.msl
index 8efe3f7..1d8250e 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<float2x3, 4> p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -35,12 +39,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float2x3, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_1(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2]);
-  tint_symbol[1][0] = float3((*(tint_symbol_1))[0][1].elements).zxy;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1].elements[0];
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_1(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite((*(tint_symbol))[2]);
+  tint_private_vars.p[1][0] = float3((*(tint_symbol))[0][1].elements).zxy;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 7ff60c2..cad775d 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<half2x4, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<half2x4, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<half2x4, 4> const l_a = *(tint_symbol_3);
-  half2x4 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  half4 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<half2x4, 4> const l_a = *(tint_symbol_2);
+  half2x4 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  half4 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.msl
index 2187ceb..cfcebb1 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f16/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<half2x4, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<half2x4, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].ywxz;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<half2x4, 4> p;
+};
+
+kernel void f(const constant tint_array<half2x4, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].ywxz;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 5566a8c..69ff4d3 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<float2x4, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<float2x4, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float2x4, 4> const l_a = *(tint_symbol_3);
-  float2x4 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  float4 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<float2x4, 4> const l_a = *(tint_symbol_2);
+  float2x4 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  float4 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat2x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x4_f32/to_private.wgsl.expected.msl
index 147f578..b5b1fd4 100644
--- a/test/tint/buffer/uniform/std140/array/mat2x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat2x4_f32/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<float2x4, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float2x4, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].ywxz;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<float2x4, 4> p;
+};
+
+kernel void f(const constant tint_array<float2x4, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].ywxz;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index b5bbbfe..f90ac9e 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -35,20 +39,21 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float3x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_3));
-  float3x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_3))[p_a_i_save]);
-  float3 const l_a_i_i = float3((*(tint_symbol_3))[p_a_i_save][p_a_i_i_save].elements);
+  tint_array<float3x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+  float3x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_2))[p_a_i_save]);
+  float3 const l_a_i_i = float3((*(tint_symbol_2))[p_a_i_save][p_a_i_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat3x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat3x3_f32/to_private.wgsl.expected.msl
index 591e132..fcdd7d4 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat3x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<float3x3, 4> p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -35,12 +39,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float3x3, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_1(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2]);
-  tint_symbol[1][0] = float3((*(tint_symbol_1))[0][1].elements).zxy;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1].elements[0];
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_1(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite((*(tint_symbol))[2]);
+  tint_private_vars.p[1][0] = float3((*(tint_symbol))[0][1].elements).zxy;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index fccba32..afa7618 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<float3x4, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<float3x4, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float3x4, 4> const l_a = *(tint_symbol_3);
-  float3x4 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  float4 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<float3x4, 4> const l_a = *(tint_symbol_2);
+  float3x4 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  float4 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat3x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat3x4_f32/to_private.wgsl.expected.msl
index 3ebf98c..ab11514 100644
--- a/test/tint/buffer/uniform/std140/array/mat3x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat3x4_f32/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<float3x4, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float3x4, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].ywxz;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<float3x4, 4> p;
+};
+
+kernel void f(const constant tint_array<float3x4, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].ywxz;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
index f850ce9..e0207e7 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<half4x2, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<half4x2, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<half4x2, 4> const l_a = *(tint_symbol_3);
-  half4x2 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  half2 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<half4x2, 4> const l_a = *(tint_symbol_2);
+  half4x2 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  half2 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.msl
index d7b60af..72384ca 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f16/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<half4x2, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<half4x2, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].yx;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<half4x2, 4> p;
+};
+
+kernel void f(const constant tint_array<half4x2, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].yx;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index cffca67..286c29e 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<float4x2, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<float4x2, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float4x2, 4> const l_a = *(tint_symbol_3);
-  float4x2 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  float2 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<float4x2, 4> const l_a = *(tint_symbol_2);
+  float4x2 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  float2 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2_f32/to_private.wgsl.expected.msl
index 5aec084..dbe7645 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x2_f32/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<float4x2, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float4x2, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].yx;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<float4x2, 4> p;
+};
+
+kernel void f(const constant tint_array<float4x2, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].yx;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index e8d3f21..6b79003 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -35,20 +39,21 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<half4x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_3));
-  half4x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_3))[p_a_i_save]);
-  half3 const l_a_i_i = half3((*(tint_symbol_3))[p_a_i_save][p_a_i_i_save].elements);
+  tint_array<half4x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+  half4x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_2))[p_a_i_save]);
+  half3 const l_a_i_i = half3((*(tint_symbol_2))[p_a_i_save][p_a_i_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.msl
index 0f56e7a..dc505d8 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<half4x3, 4> p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -35,12 +39,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<half4x3, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_1(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2]);
-  tint_symbol[1][0] = half3((*(tint_symbol_1))[0][1].elements).zxy;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1].elements[0];
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_1(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite((*(tint_symbol))[2]);
+  tint_private_vars.p[1][0] = half3((*(tint_symbol))[0][1].elements).zxy;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 4f340ac..7b444ce 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -35,20 +39,21 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float4x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_3));
-  float4x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_3))[p_a_i_save]);
-  float3 const l_a_i_i = float3((*(tint_symbol_3))[p_a_i_save][p_a_i_i_save].elements);
+  tint_array<float4x3, 4> const l_a = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+  float4x3 const l_a_i = tint_unpack_vec3_in_composite((*(tint_symbol_2))[p_a_i_save]);
+  float3 const l_a_i_i = float3((*(tint_symbol_2))[p_a_i_save][p_a_i_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x3_f32/to_private.wgsl.expected.msl
index bfb7be1..88eb93a 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<float4x3, 4> p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -35,12 +39,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float4x3, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_1(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2]);
-  tint_symbol[1][0] = float3((*(tint_symbol_1))[0][1].elements).zxy;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1].elements[0];
+kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_1(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite((*(tint_symbol))[2]);
+  tint_private_vars.p[1][0] = float3((*(tint_symbol))[0][1].elements).zxy;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index c1b59e6..08abcd5 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<half4x4, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<half4x4, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<half4x4, 4> const l_a = *(tint_symbol_3);
-  half4x4 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  half4 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<half4x4, 4> const l_a = *(tint_symbol_2);
+  half4x4 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  half4 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.msl
index f6a14dc..f7b3395 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f16/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<half4x4, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<half4x4, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].ywxz;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<half4x4, 4> p;
+};
+
+kernel void f(const constant tint_array<half4x4, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].ywxz;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 4aeaf64..c318d62 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,20 +14,25 @@
     T elements[N];
 };
 
-int i() {
-  thread int tint_symbol_2 = 0;
-  tint_symbol_2 = as_type<int>((as_type<uint>(tint_symbol_2) + as_type<uint>(1)));
-  return tint_symbol_2;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<float4x4, 4>* tint_symbol_3 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<float4x4, 4>* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_i_save = tint_symbol_1;
-  tint_array<float4x4, 4> const l_a = *(tint_symbol_3);
-  float4x4 const l_a_i = (*(tint_symbol_3))[p_a_i_save];
-  float4 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save];
+  tint_array<float4x4, 4> const l_a = *(tint_symbol_2);
+  float4x4 const l_a_i = (*(tint_symbol_2))[p_a_i_save];
+  float4 const l_a_i_i = (*(tint_symbol_2))[p_a_i_save][p_a_i_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/array/mat4x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x4_f32/to_private.wgsl.expected.msl
index eb69666..d782b28 100644
--- a/test/tint/buffer/uniform/std140/array/mat4x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/array/mat4x4_f32/to_private.wgsl.expected.msl
@@ -14,12 +14,16 @@
     T elements[N];
 };
 
-kernel void f(const constant tint_array<float4x4, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<float4x4, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[1][0] = (*(tint_symbol_1))[0][1].ywxz;
-  tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0];
+struct tint_private_vars_struct {
+  tint_array<float4x4, 4> p;
+};
+
+kernel void f(const constant tint_array<float4x4, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[1][0] = (*(tint_symbol))[0][1].ywxz;
+  tint_private_vars.p[1][0][0] = (*(tint_symbol))[0][1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 3c067f3..17a32f3 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ half2x2 m;
   /* 0x0008 */ tint_array<int8_t, 56> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  half2x2 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  half2 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  half2x2 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  half2 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.msl
index 37fd98a..0d3bda7 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_private.wgsl.expected.msl
@@ -22,12 +22,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_1;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].yx;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].yx;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 56ba8da..e8a41dd 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ float2x2 m;
   /* 0x0010 */ tint_array<int8_t, 48> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  float2x2 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  float2 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  float2x2 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  float2 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_private.wgsl.expected.msl
index db4c6db..1253483 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].yx;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].yx;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 8afb558..dcaae72 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -72,27 +76,28 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_5));
-  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_5))[p_a_i_save]);
-  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_5))[p_a_i_save].a);
-  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save]);
-  half2x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m);
-  half3 const l_a_i_a_i_m_i = half3((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
+  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_4));
+  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_4))[p_a_i_save]);
+  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_4))[p_a_i_save].a);
+  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save]);
+  half2x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m);
+  half3 const l_a_i_a_i_m_i = half3((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.msl
index 30e2743..f58017c 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,16 @@
     T elements[N];
 };
 
+struct S {
+  int before;
+  half2x3 m;
+  int after;
+};
+
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -36,12 +46,6 @@
   return result;
 }
 
-struct S {
-  int before;
-  half2x3 m;
-  int after;
-};
-
 S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
   S result = {};
   result.before = in.before;
@@ -58,12 +62,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_2(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_1))[2]);
-  tint_symbol[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2].m);
-  tint_symbol[1].m[0] = half3((*(tint_symbol_1))[0].m[1].elements).zxy;
+kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_2(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol))[2]);
+  tint_private_vars.p[3].m = tint_unpack_vec3_in_composite((*(tint_symbol))[2].m);
+  tint_private_vars.p[1].m[0] = half3((*(tint_symbol))[0].m[1].elements).zxy;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index ad6de23..cacb8ae 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -72,27 +76,28 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_5));
-  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_5))[p_a_i_save]);
-  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_5))[p_a_i_save].a);
-  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save]);
-  float2x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m);
-  float3 const l_a_i_a_i_m_i = float3((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
+  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_4));
+  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_4))[p_a_i_save]);
+  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_4))[p_a_i_save].a);
+  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save]);
+  float2x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m);
+  float3 const l_a_i_a_i_m_i = float3((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_private.wgsl.expected.msl
index a4125c9..2b17191 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,16 @@
     T elements[N];
 };
 
+struct S {
+  int before;
+  float2x3 m;
+  int after;
+};
+
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -36,12 +46,6 @@
   return result;
 }
 
-struct S {
-  int before;
-  float2x3 m;
-  int after;
-};
-
 S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
   S result = {};
   result.before = in.before;
@@ -58,12 +62,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_2(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_1))[2]);
-  tint_symbol[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2].m);
-  tint_symbol[1].m[0] = float3((*(tint_symbol_1))[0].m[1].elements).zxy;
+kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_2(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol))[2]);
+  tint_private_vars.p[3].m = tint_unpack_vec3_in_composite((*(tint_symbol))[2].m);
+  tint_private_vars.p[1].m[0] = float3((*(tint_symbol))[0].m[1].elements).zxy;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index a4620ce..eb79a3c 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ half2x4 m;
   /* 0x0010 */ tint_array<int8_t, 48> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  half2x4 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  half4 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  half2x4 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  half4 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.msl
index 401d59c..bf4dc27 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].ywxz;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].ywxz;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 6092bcc..c34b3ef 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ float2x4 m;
   /* 0x0020 */ tint_array<int8_t, 32> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  float2x4 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  float4 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  float2x4 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  float4 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_private.wgsl.expected.msl
index 7fb9918..4e17693 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].ywxz;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].ywxz;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 322fa8e..0cf5a40 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ half3x2 m;
   /* 0x000c */ tint_array<int8_t, 52> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  half3x2 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  half2 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  half3x2 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  half2 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.msl
index 1fbb90c..e484c9d 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_private.wgsl.expected.msl
@@ -22,12 +22,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_1;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].yx;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].yx;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 02f86ed..e26ceae 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ float3x2 m;
   /* 0x0018 */ tint_array<int8_t, 40> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  float3x2 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  float2 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  float3x2 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  float2 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_private.wgsl.expected.msl
index 118705a..6cbe201 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].yx;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].yx;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 0cf67e3..984567f 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -72,27 +76,28 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_5));
-  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_5))[p_a_i_save]);
-  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_5))[p_a_i_save].a);
-  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save]);
-  half3x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m);
-  half3 const l_a_i_a_i_m_i = half3((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
+  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_4));
+  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_4))[p_a_i_save]);
+  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_4))[p_a_i_save].a);
+  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save]);
+  half3x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m);
+  half3 const l_a_i_a_i_m_i = half3((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.msl
index 55bcb6a..2e942f5 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,16 @@
     T elements[N];
 };
 
+struct S {
+  int before;
+  half3x3 m;
+  int after;
+};
+
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -36,12 +46,6 @@
   return result;
 }
 
-struct S {
-  int before;
-  half3x3 m;
-  int after;
-};
-
 S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
   S result = {};
   result.before = in.before;
@@ -58,12 +62,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_2(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_1))[2]);
-  tint_symbol[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2].m);
-  tint_symbol[1].m[0] = half3((*(tint_symbol_1))[0].m[1].elements).zxy;
+kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_2(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol))[2]);
+  tint_private_vars.p[3].m = tint_unpack_vec3_in_composite((*(tint_symbol))[2].m);
+  tint_private_vars.p[1].m[0] = half3((*(tint_symbol))[0].m[1].elements).zxy;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index fd95ea8..29361e5 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -72,27 +76,28 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_5));
-  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_5))[p_a_i_save]);
-  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_5))[p_a_i_save].a);
-  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save]);
-  float3x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m);
-  float3 const l_a_i_a_i_m_i = float3((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
+  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_4));
+  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_4))[p_a_i_save]);
+  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_4))[p_a_i_save].a);
+  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save]);
+  float3x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m);
+  float3 const l_a_i_a_i_m_i = float3((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_private.wgsl.expected.msl
index f6812b4..166da04 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,16 @@
     T elements[N];
 };
 
+struct S {
+  int before;
+  float3x3 m;
+  int after;
+};
+
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -35,12 +45,6 @@
   return result;
 }
 
-struct S {
-  int before;
-  float3x3 m;
-  int after;
-};
-
 S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
   S result = {};
   result.before = in.before;
@@ -57,12 +61,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_2(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_1))[2]);
-  tint_symbol[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2].m);
-  tint_symbol[1].m[0] = float3((*(tint_symbol_1))[0].m[1].elements).zxy;
+kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_2(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol))[2]);
+  tint_private_vars.p[3].m = tint_unpack_vec3_in_composite((*(tint_symbol))[2].m);
+  tint_private_vars.p[1].m[0] = float3((*(tint_symbol))[0].m[1].elements).zxy;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index eed6f51..985b40c 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ half3x4 m;
   /* 0x0018 */ tint_array<int8_t, 40> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  half3x4 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  half4 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  half3x4 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  half4 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.msl
index 6146923..ae9c315 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].ywxz;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].ywxz;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index c277984..92e2f67 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ float3x4 m;
   /* 0x0030 */ tint_array<int8_t, 16> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  float3x4 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  float4 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  float3x4 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  float4 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_private.wgsl.expected.msl
index d59f443..348de47 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_private.wgsl.expected.msl
@@ -22,12 +22,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_1;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].ywxz;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].ywxz;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 2ff783e..2988fc5 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ half4x2 m;
   /* 0x0010 */ tint_array<int8_t, 48> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  half4x2 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  half2 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  half4x2 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  half2 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.msl
index 6141107..a850f51 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_private.wgsl.expected.msl
@@ -22,12 +22,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_1;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].yx;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].yx;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index eca377a..dfb5b40 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ float4x2 m;
   /* 0x0020 */ tint_array<int8_t, 32> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  float4x2 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  float2 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  float4x2 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  float2 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_private.wgsl.expected.msl
index 727a883..ff337eb 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].yx;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].yx;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 5b3d6f8..7cabe51 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -72,27 +76,28 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_5));
-  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_5))[p_a_i_save]);
-  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_5))[p_a_i_save].a);
-  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save]);
-  half4x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m);
-  half3 const l_a_i_a_i_m_i = half3((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
+  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_4));
+  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_4))[p_a_i_save]);
+  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_4))[p_a_i_save].a);
+  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save]);
+  half4x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m);
+  half3 const l_a_i_a_i_m_i = half3((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.msl
index dae39c9..a1ac5a2 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,16 @@
     T elements[N];
 };
 
+struct S {
+  int before;
+  half4x3 m;
+  int after;
+};
+
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -36,12 +46,6 @@
   return result;
 }
 
-struct S {
-  int before;
-  half4x3 m;
-  int after;
-};
-
 S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
   S result = {};
   result.before = in.before;
@@ -58,12 +62,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_2(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_1))[2]);
-  tint_symbol[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2].m);
-  tint_symbol[1].m[0] = half3((*(tint_symbol_1))[0].m[1].elements).zxy;
+kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_2(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol))[2]);
+  tint_private_vars.p[3].m = tint_unpack_vec3_in_composite((*(tint_symbol))[2].m);
+  tint_private_vars.p[1].m[0] = half3((*(tint_symbol))[0].m[1].elements).zxy;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 0a6b698..e7bc473 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -71,27 +75,28 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer_tint_packed_vec3, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_5));
-  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_5))[p_a_i_save]);
-  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_5))[p_a_i_save].a);
-  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save]);
-  float4x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m);
-  float3 const l_a_i_a_i_m_i = float3((*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
+  tint_array<Outer, 4> const l_a = tint_unpack_vec3_in_composite_4(*(tint_symbol_4));
+  Outer const l_a_i = tint_unpack_vec3_in_composite_3((*(tint_symbol_4))[p_a_i_save]);
+  tint_array<Inner, 4> const l_a_i_a = tint_unpack_vec3_in_composite_2((*(tint_symbol_4))[p_a_i_save].a);
+  Inner const l_a_i_a_i = tint_unpack_vec3_in_composite_1((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save]);
+  float4x3 const l_a_i_a_i_m = tint_unpack_vec3_in_composite((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m);
+  float3 const l_a_i_a_i_m_i = float3((*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements);
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save].elements[tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_private.wgsl.expected.msl
index f8b9e4a..c57a58d 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,16 @@
     T elements[N];
 };
 
+struct S {
+  int before;
+  float4x3 m;
+  int after;
+};
+
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -36,12 +46,6 @@
   return result;
 }
 
-struct S {
-  int before;
-  float4x3 m;
-  int after;
-};
-
 S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
   S result = {};
   result.before = in.before;
@@ -58,12 +62,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = tint_unpack_vec3_in_composite_2(*(tint_symbol_1));
-  tint_symbol[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_1))[2]);
-  tint_symbol[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_1))[2].m);
-  tint_symbol[1].m[0] = float3((*(tint_symbol_1))[0].m[1].elements).zxy;
+kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite_2(*(tint_symbol));
+  tint_private_vars.p[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol))[2]);
+  tint_private_vars.p[3].m = tint_unpack_vec3_in_composite((*(tint_symbol))[2].m);
+  tint_private_vars.p[1].m[0] = float3((*(tint_symbol))[0].m[1].elements).zxy;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 31fbf6a..6af3608 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ half4x4 m;
   /* 0x0020 */ tint_array<int8_t, 32> tint_pad;
@@ -23,27 +27,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  half4x4 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  half4 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  half const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  half4x4 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  half4 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  half const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.msl
index 94334df..d094091 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].ywxz;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].ywxz;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 5fc5475..c191459 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct Inner {
   /* 0x0000 */ float4x4 m;
 };
@@ -22,27 +26,28 @@
   /* 0x0000 */ tint_array<Inner, 4> a;
 };
 
-int i() {
-  thread int tint_symbol_4 = 0;
-  tint_symbol_4 = as_type<int>((as_type<uint>(tint_symbol_4) + as_type<uint>(1)));
-  return tint_symbol_4;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<Outer, 4>* tint_symbol_5 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<Outer, 4>* tint_symbol_4 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_a_i_save = tint_symbol;
-  int const tint_symbol_1 = i();
+  int const tint_symbol_1 = i(&(tint_private_vars));
   int const p_a_i_a_i_save = tint_symbol_1;
-  int const tint_symbol_2 = i();
+  int const tint_symbol_2 = i(&(tint_private_vars));
   int const p_a_i_a_i_m_i_save = tint_symbol_2;
-  tint_array<Outer, 4> const l_a = *(tint_symbol_5);
-  Outer const l_a_i = (*(tint_symbol_5))[p_a_i_save];
-  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_5))[p_a_i_save].a;
-  Inner const l_a_i_a_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save];
-  float4x4 const l_a_i_a_i_m = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m;
-  float4 const l_a_i_a_i_m_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
-  int const tint_symbol_3 = i();
-  float const l_a_i_a_i_m_i_i = (*(tint_symbol_5))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
+  tint_array<Outer, 4> const l_a = *(tint_symbol_4);
+  Outer const l_a_i = (*(tint_symbol_4))[p_a_i_save];
+  tint_array<Inner, 4> const l_a_i_a = (*(tint_symbol_4))[p_a_i_save].a;
+  Inner const l_a_i_a_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save];
+  float4x4 const l_a_i_a_i_m = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m;
+  float4 const l_a_i_a_i_m_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save];
+  int const tint_symbol_3 = i(&(tint_private_vars));
+  float const l_a_i_a_i_m_i_i = (*(tint_symbol_4))[p_a_i_save].a[p_a_i_a_i_save].m[p_a_i_a_i_m_i_save][tint_symbol_3];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_private.wgsl.expected.msl
index c124b5b..8f6adb8 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_private.wgsl.expected.msl
@@ -23,12 +23,16 @@
   /* 0x0084 */ tint_array<int8_t, 60> tint_pad_2;
 };
 
-kernel void f(const constant tint_array<S, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread tint_array<S, 4> tint_symbol = {};
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[2];
-  tint_symbol[3].m = (*(tint_symbol_1))[2].m;
-  tint_symbol[1].m[0] = (*(tint_symbol_1))[0].m[1].ywxz;
+struct tint_private_vars_struct {
+  tint_array<S, 4> p;
+};
+
+kernel void f(const constant tint_array<S, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[2];
+  tint_private_vars.p[3].m = (*(tint_symbol))[2].m;
+  tint_private_vars.p[1].m[0] = (*(tint_symbol))[0].m[1].ywxz;
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
index f9562f6..5739bd5 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half2x2* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant half2x2* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half2x2 const l_m = *(tint_symbol_2);
-  half2 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  half2x2 const l_m = *(tint_symbol_1);
+  half2 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.msl
index 59df3ba..cd82b02 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half2x2* tint_symbol_1 [[buffer(0)]]) {
-  half2x2 const l_m = *(tint_symbol_1);
-  half2 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant half2x2* tint_symbol [[buffer(0)]]) {
+  half2x2 const l_m = *(tint_symbol);
+  half2 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.msl
index 748687f..54d4889 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f16/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant half2x2* tint_symbol_1 [[buffer(0)]]) {
-  thread half2x2 tint_symbol = half2x2(0.0h);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].yx;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  half2x2 p;
+};
+
+kernel void f(const constant half2x2* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].yx;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 61e6798..1a7a358 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float2x2* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant float2x2* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float2x2 const l_m = *(tint_symbol_2);
-  float2 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  float2x2 const l_m = *(tint_symbol_1);
+  float2 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/static_index_via_ptr.wgsl.expected.msl
index 6b2c368..f545a3a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float2x2* tint_symbol_1 [[buffer(0)]]) {
-  float2x2 const l_m = *(tint_symbol_1);
-  float2 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant float2x2* tint_symbol [[buffer(0)]]) {
+  float2x2 const l_m = *(tint_symbol);
+  float2 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/to_private.wgsl.expected.msl
index e80a8b6..2d08b3e 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x2_f32/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant float2x2* tint_symbol_1 [[buffer(0)]]) {
-  thread float2x2 tint_symbol = float2x2(0.0f);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].yx;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  float2x2 p;
+};
+
+kernel void f(const constant float2x2* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].yx;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 4b6e675..8d82142 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,17 +31,18 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_2));
-  half3 const l_m_i = half3((*(tint_symbol_2))[p_m_i_save].elements);
+  half2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
+  half3 const l_m_i = half3((*(tint_symbol_1))[p_m_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.msl
index 20f1196..6b09268 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/static_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,15 +31,14 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol_1 [[buffer(0)]]) {
-  half2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  half3 const l_m_1 = half3((*(tint_symbol_1))[1].elements);
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol [[buffer(0)]]) {
+  half2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol));
+  half3 const l_m_1 = half3((*(tint_symbol))[1].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.msl
index 2889fe9..f08c837 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  half2x3 p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,12 +31,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol_1 [[buffer(0)]]) {
-  thread half2x3 tint_symbol = half2x3(0.0h);
-  tint_symbol = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  tint_symbol[1] = half3((*(tint_symbol_1))[0].elements);
-  tint_symbol[1] = half3((*(tint_symbol_1))[0].elements).zxy;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1].elements[0];
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite(*(tint_symbol));
+  tint_private_vars.p[1] = half3((*(tint_symbol))[0].elements);
+  tint_private_vars.p[1] = half3((*(tint_symbol))[0].elements).zxy;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 04c5d41..f79edc4 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,17 +31,18 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_2));
-  float3 const l_m_i = float3((*(tint_symbol_2))[p_m_i_save].elements);
+  float2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
+  float3 const l_m_i = float3((*(tint_symbol_1))[p_m_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.msl
index 6ab436c..69dc89f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,15 +31,14 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol_1 [[buffer(0)]]) {
-  float2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  float3 const l_m_1 = float3((*(tint_symbol_1))[1].elements);
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol [[buffer(0)]]) {
+  float2x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol));
+  float3 const l_m_1 = float3((*(tint_symbol))[1].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.msl
index 8bc9638..76a7694 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float2x3 p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,12 +31,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol_1 [[buffer(0)]]) {
-  thread float2x3 tint_symbol = float2x3(0.0f);
-  tint_symbol = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  tint_symbol[1] = float3((*(tint_symbol_1))[0].elements);
-  tint_symbol[1] = float3((*(tint_symbol_1))[0].elements).zxy;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1].elements[0];
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite(*(tint_symbol));
+  tint_private_vars.p[1] = float3((*(tint_symbol))[0].elements);
+  tint_private_vars.p[1] = float3((*(tint_symbol))[0].elements).zxy;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 7ecbd42..b0c5224 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half2x4* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant half2x4* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half2x4 const l_m = *(tint_symbol_2);
-  half4 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  half2x4 const l_m = *(tint_symbol_1);
+  half4 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.msl
index 760d2d2..337e8c2 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half2x4* tint_symbol_1 [[buffer(0)]]) {
-  half2x4 const l_m = *(tint_symbol_1);
-  half4 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant half2x4* tint_symbol [[buffer(0)]]) {
+  half2x4 const l_m = *(tint_symbol);
+  half4 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.msl
index 4c18d53..cfa4924 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f16/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant half2x4* tint_symbol_1 [[buffer(0)]]) {
-  thread half2x4 tint_symbol = half2x4(0.0h);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].ywxz;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  half2x4 p;
+};
+
+kernel void f(const constant half2x4* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].ywxz;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 5c7026b..a7299df 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float2x4* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant float2x4* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float2x4 const l_m = *(tint_symbol_2);
-  float4 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  float2x4 const l_m = *(tint_symbol_1);
+  float4 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/static_index_via_ptr.wgsl.expected.msl
index 51566cb..c839354 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float2x4* tint_symbol_1 [[buffer(0)]]) {
-  float2x4 const l_m = *(tint_symbol_1);
-  float4 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant float2x4* tint_symbol [[buffer(0)]]) {
+  float2x4 const l_m = *(tint_symbol);
+  float4 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/to_private.wgsl.expected.msl
index 5351247..076285d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x4_f32/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant float2x4* tint_symbol_1 [[buffer(0)]]) {
-  thread float2x4 tint_symbol = float2x4(0.0f);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].ywxz;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  float2x4 p;
+};
+
+kernel void f(const constant float2x4* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].ywxz;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
index fec7c16..864db13 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half3x2* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant half3x2* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half3x2 const l_m = *(tint_symbol_2);
-  half2 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  half3x2 const l_m = *(tint_symbol_1);
+  half2 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.msl
index 20f3c6a..535d5f4 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half3x2* tint_symbol_1 [[buffer(0)]]) {
-  half3x2 const l_m = *(tint_symbol_1);
-  half2 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant half3x2* tint_symbol [[buffer(0)]]) {
+  half3x2 const l_m = *(tint_symbol);
+  half2 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.msl
index f88a3fa..3b920fa 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f16/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant half3x2* tint_symbol_1 [[buffer(0)]]) {
-  thread half3x2 tint_symbol = half3x2(0.0h);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].yx;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  half3x2 p;
+};
+
+kernel void f(const constant half3x2* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].yx;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index ccda765..ed823d3 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float3x2* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant float3x2* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float3x2 const l_m = *(tint_symbol_2);
-  float2 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  float3x2 const l_m = *(tint_symbol_1);
+  float2 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/static_index_via_ptr.wgsl.expected.msl
index df020b7..96ea15a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float3x2* tint_symbol_1 [[buffer(0)]]) {
-  float3x2 const l_m = *(tint_symbol_1);
-  float2 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant float3x2* tint_symbol [[buffer(0)]]) {
+  float3x2 const l_m = *(tint_symbol);
+  float2 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/to_private.wgsl.expected.msl
index f0f39fe..d26288a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x2_f32/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant float3x2* tint_symbol_1 [[buffer(0)]]) {
-  thread float3x2 tint_symbol = float3x2(0.0f);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].yx;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  float3x2 p;
+};
+
+kernel void f(const constant float3x2* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].yx;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 52ad632..76a8717 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,17 +31,18 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_2));
-  half3 const l_m_i = half3((*(tint_symbol_2))[p_m_i_save].elements);
+  half3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
+  half3 const l_m_i = half3((*(tint_symbol_1))[p_m_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.msl
index 0840049..3eddae1 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/static_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,15 +31,14 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol_1 [[buffer(0)]]) {
-  half3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  half3 const l_m_1 = half3((*(tint_symbol_1))[1].elements);
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol [[buffer(0)]]) {
+  half3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol));
+  half3 const l_m_1 = half3((*(tint_symbol))[1].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.msl
index 3249af1..197c3fe 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  half3x3 p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,12 +31,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol_1 [[buffer(0)]]) {
-  thread half3x3 tint_symbol = half3x3(0.0h);
-  tint_symbol = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  tint_symbol[1] = half3((*(tint_symbol_1))[0].elements);
-  tint_symbol[1] = half3((*(tint_symbol_1))[0].elements).zxy;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1].elements[0];
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite(*(tint_symbol));
+  tint_private_vars.p[1] = half3((*(tint_symbol))[0].elements);
+  tint_private_vars.p[1] = half3((*(tint_symbol))[0].elements).zxy;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 98e4aa7..e35f7f6 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,17 +31,18 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_2));
-  float3 const l_m_i = float3((*(tint_symbol_2))[p_m_i_save].elements);
+  float3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
+  float3 const l_m_i = float3((*(tint_symbol_1))[p_m_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.msl
index 06ae933..52ae088 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,15 +31,14 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol_1 [[buffer(0)]]) {
-  float3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  float3 const l_m_1 = float3((*(tint_symbol_1))[1].elements);
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol [[buffer(0)]]) {
+  float3x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol));
+  float3 const l_m_1 = float3((*(tint_symbol))[1].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.msl
index 0b5388c..9bbecf4 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float3x3 p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,12 +31,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol_1 [[buffer(0)]]) {
-  thread float3x3 tint_symbol = float3x3(0.0f);
-  tint_symbol = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  tint_symbol[1] = float3((*(tint_symbol_1))[0].elements);
-  tint_symbol[1] = float3((*(tint_symbol_1))[0].elements).zxy;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1].elements[0];
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite(*(tint_symbol));
+  tint_private_vars.p[1] = float3((*(tint_symbol))[0].elements);
+  tint_private_vars.p[1] = float3((*(tint_symbol))[0].elements).zxy;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 70345b3..b858eb1 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half3x4* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant half3x4* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half3x4 const l_m = *(tint_symbol_2);
-  half4 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  half3x4 const l_m = *(tint_symbol_1);
+  half4 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.msl
index 82f5ec8..eee9c9f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half3x4* tint_symbol_1 [[buffer(0)]]) {
-  half3x4 const l_m = *(tint_symbol_1);
-  half4 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant half3x4* tint_symbol [[buffer(0)]]) {
+  half3x4 const l_m = *(tint_symbol);
+  half4 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.msl
index 67376a0..8811bf2 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f16/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant half3x4* tint_symbol_1 [[buffer(0)]]) {
-  thread half3x4 tint_symbol = half3x4(0.0h);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].ywxz;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  half3x4 p;
+};
+
+kernel void f(const constant half3x4* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].ywxz;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 8774e83..0cc2a65 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float3x4* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant float3x4* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float3x4 const l_m = *(tint_symbol_2);
-  float4 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  float3x4 const l_m = *(tint_symbol_1);
+  float4 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/static_index_via_ptr.wgsl.expected.msl
index e48a04b..311f43d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float3x4* tint_symbol_1 [[buffer(0)]]) {
-  float3x4 const l_m = *(tint_symbol_1);
-  float4 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant float3x4* tint_symbol [[buffer(0)]]) {
+  float3x4 const l_m = *(tint_symbol);
+  float4 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/to_private.wgsl.expected.msl
index 7a8aed3..e6015b9 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x4_f32/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant float3x4* tint_symbol_1 [[buffer(0)]]) {
-  thread float3x4 tint_symbol = float3x4(0.0f);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].ywxz;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  float3x4 p;
+};
+
+kernel void f(const constant float3x4* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].ywxz;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 756ba6d..11618f7 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half4x2* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant half4x2* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half4x2 const l_m = *(tint_symbol_2);
-  half2 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  half4x2 const l_m = *(tint_symbol_1);
+  half2 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.msl
index a054f04..2818371 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half4x2* tint_symbol_1 [[buffer(0)]]) {
-  half4x2 const l_m = *(tint_symbol_1);
-  half2 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant half4x2* tint_symbol [[buffer(0)]]) {
+  half4x2 const l_m = *(tint_symbol);
+  half2 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.msl
index 50b8bd6..a88ee0a 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f16/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant half4x2* tint_symbol_1 [[buffer(0)]]) {
-  thread half4x2 tint_symbol = half4x2(0.0h);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].yx;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  half4x2 p;
+};
+
+kernel void f(const constant half4x2* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].yx;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
index ba9e110..dd84081 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float4x2* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant float4x2* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float4x2 const l_m = *(tint_symbol_2);
-  float2 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  float4x2 const l_m = *(tint_symbol_1);
+  float2 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/static_index_via_ptr.wgsl.expected.msl
index 7bc8919..0d225fa 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float4x2* tint_symbol_1 [[buffer(0)]]) {
-  float4x2 const l_m = *(tint_symbol_1);
-  float2 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant float4x2* tint_symbol [[buffer(0)]]) {
+  float4x2 const l_m = *(tint_symbol);
+  float2 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/to_private.wgsl.expected.msl
index 9cfd512..bbe9c7c 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x2_f32/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant float4x2* tint_symbol_1 [[buffer(0)]]) {
-  thread float4x2 tint_symbol = float4x2(0.0f);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].yx;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  float4x2 p;
+};
+
+kernel void f(const constant float4x2* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].yx;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
index 7851572..27b22ff 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,17 +31,18 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_2));
-  half3 const l_m_i = half3((*(tint_symbol_2))[p_m_i_save].elements);
+  half4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
+  half3 const l_m_i = half3((*(tint_symbol_1))[p_m_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.msl
index 97391f4..e324c0d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/static_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,15 +31,14 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol_1 [[buffer(0)]]) {
-  half4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  half3 const l_m_1 = half3((*(tint_symbol_1))[1].elements);
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol [[buffer(0)]]) {
+  half4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol));
+  half3 const l_m_1 = half3((*(tint_symbol))[1].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.msl
index 644a82a..9124188 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  half4x3 p;
+};
+
 struct tint_packed_vec3_f16_array_element {
   /* 0x0000 */ packed_half3 elements;
   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
@@ -27,12 +31,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread half4x3 tint_symbol = half4x3(0.0h);
-  tint_symbol = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  tint_symbol[1] = half3((*(tint_symbol_1))[0].elements);
-  tint_symbol[1] = half3((*(tint_symbol_1))[0].elements).zxy;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1].elements[0];
+kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite(*(tint_symbol));
+  tint_private_vars.p[1] = half3((*(tint_symbol))[0].elements);
+  tint_private_vars.p[1] = half3((*(tint_symbol))[0].elements).zxy;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
index ef30c00..40b38c5 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,17 +31,18 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_2));
-  float3 const l_m_i = float3((*(tint_symbol_2))[p_m_i_save].elements);
+  float4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
+  float3 const l_m_i = float3((*(tint_symbol_1))[p_m_i_save].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.msl
index 313cd69..90afeda 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,15 +31,14 @@
   return result;
 }
 
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol_1 [[buffer(0)]]) {
-  float4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  float3 const l_m_1 = float3((*(tint_symbol_1))[1].elements);
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol [[buffer(0)]]) {
+  float4x3 const l_m = tint_unpack_vec3_in_composite(*(tint_symbol));
+  float3 const l_m_1 = float3((*(tint_symbol))[1].elements);
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.msl
index c9b7814..2564332 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float4x3 p;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -27,12 +31,12 @@
   return result;
 }
 
-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol_1 [[buffer(0)]]) {
-  thread float4x3 tint_symbol = float4x3(0.0f);
-  tint_symbol = tint_unpack_vec3_in_composite(*(tint_symbol_1));
-  tint_symbol[1] = float3((*(tint_symbol_1))[0].elements);
-  tint_symbol[1] = float3((*(tint_symbol_1))[0].elements).zxy;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1].elements[0];
+kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = tint_unpack_vec3_in_composite(*(tint_symbol));
+  tint_private_vars.p[1] = float3((*(tint_symbol))[0].elements);
+  tint_private_vars.p[1] = float3((*(tint_symbol))[0].elements).zxy;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1].elements[0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
index f8948a7..a84f36d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half4x4* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant half4x4* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  half4x4 const l_m = *(tint_symbol_2);
-  half4 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  half4x4 const l_m = *(tint_symbol_1);
+  half4 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.msl
index 6e62a9c..ab3cc6d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant half4x4* tint_symbol_1 [[buffer(0)]]) {
-  half4x4 const l_m = *(tint_symbol_1);
-  half4 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant half4x4* tint_symbol [[buffer(0)]]) {
+  half4x4 const l_m = *(tint_symbol);
+  half4 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.msl
index 2d3c84a..b148ea1 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f16/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant half4x4* tint_symbol_1 [[buffer(0)]]) {
-  thread half4x4 tint_symbol = half4x4(0.0h);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].ywxz;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  half4x4 p;
+};
+
+kernel void f(const constant half4x4* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].ywxz;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
index 084622b..5650441 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/dynamic_index_via_ptr.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
-  return tint_symbol_1;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float4x4* tint_symbol_2 [[buffer(0)]]) {
-  int const tint_symbol = i();
+kernel void f(const constant float4x4* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.counter = 0;
+  int const tint_symbol = i(&(tint_private_vars));
   int const p_m_i_save = tint_symbol;
-  float4x4 const l_m = *(tint_symbol_2);
-  float4 const l_m_i = (*(tint_symbol_2))[p_m_i_save];
+  float4x4 const l_m = *(tint_symbol_1);
+  float4 const l_m_i = (*(tint_symbol_1))[p_m_i_save];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/static_index_via_ptr.wgsl.expected.msl
index 8118193..64bd465 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/static_index_via_ptr.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/static_index_via_ptr.wgsl.expected.msl
@@ -1,15 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int i() {
-  thread int tint_symbol = 0;
-  tint_symbol = as_type<int>((as_type<uint>(tint_symbol) + as_type<uint>(1)));
-  return tint_symbol;
+struct tint_private_vars_struct {
+  int counter;
+};
+
+int i(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-kernel void f(const constant float4x4* tint_symbol_1 [[buffer(0)]]) {
-  float4x4 const l_m = *(tint_symbol_1);
-  float4 const l_m_1 = (*(tint_symbol_1))[1];
+kernel void f(const constant float4x4* tint_symbol [[buffer(0)]]) {
+  float4x4 const l_m = *(tint_symbol);
+  float4 const l_m_1 = (*(tint_symbol))[1];
   return;
 }
 
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/to_private.wgsl.expected.msl
index 85112c6..8abad4e 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/to_private.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x4_f32/to_private.wgsl.expected.msl
@@ -1,12 +1,16 @@
 #include <metal_stdlib>
 
 using namespace metal;
-kernel void f(const constant float4x4* tint_symbol_1 [[buffer(0)]]) {
-  thread float4x4 tint_symbol = float4x4(0.0f);
-  tint_symbol = *(tint_symbol_1);
-  tint_symbol[1] = (*(tint_symbol_1))[0];
-  tint_symbol[1] = (*(tint_symbol_1))[0].ywxz;
-  tint_symbol[0][1] = (*(tint_symbol_1))[1][0];
+struct tint_private_vars_struct {
+  float4x4 p;
+};
+
+kernel void f(const constant float4x4* tint_symbol [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.p = *(tint_symbol);
+  tint_private_vars.p[1] = (*(tint_symbol))[0];
+  tint_private_vars.p[1] = (*(tint_symbol))[0].ywxz;
+  tint_private_vars.p[0][1] = (*(tint_symbol))[1][0];
   return;
 }
 
diff --git a/test/tint/bug/chromium/1343242.wgsl.expected.msl b/test/tint/bug/chromium/1343242.wgsl.expected.msl
index 466ceaa..af0dfef 100644
--- a/test/tint/bug/chromium/1343242.wgsl.expected.msl
+++ b/test/tint/bug/chromium/1343242.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool o;
+};
+
diff --git a/test/tint/bug/chromium/1367602_private_space_initializer_valid_count.wgsl.expected.msl b/test/tint/bug/chromium/1367602_private_space_initializer_valid_count.wgsl.expected.msl
index 7e5829a..0720c79 100644
--- a/test/tint/bug/chromium/1367602_private_space_initializer_valid_count.wgsl.expected.msl
+++ b/test/tint/bug/chromium/1367602_private_space_initializer_valid_count.wgsl.expected.msl
@@ -1,6 +1,23 @@
 #include <metal_stdlib>
 
 using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+    const constant T& operator[](size_t i) const constant { return elements[i]; }
+    device T& operator[](size_t i) device { return elements[i]; }
+    const device T& operator[](size_t i) const device { return elements[i]; }
+    thread T& operator[](size_t i) thread { return elements[i]; }
+    const thread T& operator[](size_t i) const thread { return elements[i]; }
+    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+    T elements[N];
+};
+
+struct tint_private_vars_struct {
+  tint_array<bool, 65535> v;
+};
+
 void f() {
 }
 
diff --git a/test/tint/bug/chromium/1367602_private_space_no_initializer_valid_count.wgsl.expected.msl b/test/tint/bug/chromium/1367602_private_space_no_initializer_valid_count.wgsl.expected.msl
index 7e5829a..0720c79 100644
--- a/test/tint/bug/chromium/1367602_private_space_no_initializer_valid_count.wgsl.expected.msl
+++ b/test/tint/bug/chromium/1367602_private_space_no_initializer_valid_count.wgsl.expected.msl
@@ -1,6 +1,23 @@
 #include <metal_stdlib>
 
 using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+    const constant T& operator[](size_t i) const constant { return elements[i]; }
+    device T& operator[](size_t i) device { return elements[i]; }
+    const device T& operator[](size_t i) const device { return elements[i]; }
+    thread T& operator[](size_t i) thread { return elements[i]; }
+    const thread T& operator[](size_t i) const thread { return elements[i]; }
+    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+    T elements[N];
+};
+
+struct tint_private_vars_struct {
+  tint_array<bool, 65535> v;
+};
+
 void f() {
 }
 
diff --git a/test/tint/bug/dawn/947.wgsl.expected.msl b/test/tint/bug/dawn/947.wgsl.expected.msl
index 02084ce..be7f37f 100644
--- a/test/tint/bug/dawn/947.wgsl.expected.msl
+++ b/test/tint/bug/dawn/947.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
 struct Uniforms {
   /* 0x0000 */ float2 u_scale;
   /* 0x0008 */ float2 u_offset;
@@ -58,21 +62,22 @@
   float4 value [[color(0)]];
 };
 
-float4 fs_main_inner(float2 texcoord, thread bool* const tint_symbol_6) {
+float4 fs_main_inner(float2 texcoord, thread tint_private_vars_struct* const tint_private_vars) {
   float2 clampedTexcoord = clamp(texcoord, float2(0.0f), float2(1.0f));
   if (!(all((clampedTexcoord == texcoord)))) {
-    *(tint_symbol_6) = true;
+    (*(tint_private_vars)).tint_discarded = true;
   }
   float4 srcColor = float4(0.0f);
   return srcColor;
 }
 
 fragment tint_symbol_3 fs_main(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread bool tint_symbol_7 = false;
-  float4 const inner_result_1 = fs_main_inner(tint_symbol_1.texcoord, &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
+  float4 const inner_result_1 = fs_main_inner(tint_symbol_1.texcoord, &(tint_private_vars));
   tint_symbol_3 wrapper_result_1 = {};
   wrapper_result_1.value = inner_result_1;
-  if (tint_symbol_7) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return wrapper_result_1;
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl
index 8ac8114..b21bb5e 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl
@@ -14,21 +14,25 @@
     T elements[N];
 };
 
-struct UBO {
-  /* 0x0000 */ int dynamic_idx;
-};
-
 struct S {
   tint_array<int, 64> data;
 };
 
+struct tint_private_vars_struct {
+  S s;
+};
+
+struct UBO {
+  /* 0x0000 */ int dynamic_idx;
+};
+
 struct Result {
   /* 0x0000 */ int out;
 };
 
-kernel void f(device Result* tint_symbol [[buffer(1)]], const constant UBO* tint_symbol_2 [[buffer(0)]]) {
-  thread S tint_symbol_1 = {};
-  (*(tint_symbol)).out = tint_symbol_1.data[(*(tint_symbol_2)).dynamic_idx];
+kernel void f(device Result* tint_symbol [[buffer(1)]], const constant UBO* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  (*(tint_symbol)).out = tint_private_vars.s.data[(*(tint_symbol_1)).dynamic_idx];
   return;
 }
 
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl
index 6f94f24..a720c5a 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl
@@ -14,22 +14,26 @@
     T elements[N];
 };
 
-struct UBO {
-  /* 0x0000 */ int dynamic_idx;
-};
-
 struct S {
   tint_array<int, 64> data;
 };
 
+struct tint_private_vars_struct {
+  S s;
+};
+
+struct UBO {
+  /* 0x0000 */ int dynamic_idx;
+};
+
 struct Result {
   /* 0x0000 */ int out;
 };
 
-kernel void f(const constant UBO* tint_symbol_1 [[buffer(0)]], device Result* tint_symbol_2 [[buffer(1)]]) {
-  thread S tint_symbol = {};
-  tint_symbol.data[(*(tint_symbol_1)).dynamic_idx] = 1;
-  (*(tint_symbol_2)).out = tint_symbol.data[3];
+kernel void f(const constant UBO* tint_symbol [[buffer(0)]], device Result* tint_symbol_1 [[buffer(1)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.s.data[(*(tint_symbol)).dynamic_idx] = 1;
+  (*(tint_symbol_1)).out = tint_private_vars.s.data[3];
   return;
 }
 
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl
index 0a31f28..baad148 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl
@@ -14,14 +14,18 @@
     T elements[N];
 };
 
-struct UBO {
-  /* 0x0000 */ int dynamic_idx;
-};
-
 struct S {
   tint_array<int, 64> data;
 };
 
+struct tint_private_vars_struct {
+  S s;
+};
+
+struct UBO {
+  /* 0x0000 */ int dynamic_idx;
+};
+
 struct Result {
   /* 0x0000 */ int out;
 };
@@ -30,10 +34,10 @@
   (*(p)).data[(*(tint_symbol)).dynamic_idx] = 1;
 }
 
-kernel void f(const constant UBO* tint_symbol_2 [[buffer(0)]], device Result* tint_symbol_3 [[buffer(1)]]) {
-  thread S tint_symbol_1 = {};
-  x(&(tint_symbol_1), tint_symbol_2);
-  (*(tint_symbol_3)).out = tint_symbol_1.data[3];
+kernel void f(const constant UBO* tint_symbol_1 [[buffer(0)]], device Result* tint_symbol_2 [[buffer(1)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  x(&(tint_private_vars.s), tint_symbol_1);
+  (*(tint_symbol_2)).out = tint_private_vars.s.data[3];
   return;
 }
 
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.msl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.msl
index 4e4bb57..d599ebc 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.msl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.msl
@@ -1,14 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m1;
+};
+
 struct Uniforms {
   /* 0x0000 */ uint i;
   /* 0x0004 */ uint j;
 };
 
-kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
-  thread float2x4 tint_symbol_1 = float2x4(0.0f);
-  tint_symbol_1[0][(*(tint_symbol_2)).j] = 1.0f;
+kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.m1[0][(*(tint_symbol_1)).j] = 1.0f;
   return;
 }
 
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.msl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.msl
index 31c3003..236ea4b 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.msl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.msl
@@ -1,14 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m1;
+};
+
 struct Uniforms {
   /* 0x0000 */ uint i;
   /* 0x0004 */ uint j;
 };
 
-kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
-  thread float2x4 tint_symbol_1 = float2x4(0.0f);
-  tint_symbol_1[(*(tint_symbol_2)).i][0] = 1.0f;
+kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.m1[(*(tint_symbol_1)).i][0] = 1.0f;
   return;
 }
 
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.msl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.msl
index 7215cb0..41f85ae 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.msl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.msl
@@ -1,14 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m1;
+};
+
 struct Uniforms {
   /* 0x0000 */ uint i;
   /* 0x0004 */ uint j;
 };
 
-kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
-  thread float2x4 tint_symbol_1 = float2x4(0.0f);
-  tint_symbol_1[(*(tint_symbol_2)).i][(*(tint_symbol_2)).j] = 1.0f;
+kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.m1[(*(tint_symbol_1)).i][(*(tint_symbol_1)).j] = 1.0f;
   return;
 }
 
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.msl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.msl
index 4e4bb57..d599ebc 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.msl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.msl
@@ -1,14 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m1;
+};
+
 struct Uniforms {
   /* 0x0000 */ uint i;
   /* 0x0004 */ uint j;
 };
 
-kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
-  thread float2x4 tint_symbol_1 = float2x4(0.0f);
-  tint_symbol_1[0][(*(tint_symbol_2)).j] = 1.0f;
+kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.m1[0][(*(tint_symbol_1)).j] = 1.0f;
   return;
 }
 
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.msl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.msl
index 6c3bb03..fbdeeb9 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.msl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.msl
@@ -1,14 +1,18 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m1;
+};
+
 struct Uniforms {
   /* 0x0000 */ uint i;
   /* 0x0004 */ uint j;
 };
 
-kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
-  thread float2x4 tint_symbol_1 = float2x4(0.0f);
-  tint_symbol_1[(*(tint_symbol_2)).i] = float4(1.0f);
+kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.m1[(*(tint_symbol_1)).i] = float4(1.0f);
   return;
 }
 
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.msl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.msl
index e30b1c1..91fd58a 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.msl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.msl
@@ -1,22 +1,26 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void foo() {
-  thread float2 tint_symbol_1 = 0.0f;
-  thread int3 tint_symbol_2 = 0;
-  thread uint4 tint_symbol_3 = 0u;
-  thread bool2 tint_symbol_4 = false;
+struct tint_private_vars_struct {
+  float2 v2f;
+  int3 v3i;
+  uint4 v4u;
+  bool2 v2b;
+};
+
+void foo(thread tint_private_vars_struct* const tint_private_vars) {
   for(int i = 0; (i < 2); i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)))) {
-    tint_symbol_1[i] = 1.0f;
-    tint_symbol_2[i] = 1;
-    tint_symbol_3[i] = 1u;
-    tint_symbol_4[i] = true;
+    (*(tint_private_vars)).v2f[i] = 1.0f;
+    (*(tint_private_vars)).v3i[i] = 1;
+    (*(tint_private_vars)).v4u[i] = 1u;
+    (*(tint_private_vars)).v2b[i] = true;
   }
 }
 
 kernel void tint_symbol() {
+  thread tint_private_vars_struct tint_private_vars = {};
   for(int i = 0; (i < 2); i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)))) {
-    foo();
+    foo(&(tint_private_vars));
   }
   return;
 }
diff --git a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.msl b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.msl
index 920f566..1c06a5e 100644
--- a/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.msl
+++ b/test/tint/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.msl
@@ -1,21 +1,25 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void foo() {
-  thread float2 tint_symbol_1 = 0.0f;
-  thread int3 tint_symbol_2 = 0;
-  thread uint4 tint_symbol_3 = 0u;
-  thread bool2 tint_symbol_4 = false;
+struct tint_private_vars_struct {
+  float2 v2f;
+  int3 v3i;
+  uint4 v4u;
+  bool2 v2b;
+};
+
+void foo(thread tint_private_vars_struct* const tint_private_vars) {
   int i = 0;
-  tint_symbol_1[i] = 1.0f;
-  tint_symbol_2[i] = 1;
-  tint_symbol_3[i] = 1u;
-  tint_symbol_4[i] = true;
+  (*(tint_private_vars)).v2f[i] = 1.0f;
+  (*(tint_private_vars)).v3i[i] = 1;
+  (*(tint_private_vars)).v4u[i] = 1u;
+  (*(tint_private_vars)).v2b[i] = true;
 }
 
 kernel void tint_symbol() {
+  thread tint_private_vars_struct tint_private_vars = {};
   for(int i = 0; (i < 2); i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)))) {
-    foo();
+    foo(&(tint_private_vars));
   }
   return;
 }
diff --git a/test/tint/bug/tint/1061.spvasm.expected.msl b/test/tint/bug/tint/1061.spvasm.expected.msl
index 2ef0acd..8563c71 100644
--- a/test/tint/bug/tint/1061.spvasm.expected.msl
+++ b/test/tint/bug/tint/1061.spvasm.expected.msl
@@ -1,11 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 x_GLF_color;
+};
+
 struct buf0 {
   /* 0x0000 */ float4 r;
 };
 
-void main_1(const constant buf0* const tint_symbol_3, thread float4* const tint_symbol_4) {
+void main_1(thread tint_private_vars_struct* const tint_private_vars, const constant buf0* const tint_symbol_3) {
   float f = 0.0f;
   float4 v = 0.0f;
   f = 1.0f;
@@ -17,9 +21,9 @@
   float4 const x_42 = v;
   float4 const x_44 = (*(tint_symbol_3)).r;
   if ((distance(x_42, x_44) < 0.10000000149011611938f)) {
-    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    (*(tint_private_vars)).x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
   } else {
-    *(tint_symbol_4) = float4(0.0f);
+    (*(tint_private_vars)).x_GLF_color = float4(0.0f);
   }
   return;
 }
@@ -32,15 +36,15 @@
   float4 x_GLF_color_1 [[color(0)]];
 };
 
-main_out tint_symbol_inner(const constant buf0* const tint_symbol_5, thread float4* const tint_symbol_6) {
-  main_1(tint_symbol_5, tint_symbol_6);
-  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
+main_out tint_symbol_inner(thread tint_private_vars_struct* const tint_private_vars, const constant buf0* const tint_symbol_4) {
+  main_1(tint_private_vars, tint_symbol_4);
+  main_out const tint_symbol_2 = {.x_GLF_color_1=(*(tint_private_vars)).x_GLF_color};
   return tint_symbol_2;
 }
 
-fragment tint_symbol_1 tint_symbol(const constant buf0* tint_symbol_7 [[buffer(0)]]) {
-  thread float4 tint_symbol_8 = 0.0f;
-  main_out const inner_result = tint_symbol_inner(tint_symbol_7, &(tint_symbol_8));
+fragment tint_symbol_1 tint_symbol(const constant buf0* tint_symbol_5 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_out const inner_result = tint_symbol_inner(&(tint_private_vars), tint_symbol_5);
   tint_symbol_1 wrapper_result = {};
   wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
   return wrapper_result;
diff --git a/test/tint/bug/tint/1081.wgsl.expected.msl b/test/tint/bug/tint/1081.wgsl.expected.msl
index 1194ebf..5b9ce54 100644
--- a/test/tint/bug/tint/1081.wgsl.expected.msl
+++ b/test/tint/bug/tint/1081.wgsl.expected.msl
@@ -1,9 +1,13 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int f(int x, thread bool* const tint_symbol_4) {
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
+int f(int x, thread tint_private_vars_struct* const tint_private_vars) {
   if ((x == 10)) {
-    *(tint_symbol_4) = true;
+    (*(tint_private_vars)).tint_discarded = true;
   }
   return x;
 }
@@ -16,10 +20,10 @@
   int value [[color(2)]];
 };
 
-int tint_symbol_inner(int3 x, thread bool* const tint_symbol_5) {
+int tint_symbol_inner(int3 x, thread tint_private_vars_struct* const tint_private_vars) {
   int y = x[0];
   while (true) {
-    int const r = f(y, tint_symbol_5);
+    int const r = f(y, tint_private_vars);
     if ((r == 0)) {
       break;
     }
@@ -28,11 +32,12 @@
 }
 
 fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread bool tint_symbol_6 = false;
-  int const inner_result = tint_symbol_inner(tint_symbol_1.x, &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
+  int const inner_result = tint_symbol_inner(tint_symbol_1.x, &(tint_private_vars));
   tint_symbol_3 wrapper_result = {};
   wrapper_result.value = inner_result;
-  if (tint_symbol_6) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return wrapper_result;
diff --git a/test/tint/bug/tint/1086.wgsl.expected.msl b/test/tint/bug/tint/1086.wgsl.expected.msl
index 8ea0e89..52ba66b 100644
--- a/test/tint/bug/tint/1086.wgsl.expected.msl
+++ b/test/tint/bug/tint/1086.wgsl.expected.msl
@@ -1,17 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float v;
+};
+
 void x(thread float* const p) {
   *(p) = 0.0f;
 }
 
-void g() {
-  thread float tint_symbol = 0.0f;
-  x(&(tint_symbol));
+void g(thread tint_private_vars_struct* const tint_private_vars) {
+  x(&((*(tint_private_vars)).v));
 }
 
 fragment void f() {
-  g();
+  thread tint_private_vars_struct tint_private_vars = {};
+  g(&(tint_private_vars));
   return;
 }
 
diff --git a/test/tint/bug/tint/1088.spvasm.expected.msl b/test/tint/bug/tint/1088.spvasm.expected.msl
index 2fc3f5f..cd127ac 100644
--- a/test/tint/bug/tint/1088.spvasm.expected.msl
+++ b/test/tint/bug/tint/1088.spvasm.expected.msl
@@ -14,6 +14,14 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float3 position_1;
+  float2 vUV;
+  float2 uv;
+  float3 normal;
+  float4 gl_Position;
+};
+
 struct strided_arr {
   /* 0x0000 */ float el;
   /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
@@ -27,28 +35,28 @@
   /* 0x00d0 */ tint_array<strided_arr, 4> test;
 };
 
-void main_1(thread float3* const tint_symbol_5, const constant LeftOver* const tint_symbol_6, thread float4* const tint_symbol_7, thread float2* const tint_symbol_8, thread float2* const tint_symbol_9) {
+void main_1(thread tint_private_vars_struct* const tint_private_vars, const constant LeftOver* const tint_symbol_5) {
   float4 q = 0.0f;
   float3 p = 0.0f;
-  float3 const x_13 = *(tint_symbol_5);
+  float3 const x_13 = (*(tint_private_vars)).position_1;
   q = float4(x_13[0], x_13[1], x_13[2], 1.0f);
   float4 const x_21 = q;
   p = float3(x_21[0], x_21[1], x_21[2]);
   float const x_27 = p[0];
-  float const x_41 = (*(tint_symbol_6)).test[0].el;
-  float const x_45 = (*(tint_symbol_5))[1];
-  float const x_49 = (*(tint_symbol_6)).time;
+  float const x_41 = (*(tint_symbol_5)).test[0].el;
+  float const x_45 = (*(tint_private_vars)).position_1[1];
+  float const x_49 = (*(tint_symbol_5)).time;
   p[0] = (x_27 + sin(((x_41 * x_45) + x_49)));
   float const x_55 = p[1];
-  float const x_57 = (*(tint_symbol_6)).time;
+  float const x_57 = (*(tint_symbol_5)).time;
   p[1] = (x_55 + sin((x_57 + 4.0f)));
-  float4x4 const x_69 = (*(tint_symbol_6)).worldViewProjection;
+  float4x4 const x_69 = (*(tint_symbol_5)).worldViewProjection;
   float3 const x_70 = p;
-  *(tint_symbol_7) = (x_69 * float4(x_70[0], x_70[1], x_70[2], 1.0f));
-  float2 const x_83 = *(tint_symbol_8);
-  *(tint_symbol_9) = x_83;
-  float const x_87 = (*(tint_symbol_7))[1];
-  (*(tint_symbol_7))[1] = (x_87 * -1.0f);
+  (*(tint_private_vars)).gl_Position = (x_69 * float4(x_70[0], x_70[1], x_70[2], 1.0f));
+  float2 const x_83 = (*(tint_private_vars)).uv;
+  (*(tint_private_vars)).vUV = x_83;
+  float const x_87 = (*(tint_private_vars)).gl_Position[1];
+  (*(tint_private_vars)).gl_Position[1] = (x_87 * -1.0f);
   return;
 }
 
@@ -68,22 +76,18 @@
   float4 gl_Position [[position]];
 };
 
-main_out tint_symbol_inner(float3 position_1_param, float2 uv_param, float3 normal_param, thread float3* const tint_symbol_10, thread float2* const tint_symbol_11, const constant LeftOver* const tint_symbol_13, thread float4* const tint_symbol_14, thread float2* const tint_symbol_15) {
-  thread float3 tint_symbol_12 = 0.0f;
-  *(tint_symbol_10) = position_1_param;
-  *(tint_symbol_11) = uv_param;
-  tint_symbol_12 = normal_param;
-  main_1(tint_symbol_10, tint_symbol_13, tint_symbol_14, tint_symbol_11, tint_symbol_15);
-  main_out const tint_symbol_4 = {.gl_Position=*(tint_symbol_14), .vUV_1=*(tint_symbol_15)};
+main_out tint_symbol_inner(float3 position_1_param, float2 uv_param, float3 normal_param, thread tint_private_vars_struct* const tint_private_vars, const constant LeftOver* const tint_symbol_6) {
+  (*(tint_private_vars)).position_1 = position_1_param;
+  (*(tint_private_vars)).uv = uv_param;
+  (*(tint_private_vars)).normal = normal_param;
+  main_1(tint_private_vars, tint_symbol_6);
+  main_out const tint_symbol_4 = {.gl_Position=(*(tint_private_vars)).gl_Position, .vUV_1=(*(tint_private_vars)).vUV};
   return tint_symbol_4;
 }
 
-vertex tint_symbol_3 tint_symbol(const constant LeftOver* tint_symbol_18 [[buffer(0)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread float3 tint_symbol_16 = 0.0f;
-  thread float2 tint_symbol_17 = 0.0f;
-  thread float4 tint_symbol_19 = 0.0f;
-  thread float2 tint_symbol_20 = 0.0f;
-  main_out const inner_result = tint_symbol_inner(tint_symbol_1.position_1_param, tint_symbol_1.uv_param, tint_symbol_1.normal_param, &(tint_symbol_16), &(tint_symbol_17), tint_symbol_18, &(tint_symbol_19), &(tint_symbol_20));
+vertex tint_symbol_3 tint_symbol(const constant LeftOver* tint_symbol_7 [[buffer(0)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_out const inner_result = tint_symbol_inner(tint_symbol_1.position_1_param, tint_symbol_1.uv_param, tint_symbol_1.normal_param, &(tint_private_vars), tint_symbol_7);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.gl_Position = inner_result.gl_Position;
   wrapper_result.vUV_1 = inner_result.vUV_1;
diff --git a/test/tint/bug/tint/1118.wgsl.expected.msl b/test/tint/bug/tint/1118.wgsl.expected.msl
index 2b4c8d4..f81aa50 100644
--- a/test/tint/bug/tint/1118.wgsl.expected.msl
+++ b/test/tint/bug/tint/1118.wgsl.expected.msl
@@ -1,6 +1,13 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool tint_discarded;
+  float fClipDistance3;
+  float fClipDistance4;
+  float4 glFragColor;
+};
+
 struct Material_tint_packed_vec3 {
   /* 0x0000 */ float4 vDiffuseColor;
   /* 0x0010 */ packed_float3 vAmbientColor;
@@ -25,7 +32,7 @@
   /* 0x0000 */ float visibility;
 };
 
-void main_1(thread float* const tint_symbol_5, thread bool* const tint_symbol_6, thread float* const tint_symbol_7, const constant Scene* const tint_symbol_8, const constant Material_tint_packed_vec3* const tint_symbol_9, const constant Mesh* const tint_symbol_10, thread float4* const tint_symbol_11) {
+void main_1(thread tint_private_vars_struct* const tint_private_vars, const constant Scene* const tint_symbol_5, const constant Material_tint_packed_vec3* const tint_symbol_6, const constant Mesh* const tint_symbol_7) {
   float3 viewDirectionW = 0.0f;
   float4 baseColor = 0.0f;
   float3 diffuseColor = 0.0f;
@@ -42,21 +49,21 @@
   float3 finalDiffuse = 0.0f;
   float3 finalSpecular = 0.0f;
   float4 color = 0.0f;
-  float const x_9 = *(tint_symbol_5);
+  float const x_9 = (*(tint_private_vars)).fClipDistance3;
   if ((x_9 > 0.0f)) {
-    *(tint_symbol_6) = true;
+    (*(tint_private_vars)).tint_discarded = true;
   }
-  float const x_17 = *(tint_symbol_7);
+  float const x_17 = (*(tint_private_vars)).fClipDistance4;
   if ((x_17 > 0.0f)) {
-    *(tint_symbol_6) = true;
+    (*(tint_private_vars)).tint_discarded = true;
   }
-  float4 const x_34 = (*(tint_symbol_8)).vEyePosition;
+  float4 const x_34 = (*(tint_symbol_5)).vEyePosition;
   float3 const x_38 = float3(0.0f);
   viewDirectionW = normalize((float3(x_34[0], x_34[1], x_34[2]) - x_38));
   baseColor = float4(1.0f);
-  float4 const x_52 = (*(tint_symbol_9)).vDiffuseColor;
+  float4 const x_52 = (*(tint_symbol_6)).vDiffuseColor;
   diffuseColor = float3(x_52[0], x_52[1], x_52[2]);
-  float const x_60 = (*(tint_symbol_9)).vDiffuseColor[3];
+  float const x_60 = (*(tint_symbol_6)).vDiffuseColor[3];
   alpha = x_60;
   float3 const x_62 = float3(0.0f);
   float3 const x_64 = float3(0.0f);
@@ -72,12 +79,12 @@
   shadow = 1.0f;
   refractionColor = float4(0.0f, 0.0f, 0.0f, 1.0f);
   reflectionColor = float4(0.0f, 0.0f, 0.0f, 1.0f);
-  float3 const x_94 = float3((*(tint_symbol_9)).vEmissiveColor);
+  float3 const x_94 = float3((*(tint_symbol_6)).vEmissiveColor);
   emissiveColor = x_94;
   float3 const x_96 = diffuseBase;
   float3 const x_97 = diffuseColor;
   float3 const x_99 = emissiveColor;
-  float3 const x_103 = float3((*(tint_symbol_9)).vAmbientColor);
+  float3 const x_103 = float3((*(tint_symbol_6)).vAmbientColor);
   float4 const x_108 = baseColor;
   finalDiffuse = (clamp((((x_96 * x_97) + x_99) + x_103), float3(0.0f), float3(1.0f)) * float3(x_108[0], x_108[1], x_108[2]));
   finalSpecular = float3(0.0f);
@@ -93,11 +100,11 @@
   float3 const x_132 = fmax(float3(x_129[0], x_129[1], x_129[2]), float3(0.0f));
   float4 const x_133 = color;
   color = float4(x_132[0], x_132[1], x_132[2], x_133[3]);
-  float const x_140 = (*(tint_symbol_10)).visibility;
+  float const x_140 = (*(tint_symbol_7)).visibility;
   float const x_142 = color[3];
   color[3] = (x_142 * x_140);
   float4 const x_147 = color;
-  *(tint_symbol_11) = x_147;
+  (*(tint_private_vars)).glFragColor = x_147;
   return;
 }
 
@@ -114,23 +121,21 @@
   float4 glFragColor_1 [[color(0)]];
 };
 
-main_out tint_symbol_inner(float fClipDistance3_param, float fClipDistance4_param, thread float* const tint_symbol_12, thread float* const tint_symbol_13, thread bool* const tint_symbol_14, const constant Scene* const tint_symbol_15, const constant Material_tint_packed_vec3* const tint_symbol_16, const constant Mesh* const tint_symbol_17, thread float4* const tint_symbol_18) {
-  *(tint_symbol_12) = fClipDistance3_param;
-  *(tint_symbol_13) = fClipDistance4_param;
-  main_1(tint_symbol_12, tint_symbol_14, tint_symbol_13, tint_symbol_15, tint_symbol_16, tint_symbol_17, tint_symbol_18);
-  main_out const tint_symbol_4 = {.glFragColor_1=*(tint_symbol_18)};
+main_out tint_symbol_inner(float fClipDistance3_param, float fClipDistance4_param, thread tint_private_vars_struct* const tint_private_vars, const constant Scene* const tint_symbol_8, const constant Material_tint_packed_vec3* const tint_symbol_9, const constant Mesh* const tint_symbol_10) {
+  (*(tint_private_vars)).fClipDistance3 = fClipDistance3_param;
+  (*(tint_private_vars)).fClipDistance4 = fClipDistance4_param;
+  main_1(tint_private_vars, tint_symbol_8, tint_symbol_9, tint_symbol_10);
+  main_out const tint_symbol_4 = {.glFragColor_1=(*(tint_private_vars)).glFragColor};
   return tint_symbol_4;
 }
 
-fragment tint_symbol_3 tint_symbol(const constant Scene* tint_symbol_22 [[buffer(0)]], const constant Material_tint_packed_vec3* tint_symbol_23 [[buffer(1)]], const constant Mesh* tint_symbol_24 [[buffer(2)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread float tint_symbol_19 = 0.0f;
-  thread float tint_symbol_20 = 0.0f;
-  thread bool tint_symbol_21 = false;
-  thread float4 tint_symbol_25 = 0.0f;
-  main_out const inner_result = tint_symbol_inner(tint_symbol_1.fClipDistance3_param, tint_symbol_1.fClipDistance4_param, &(tint_symbol_19), &(tint_symbol_20), &(tint_symbol_21), tint_symbol_22, tint_symbol_23, tint_symbol_24, &(tint_symbol_25));
+fragment tint_symbol_3 tint_symbol(const constant Scene* tint_symbol_11 [[buffer(0)]], const constant Material_tint_packed_vec3* tint_symbol_12 [[buffer(1)]], const constant Mesh* tint_symbol_13 [[buffer(2)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
+  main_out const inner_result = tint_symbol_inner(tint_symbol_1.fClipDistance3_param, tint_symbol_1.fClipDistance4_param, &(tint_private_vars), tint_symbol_11, tint_symbol_12, tint_symbol_13);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.glFragColor_1 = inner_result.glFragColor_1;
-  if (tint_symbol_21) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return wrapper_result;
diff --git a/test/tint/bug/tint/1369.wgsl.expected.msl b/test/tint/bug/tint/1369.wgsl.expected.msl
index 8793220..516228f 100644
--- a/test/tint/bug/tint/1369.wgsl.expected.msl
+++ b/test/tint/bug/tint/1369.wgsl.expected.msl
@@ -1,16 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool call_discard(thread bool* const tint_symbol) {
-  *(tint_symbol) = true;
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
+bool call_discard(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).tint_discarded = true;
   return true;
 }
 
 fragment void f() {
-  thread bool tint_symbol_1 = false;
-  bool v = call_discard(&(tint_symbol_1));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
+  bool v = call_discard(&(tint_private_vars));
   bool also_unreachable = false;
-  if (tint_symbol_1) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return;
diff --git a/test/tint/bug/tint/1509.wgsl.expected.msl b/test/tint/bug/tint/1509.wgsl.expected.msl
index 6578403..0bcc2a4 100644
--- a/test/tint/bug/tint/1509.wgsl.expected.msl
+++ b/test/tint/bug/tint/1509.wgsl.expected.msl
@@ -1,2008 +1,2011 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint foo() {
-  thread uint tint_symbol_2 = 0u;
-  thread uint tint_symbol_3 = 0u;
-  thread uint tint_symbol_4 = 0u;
-  thread uint tint_symbol_5 = 0u;
-  thread uint tint_symbol_6 = 0u;
-  thread uint tint_symbol_7 = 0u;
-  thread uint tint_symbol_8 = 0u;
-  thread uint tint_symbol_9 = 0u;
-  thread uint tint_symbol_10 = 0u;
-  thread uint tint_symbol_11 = 0u;
-  thread uint tint_symbol_12 = 0u;
-  thread uint tint_symbol_13 = 0u;
-  thread uint tint_symbol_14 = 0u;
-  thread uint tint_symbol_15 = 0u;
-  thread uint tint_symbol_16 = 0u;
-  thread uint tint_symbol_17 = 0u;
-  thread uint tint_symbol_18 = 0u;
-  thread uint tint_symbol_19 = 0u;
-  thread uint tint_symbol_20 = 0u;
-  thread uint tint_symbol_21 = 0u;
-  thread uint tint_symbol_22 = 0u;
-  thread uint tint_symbol_23 = 0u;
-  thread uint tint_symbol_24 = 0u;
-  thread uint tint_symbol_25 = 0u;
-  thread uint tint_symbol_26 = 0u;
-  thread uint tint_symbol_27 = 0u;
-  thread uint tint_symbol_28 = 0u;
-  thread uint tint_symbol_29 = 0u;
-  thread uint tint_symbol_30 = 0u;
-  thread uint tint_symbol_31 = 0u;
-  thread uint tint_symbol_32 = 0u;
-  thread uint tint_symbol_33 = 0u;
-  thread uint tint_symbol_34 = 0u;
-  thread uint tint_symbol_35 = 0u;
-  thread uint tint_symbol_36 = 0u;
-  thread uint tint_symbol_37 = 0u;
-  thread uint tint_symbol_38 = 0u;
-  thread uint tint_symbol_39 = 0u;
-  thread uint tint_symbol_40 = 0u;
-  thread uint tint_symbol_41 = 0u;
-  thread uint tint_symbol_42 = 0u;
-  thread uint tint_symbol_43 = 0u;
-  thread uint tint_symbol_44 = 0u;
-  thread uint tint_symbol_45 = 0u;
-  thread uint tint_symbol_46 = 0u;
-  thread uint tint_symbol_47 = 0u;
-  thread uint tint_symbol_48 = 0u;
-  thread uint tint_symbol_49 = 0u;
-  thread uint tint_symbol_50 = 0u;
-  thread uint tint_symbol_51 = 0u;
-  thread uint tint_symbol_52 = 0u;
-  thread uint tint_symbol_53 = 0u;
-  thread uint tint_symbol_54 = 0u;
-  thread uint tint_symbol_55 = 0u;
-  thread uint tint_symbol_56 = 0u;
-  thread uint tint_symbol_57 = 0u;
-  thread uint tint_symbol_58 = 0u;
-  thread uint tint_symbol_59 = 0u;
-  thread uint tint_symbol_60 = 0u;
-  thread uint tint_symbol_61 = 0u;
-  thread uint tint_symbol_62 = 0u;
-  thread uint tint_symbol_63 = 0u;
-  thread uint tint_symbol_64 = 0u;
-  thread uint tint_symbol_65 = 0u;
-  thread uint tint_symbol_66 = 0u;
-  thread uint tint_symbol_67 = 0u;
-  thread uint tint_symbol_68 = 0u;
-  thread uint tint_symbol_69 = 0u;
-  thread uint tint_symbol_70 = 0u;
-  thread uint tint_symbol_71 = 0u;
-  thread uint tint_symbol_72 = 0u;
-  thread uint tint_symbol_73 = 0u;
-  thread uint tint_symbol_74 = 0u;
-  thread uint tint_symbol_75 = 0u;
-  thread uint tint_symbol_76 = 0u;
-  thread uint tint_symbol_77 = 0u;
-  thread uint tint_symbol_78 = 0u;
-  thread uint tint_symbol_79 = 0u;
-  thread uint tint_symbol_80 = 0u;
-  thread uint tint_symbol_81 = 0u;
-  thread uint tint_symbol_82 = 0u;
-  thread uint tint_symbol_83 = 0u;
-  thread uint tint_symbol_84 = 0u;
-  thread uint tint_symbol_85 = 0u;
-  thread uint tint_symbol_86 = 0u;
-  thread uint tint_symbol_87 = 0u;
-  thread uint tint_symbol_88 = 0u;
-  thread uint tint_symbol_89 = 0u;
-  thread uint tint_symbol_90 = 0u;
-  thread uint tint_symbol_91 = 0u;
-  thread uint tint_symbol_92 = 0u;
-  thread uint tint_symbol_93 = 0u;
-  thread uint tint_symbol_94 = 0u;
-  thread uint tint_symbol_95 = 0u;
-  thread uint tint_symbol_96 = 0u;
-  thread uint tint_symbol_97 = 0u;
-  thread uint tint_symbol_98 = 0u;
-  thread uint tint_symbol_99 = 0u;
-  thread uint tint_symbol_100 = 0u;
-  thread uint tint_symbol_101 = 0u;
-  thread uint tint_symbol_102 = 0u;
-  thread uint tint_symbol_103 = 0u;
-  thread uint tint_symbol_104 = 0u;
-  thread uint tint_symbol_105 = 0u;
-  thread uint tint_symbol_106 = 0u;
-  thread uint tint_symbol_107 = 0u;
-  thread uint tint_symbol_108 = 0u;
-  thread uint tint_symbol_109 = 0u;
-  thread uint tint_symbol_110 = 0u;
-  thread uint tint_symbol_111 = 0u;
-  thread uint tint_symbol_112 = 0u;
-  thread uint tint_symbol_113 = 0u;
-  thread uint tint_symbol_114 = 0u;
-  thread uint tint_symbol_115 = 0u;
-  thread uint tint_symbol_116 = 0u;
-  thread uint tint_symbol_117 = 0u;
-  thread uint tint_symbol_118 = 0u;
-  thread uint tint_symbol_119 = 0u;
-  thread uint tint_symbol_120 = 0u;
-  thread uint tint_symbol_121 = 0u;
-  thread uint tint_symbol_122 = 0u;
-  thread uint tint_symbol_123 = 0u;
-  thread uint tint_symbol_124 = 0u;
-  thread uint tint_symbol_125 = 0u;
-  thread uint tint_symbol_126 = 0u;
-  thread uint tint_symbol_127 = 0u;
-  thread uint tint_symbol_128 = 0u;
-  thread uint tint_symbol_129 = 0u;
-  thread uint tint_symbol_130 = 0u;
-  thread uint tint_symbol_131 = 0u;
-  thread uint tint_symbol_132 = 0u;
-  thread uint tint_symbol_133 = 0u;
-  thread uint tint_symbol_134 = 0u;
-  thread uint tint_symbol_135 = 0u;
-  thread uint tint_symbol_136 = 0u;
-  thread uint tint_symbol_137 = 0u;
-  thread uint tint_symbol_138 = 0u;
-  thread uint tint_symbol_139 = 0u;
-  thread uint tint_symbol_140 = 0u;
-  thread uint tint_symbol_141 = 0u;
-  thread uint tint_symbol_142 = 0u;
-  thread uint tint_symbol_143 = 0u;
-  thread uint tint_symbol_144 = 0u;
-  thread uint tint_symbol_145 = 0u;
-  thread uint tint_symbol_146 = 0u;
-  thread uint tint_symbol_147 = 0u;
-  thread uint tint_symbol_148 = 0u;
-  thread uint tint_symbol_149 = 0u;
-  thread uint tint_symbol_150 = 0u;
-  thread uint tint_symbol_151 = 0u;
-  thread uint tint_symbol_152 = 0u;
-  thread uint tint_symbol_153 = 0u;
-  thread uint tint_symbol_154 = 0u;
-  thread uint tint_symbol_155 = 0u;
-  thread uint tint_symbol_156 = 0u;
-  thread uint tint_symbol_157 = 0u;
-  thread uint tint_symbol_158 = 0u;
-  thread uint tint_symbol_159 = 0u;
-  thread uint tint_symbol_160 = 0u;
-  thread uint tint_symbol_161 = 0u;
-  thread uint tint_symbol_162 = 0u;
-  thread uint tint_symbol_163 = 0u;
-  thread uint tint_symbol_164 = 0u;
-  thread uint tint_symbol_165 = 0u;
-  thread uint tint_symbol_166 = 0u;
-  thread uint tint_symbol_167 = 0u;
-  thread uint tint_symbol_168 = 0u;
-  thread uint tint_symbol_169 = 0u;
-  thread uint tint_symbol_170 = 0u;
-  thread uint tint_symbol_171 = 0u;
-  thread uint tint_symbol_172 = 0u;
-  thread uint tint_symbol_173 = 0u;
-  thread uint tint_symbol_174 = 0u;
-  thread uint tint_symbol_175 = 0u;
-  thread uint tint_symbol_176 = 0u;
-  thread uint tint_symbol_177 = 0u;
-  thread uint tint_symbol_178 = 0u;
-  thread uint tint_symbol_179 = 0u;
-  thread uint tint_symbol_180 = 0u;
-  thread uint tint_symbol_181 = 0u;
-  thread uint tint_symbol_182 = 0u;
-  thread uint tint_symbol_183 = 0u;
-  thread uint tint_symbol_184 = 0u;
-  thread uint tint_symbol_185 = 0u;
-  thread uint tint_symbol_186 = 0u;
-  thread uint tint_symbol_187 = 0u;
-  thread uint tint_symbol_188 = 0u;
-  thread uint tint_symbol_189 = 0u;
-  thread uint tint_symbol_190 = 0u;
-  thread uint tint_symbol_191 = 0u;
-  thread uint tint_symbol_192 = 0u;
-  thread uint tint_symbol_193 = 0u;
-  thread uint tint_symbol_194 = 0u;
-  thread uint tint_symbol_195 = 0u;
-  thread uint tint_symbol_196 = 0u;
-  thread uint tint_symbol_197 = 0u;
-  thread uint tint_symbol_198 = 0u;
-  thread uint tint_symbol_199 = 0u;
-  thread uint tint_symbol_200 = 0u;
-  thread uint tint_symbol_201 = 0u;
-  thread uint tint_symbol_202 = 0u;
-  thread uint tint_symbol_203 = 0u;
-  thread uint tint_symbol_204 = 0u;
-  thread uint tint_symbol_205 = 0u;
-  thread uint tint_symbol_206 = 0u;
-  thread uint tint_symbol_207 = 0u;
-  thread uint tint_symbol_208 = 0u;
-  thread uint tint_symbol_209 = 0u;
-  thread uint tint_symbol_210 = 0u;
-  thread uint tint_symbol_211 = 0u;
-  thread uint tint_symbol_212 = 0u;
-  thread uint tint_symbol_213 = 0u;
-  thread uint tint_symbol_214 = 0u;
-  thread uint tint_symbol_215 = 0u;
-  thread uint tint_symbol_216 = 0u;
-  thread uint tint_symbol_217 = 0u;
-  thread uint tint_symbol_218 = 0u;
-  thread uint tint_symbol_219 = 0u;
-  thread uint tint_symbol_220 = 0u;
-  thread uint tint_symbol_221 = 0u;
-  thread uint tint_symbol_222 = 0u;
-  thread uint tint_symbol_223 = 0u;
-  thread uint tint_symbol_224 = 0u;
-  thread uint tint_symbol_225 = 0u;
-  thread uint tint_symbol_226 = 0u;
-  thread uint tint_symbol_227 = 0u;
-  thread uint tint_symbol_228 = 0u;
-  thread uint tint_symbol_229 = 0u;
-  thread uint tint_symbol_230 = 0u;
-  thread uint tint_symbol_231 = 0u;
-  thread uint tint_symbol_232 = 0u;
-  thread uint tint_symbol_233 = 0u;
-  thread uint tint_symbol_234 = 0u;
-  thread uint tint_symbol_235 = 0u;
-  thread uint tint_symbol_236 = 0u;
-  thread uint tint_symbol_237 = 0u;
-  thread uint tint_symbol_238 = 0u;
-  thread uint tint_symbol_239 = 0u;
-  thread uint tint_symbol_240 = 0u;
-  thread uint tint_symbol_241 = 0u;
-  thread uint tint_symbol_242 = 0u;
-  thread uint tint_symbol_243 = 0u;
-  thread uint tint_symbol_244 = 0u;
-  thread uint tint_symbol_245 = 0u;
-  thread uint tint_symbol_246 = 0u;
-  thread uint tint_symbol_247 = 0u;
-  thread uint tint_symbol_248 = 0u;
-  thread uint tint_symbol_249 = 0u;
-  thread uint tint_symbol_250 = 0u;
-  thread uint tint_symbol_251 = 0u;
-  thread uint tint_symbol_252 = 0u;
-  thread uint tint_symbol_253 = 0u;
-  thread uint tint_symbol_254 = 0u;
-  thread uint tint_symbol_255 = 0u;
-  thread uint tint_symbol_256 = 0u;
-  thread uint tint_symbol_257 = 0u;
-  thread uint tint_symbol_258 = 0u;
-  thread uint tint_symbol_259 = 0u;
-  thread uint tint_symbol_260 = 0u;
-  thread uint tint_symbol_261 = 0u;
-  thread uint tint_symbol_262 = 0u;
-  thread uint tint_symbol_263 = 0u;
-  thread uint tint_symbol_264 = 0u;
-  thread uint tint_symbol_265 = 0u;
-  thread uint tint_symbol_266 = 0u;
-  thread uint tint_symbol_267 = 0u;
-  thread uint tint_symbol_268 = 0u;
-  thread uint tint_symbol_269 = 0u;
-  thread uint tint_symbol_270 = 0u;
-  thread uint tint_symbol_271 = 0u;
-  thread uint tint_symbol_272 = 0u;
-  thread uint tint_symbol_273 = 0u;
-  thread uint tint_symbol_274 = 0u;
-  thread uint tint_symbol_275 = 0u;
-  thread uint tint_symbol_276 = 0u;
-  thread uint tint_symbol_277 = 0u;
-  thread uint tint_symbol_278 = 0u;
-  thread uint tint_symbol_279 = 0u;
-  thread uint tint_symbol_280 = 0u;
-  thread uint tint_symbol_281 = 0u;
-  thread uint tint_symbol_282 = 0u;
-  thread uint tint_symbol_283 = 0u;
-  thread uint tint_symbol_284 = 0u;
-  thread uint tint_symbol_285 = 0u;
-  thread uint tint_symbol_286 = 0u;
-  thread uint tint_symbol_287 = 0u;
-  thread uint tint_symbol_288 = 0u;
-  thread uint tint_symbol_289 = 0u;
-  thread uint tint_symbol_290 = 0u;
-  thread uint tint_symbol_291 = 0u;
-  thread uint tint_symbol_292 = 0u;
-  thread uint tint_symbol_293 = 0u;
-  thread uint tint_symbol_294 = 0u;
-  thread uint tint_symbol_295 = 0u;
-  thread uint tint_symbol_296 = 0u;
-  thread uint tint_symbol_297 = 0u;
-  thread uint tint_symbol_298 = 0u;
-  thread uint tint_symbol_299 = 0u;
-  thread uint tint_symbol_300 = 0u;
-  thread uint tint_symbol_301 = 0u;
-  thread uint tint_symbol_302 = 0u;
-  thread uint tint_symbol_303 = 0u;
-  thread uint tint_symbol_304 = 0u;
-  thread uint tint_symbol_305 = 0u;
-  thread uint tint_symbol_306 = 0u;
-  thread uint tint_symbol_307 = 0u;
-  thread uint tint_symbol_308 = 0u;
-  thread uint tint_symbol_309 = 0u;
-  thread uint tint_symbol_310 = 0u;
-  thread uint tint_symbol_311 = 0u;
-  thread uint tint_symbol_312 = 0u;
-  thread uint tint_symbol_313 = 0u;
-  thread uint tint_symbol_314 = 0u;
-  thread uint tint_symbol_315 = 0u;
-  thread uint tint_symbol_316 = 0u;
-  thread uint tint_symbol_317 = 0u;
-  thread uint tint_symbol_318 = 0u;
-  thread uint tint_symbol_319 = 0u;
-  thread uint tint_symbol_320 = 0u;
-  thread uint tint_symbol_321 = 0u;
-  thread uint tint_symbol_322 = 0u;
-  thread uint tint_symbol_323 = 0u;
-  thread uint tint_symbol_324 = 0u;
-  thread uint tint_symbol_325 = 0u;
-  thread uint tint_symbol_326 = 0u;
-  thread uint tint_symbol_327 = 0u;
-  thread uint tint_symbol_328 = 0u;
-  thread uint tint_symbol_329 = 0u;
-  thread uint tint_symbol_330 = 0u;
-  thread uint tint_symbol_331 = 0u;
-  thread uint tint_symbol_332 = 0u;
-  thread uint tint_symbol_333 = 0u;
-  thread uint tint_symbol_334 = 0u;
-  thread uint tint_symbol_335 = 0u;
-  thread uint tint_symbol_336 = 0u;
-  thread uint tint_symbol_337 = 0u;
-  thread uint tint_symbol_338 = 0u;
-  thread uint tint_symbol_339 = 0u;
-  thread uint tint_symbol_340 = 0u;
-  thread uint tint_symbol_341 = 0u;
-  thread uint tint_symbol_342 = 0u;
-  thread uint tint_symbol_343 = 0u;
-  thread uint tint_symbol_344 = 0u;
-  thread uint tint_symbol_345 = 0u;
-  thread uint tint_symbol_346 = 0u;
-  thread uint tint_symbol_347 = 0u;
-  thread uint tint_symbol_348 = 0u;
-  thread uint tint_symbol_349 = 0u;
-  thread uint tint_symbol_350 = 0u;
-  thread uint tint_symbol_351 = 0u;
-  thread uint tint_symbol_352 = 0u;
-  thread uint tint_symbol_353 = 0u;
-  thread uint tint_symbol_354 = 0u;
-  thread uint tint_symbol_355 = 0u;
-  thread uint tint_symbol_356 = 0u;
-  thread uint tint_symbol_357 = 0u;
-  thread uint tint_symbol_358 = 0u;
-  thread uint tint_symbol_359 = 0u;
-  thread uint tint_symbol_360 = 0u;
-  thread uint tint_symbol_361 = 0u;
-  thread uint tint_symbol_362 = 0u;
-  thread uint tint_symbol_363 = 0u;
-  thread uint tint_symbol_364 = 0u;
-  thread uint tint_symbol_365 = 0u;
-  thread uint tint_symbol_366 = 0u;
-  thread uint tint_symbol_367 = 0u;
-  thread uint tint_symbol_368 = 0u;
-  thread uint tint_symbol_369 = 0u;
-  thread uint tint_symbol_370 = 0u;
-  thread uint tint_symbol_371 = 0u;
-  thread uint tint_symbol_372 = 0u;
-  thread uint tint_symbol_373 = 0u;
-  thread uint tint_symbol_374 = 0u;
-  thread uint tint_symbol_375 = 0u;
-  thread uint tint_symbol_376 = 0u;
-  thread uint tint_symbol_377 = 0u;
-  thread uint tint_symbol_378 = 0u;
-  thread uint tint_symbol_379 = 0u;
-  thread uint tint_symbol_380 = 0u;
-  thread uint tint_symbol_381 = 0u;
-  thread uint tint_symbol_382 = 0u;
-  thread uint tint_symbol_383 = 0u;
-  thread uint tint_symbol_384 = 0u;
-  thread uint tint_symbol_385 = 0u;
-  thread uint tint_symbol_386 = 0u;
-  thread uint tint_symbol_387 = 0u;
-  thread uint tint_symbol_388 = 0u;
-  thread uint tint_symbol_389 = 0u;
-  thread uint tint_symbol_390 = 0u;
-  thread uint tint_symbol_391 = 0u;
-  thread uint tint_symbol_392 = 0u;
-  thread uint tint_symbol_393 = 0u;
-  thread uint tint_symbol_394 = 0u;
-  thread uint tint_symbol_395 = 0u;
-  thread uint tint_symbol_396 = 0u;
-  thread uint tint_symbol_397 = 0u;
-  thread uint tint_symbol_398 = 0u;
-  thread uint tint_symbol_399 = 0u;
-  thread uint tint_symbol_400 = 0u;
-  thread uint tint_symbol_401 = 0u;
-  thread uint tint_symbol_402 = 0u;
-  thread uint tint_symbol_403 = 0u;
-  thread uint tint_symbol_404 = 0u;
-  thread uint tint_symbol_405 = 0u;
-  thread uint tint_symbol_406 = 0u;
-  thread uint tint_symbol_407 = 0u;
-  thread uint tint_symbol_408 = 0u;
-  thread uint tint_symbol_409 = 0u;
-  thread uint tint_symbol_410 = 0u;
-  thread uint tint_symbol_411 = 0u;
-  thread uint tint_symbol_412 = 0u;
-  thread uint tint_symbol_413 = 0u;
-  thread uint tint_symbol_414 = 0u;
-  thread uint tint_symbol_415 = 0u;
-  thread uint tint_symbol_416 = 0u;
-  thread uint tint_symbol_417 = 0u;
-  thread uint tint_symbol_418 = 0u;
-  thread uint tint_symbol_419 = 0u;
-  thread uint tint_symbol_420 = 0u;
-  thread uint tint_symbol_421 = 0u;
-  thread uint tint_symbol_422 = 0u;
-  thread uint tint_symbol_423 = 0u;
-  thread uint tint_symbol_424 = 0u;
-  thread uint tint_symbol_425 = 0u;
-  thread uint tint_symbol_426 = 0u;
-  thread uint tint_symbol_427 = 0u;
-  thread uint tint_symbol_428 = 0u;
-  thread uint tint_symbol_429 = 0u;
-  thread uint tint_symbol_430 = 0u;
-  thread uint tint_symbol_431 = 0u;
-  thread uint tint_symbol_432 = 0u;
-  thread uint tint_symbol_433 = 0u;
-  thread uint tint_symbol_434 = 0u;
-  thread uint tint_symbol_435 = 0u;
-  thread uint tint_symbol_436 = 0u;
-  thread uint tint_symbol_437 = 0u;
-  thread uint tint_symbol_438 = 0u;
-  thread uint tint_symbol_439 = 0u;
-  thread uint tint_symbol_440 = 0u;
-  thread uint tint_symbol_441 = 0u;
-  thread uint tint_symbol_442 = 0u;
-  thread uint tint_symbol_443 = 0u;
-  thread uint tint_symbol_444 = 0u;
-  thread uint tint_symbol_445 = 0u;
-  thread uint tint_symbol_446 = 0u;
-  thread uint tint_symbol_447 = 0u;
-  thread uint tint_symbol_448 = 0u;
-  thread uint tint_symbol_449 = 0u;
-  thread uint tint_symbol_450 = 0u;
-  thread uint tint_symbol_451 = 0u;
-  thread uint tint_symbol_452 = 0u;
-  thread uint tint_symbol_453 = 0u;
-  thread uint tint_symbol_454 = 0u;
-  thread uint tint_symbol_455 = 0u;
-  thread uint tint_symbol_456 = 0u;
-  thread uint tint_symbol_457 = 0u;
-  thread uint tint_symbol_458 = 0u;
-  thread uint tint_symbol_459 = 0u;
-  thread uint tint_symbol_460 = 0u;
-  thread uint tint_symbol_461 = 0u;
-  thread uint tint_symbol_462 = 0u;
-  thread uint tint_symbol_463 = 0u;
-  thread uint tint_symbol_464 = 0u;
-  thread uint tint_symbol_465 = 0u;
-  thread uint tint_symbol_466 = 0u;
-  thread uint tint_symbol_467 = 0u;
-  thread uint tint_symbol_468 = 0u;
-  thread uint tint_symbol_469 = 0u;
-  thread uint tint_symbol_470 = 0u;
-  thread uint tint_symbol_471 = 0u;
-  thread uint tint_symbol_472 = 0u;
-  thread uint tint_symbol_473 = 0u;
-  thread uint tint_symbol_474 = 0u;
-  thread uint tint_symbol_475 = 0u;
-  thread uint tint_symbol_476 = 0u;
-  thread uint tint_symbol_477 = 0u;
-  thread uint tint_symbol_478 = 0u;
-  thread uint tint_symbol_479 = 0u;
-  thread uint tint_symbol_480 = 0u;
-  thread uint tint_symbol_481 = 0u;
-  thread uint tint_symbol_482 = 0u;
-  thread uint tint_symbol_483 = 0u;
-  thread uint tint_symbol_484 = 0u;
-  thread uint tint_symbol_485 = 0u;
-  thread uint tint_symbol_486 = 0u;
-  thread uint tint_symbol_487 = 0u;
-  thread uint tint_symbol_488 = 0u;
-  thread uint tint_symbol_489 = 0u;
-  thread uint tint_symbol_490 = 0u;
-  thread uint tint_symbol_491 = 0u;
-  thread uint tint_symbol_492 = 0u;
-  thread uint tint_symbol_493 = 0u;
-  thread uint tint_symbol_494 = 0u;
-  thread uint tint_symbol_495 = 0u;
-  thread uint tint_symbol_496 = 0u;
-  thread uint tint_symbol_497 = 0u;
-  thread uint tint_symbol_498 = 0u;
-  thread uint tint_symbol_499 = 0u;
-  thread uint tint_symbol_500 = 0u;
-  thread uint tint_symbol_501 = 0u;
-  thread uint tint_symbol_502 = 0u;
-  thread uint tint_symbol_503 = 0u;
-  thread uint tint_symbol_504 = 0u;
-  thread uint tint_symbol_505 = 0u;
-  thread uint tint_symbol_506 = 0u;
-  thread uint tint_symbol_507 = 0u;
-  thread uint tint_symbol_508 = 0u;
-  thread uint tint_symbol_509 = 0u;
-  thread uint tint_symbol_510 = 0u;
-  thread uint tint_symbol_511 = 0u;
-  thread uint tint_symbol_512 = 0u;
-  thread uint tint_symbol_513 = 0u;
-  thread uint tint_symbol_514 = 0u;
-  thread uint tint_symbol_515 = 0u;
-  thread uint tint_symbol_516 = 0u;
-  thread uint tint_symbol_517 = 0u;
-  thread uint tint_symbol_518 = 0u;
-  thread uint tint_symbol_519 = 0u;
-  thread uint tint_symbol_520 = 0u;
-  thread uint tint_symbol_521 = 0u;
-  thread uint tint_symbol_522 = 0u;
-  thread uint tint_symbol_523 = 0u;
-  thread uint tint_symbol_524 = 0u;
-  thread uint tint_symbol_525 = 0u;
-  thread uint tint_symbol_526 = 0u;
-  thread uint tint_symbol_527 = 0u;
-  thread uint tint_symbol_528 = 0u;
-  thread uint tint_symbol_529 = 0u;
-  thread uint tint_symbol_530 = 0u;
-  thread uint tint_symbol_531 = 0u;
-  thread uint tint_symbol_532 = 0u;
-  thread uint tint_symbol_533 = 0u;
-  thread uint tint_symbol_534 = 0u;
-  thread uint tint_symbol_535 = 0u;
-  thread uint tint_symbol_536 = 0u;
-  thread uint tint_symbol_537 = 0u;
-  thread uint tint_symbol_538 = 0u;
-  thread uint tint_symbol_539 = 0u;
-  thread uint tint_symbol_540 = 0u;
-  thread uint tint_symbol_541 = 0u;
-  thread uint tint_symbol_542 = 0u;
-  thread uint tint_symbol_543 = 0u;
-  thread uint tint_symbol_544 = 0u;
-  thread uint tint_symbol_545 = 0u;
-  thread uint tint_symbol_546 = 0u;
-  thread uint tint_symbol_547 = 0u;
-  thread uint tint_symbol_548 = 0u;
-  thread uint tint_symbol_549 = 0u;
-  thread uint tint_symbol_550 = 0u;
-  thread uint tint_symbol_551 = 0u;
-  thread uint tint_symbol_552 = 0u;
-  thread uint tint_symbol_553 = 0u;
-  thread uint tint_symbol_554 = 0u;
-  thread uint tint_symbol_555 = 0u;
-  thread uint tint_symbol_556 = 0u;
-  thread uint tint_symbol_557 = 0u;
-  thread uint tint_symbol_558 = 0u;
-  thread uint tint_symbol_559 = 0u;
-  thread uint tint_symbol_560 = 0u;
-  thread uint tint_symbol_561 = 0u;
-  thread uint tint_symbol_562 = 0u;
-  thread uint tint_symbol_563 = 0u;
-  thread uint tint_symbol_564 = 0u;
-  thread uint tint_symbol_565 = 0u;
-  thread uint tint_symbol_566 = 0u;
-  thread uint tint_symbol_567 = 0u;
-  thread uint tint_symbol_568 = 0u;
-  thread uint tint_symbol_569 = 0u;
-  thread uint tint_symbol_570 = 0u;
-  thread uint tint_symbol_571 = 0u;
-  thread uint tint_symbol_572 = 0u;
-  thread uint tint_symbol_573 = 0u;
-  thread uint tint_symbol_574 = 0u;
-  thread uint tint_symbol_575 = 0u;
-  thread uint tint_symbol_576 = 0u;
-  thread uint tint_symbol_577 = 0u;
-  thread uint tint_symbol_578 = 0u;
-  thread uint tint_symbol_579 = 0u;
-  thread uint tint_symbol_580 = 0u;
-  thread uint tint_symbol_581 = 0u;
-  thread uint tint_symbol_582 = 0u;
-  thread uint tint_symbol_583 = 0u;
-  thread uint tint_symbol_584 = 0u;
-  thread uint tint_symbol_585 = 0u;
-  thread uint tint_symbol_586 = 0u;
-  thread uint tint_symbol_587 = 0u;
-  thread uint tint_symbol_588 = 0u;
-  thread uint tint_symbol_589 = 0u;
-  thread uint tint_symbol_590 = 0u;
-  thread uint tint_symbol_591 = 0u;
-  thread uint tint_symbol_592 = 0u;
-  thread uint tint_symbol_593 = 0u;
-  thread uint tint_symbol_594 = 0u;
-  thread uint tint_symbol_595 = 0u;
-  thread uint tint_symbol_596 = 0u;
-  thread uint tint_symbol_597 = 0u;
-  thread uint tint_symbol_598 = 0u;
-  thread uint tint_symbol_599 = 0u;
-  thread uint tint_symbol_600 = 0u;
-  thread uint tint_symbol_601 = 0u;
-  thread uint tint_symbol_602 = 0u;
-  thread uint tint_symbol_603 = 0u;
-  thread uint tint_symbol_604 = 0u;
-  thread uint tint_symbol_605 = 0u;
-  thread uint tint_symbol_606 = 0u;
-  thread uint tint_symbol_607 = 0u;
-  thread uint tint_symbol_608 = 0u;
-  thread uint tint_symbol_609 = 0u;
-  thread uint tint_symbol_610 = 0u;
-  thread uint tint_symbol_611 = 0u;
-  thread uint tint_symbol_612 = 0u;
-  thread uint tint_symbol_613 = 0u;
-  thread uint tint_symbol_614 = 0u;
-  thread uint tint_symbol_615 = 0u;
-  thread uint tint_symbol_616 = 0u;
-  thread uint tint_symbol_617 = 0u;
-  thread uint tint_symbol_618 = 0u;
-  thread uint tint_symbol_619 = 0u;
-  thread uint tint_symbol_620 = 0u;
-  thread uint tint_symbol_621 = 0u;
-  thread uint tint_symbol_622 = 0u;
-  thread uint tint_symbol_623 = 0u;
-  thread uint tint_symbol_624 = 0u;
-  thread uint tint_symbol_625 = 0u;
-  thread uint tint_symbol_626 = 0u;
-  thread uint tint_symbol_627 = 0u;
-  thread uint tint_symbol_628 = 0u;
-  thread uint tint_symbol_629 = 0u;
-  thread uint tint_symbol_630 = 0u;
-  thread uint tint_symbol_631 = 0u;
-  thread uint tint_symbol_632 = 0u;
-  thread uint tint_symbol_633 = 0u;
-  thread uint tint_symbol_634 = 0u;
-  thread uint tint_symbol_635 = 0u;
-  thread uint tint_symbol_636 = 0u;
-  thread uint tint_symbol_637 = 0u;
-  thread uint tint_symbol_638 = 0u;
-  thread uint tint_symbol_639 = 0u;
-  thread uint tint_symbol_640 = 0u;
-  thread uint tint_symbol_641 = 0u;
-  thread uint tint_symbol_642 = 0u;
-  thread uint tint_symbol_643 = 0u;
-  thread uint tint_symbol_644 = 0u;
-  thread uint tint_symbol_645 = 0u;
-  thread uint tint_symbol_646 = 0u;
-  thread uint tint_symbol_647 = 0u;
-  thread uint tint_symbol_648 = 0u;
-  thread uint tint_symbol_649 = 0u;
-  thread uint tint_symbol_650 = 0u;
-  thread uint tint_symbol_651 = 0u;
-  thread uint tint_symbol_652 = 0u;
-  thread uint tint_symbol_653 = 0u;
-  thread uint tint_symbol_654 = 0u;
-  thread uint tint_symbol_655 = 0u;
-  thread uint tint_symbol_656 = 0u;
-  thread uint tint_symbol_657 = 0u;
-  thread uint tint_symbol_658 = 0u;
-  thread uint tint_symbol_659 = 0u;
-  thread uint tint_symbol_660 = 0u;
-  thread uint tint_symbol_661 = 0u;
-  thread uint tint_symbol_662 = 0u;
-  thread uint tint_symbol_663 = 0u;
-  thread uint tint_symbol_664 = 0u;
-  thread uint tint_symbol_665 = 0u;
-  thread uint tint_symbol_666 = 0u;
-  thread uint tint_symbol_667 = 0u;
-  thread uint tint_symbol_668 = 0u;
-  thread uint tint_symbol_669 = 0u;
-  thread uint tint_symbol_670 = 0u;
-  thread uint tint_symbol_671 = 0u;
-  thread uint tint_symbol_672 = 0u;
-  thread uint tint_symbol_673 = 0u;
-  thread uint tint_symbol_674 = 0u;
-  thread uint tint_symbol_675 = 0u;
-  thread uint tint_symbol_676 = 0u;
-  thread uint tint_symbol_677 = 0u;
-  thread uint tint_symbol_678 = 0u;
-  thread uint tint_symbol_679 = 0u;
-  thread uint tint_symbol_680 = 0u;
-  thread uint tint_symbol_681 = 0u;
-  thread uint tint_symbol_682 = 0u;
-  thread uint tint_symbol_683 = 0u;
-  thread uint tint_symbol_684 = 0u;
-  thread uint tint_symbol_685 = 0u;
-  thread uint tint_symbol_686 = 0u;
-  thread uint tint_symbol_687 = 0u;
-  thread uint tint_symbol_688 = 0u;
-  thread uint tint_symbol_689 = 0u;
-  thread uint tint_symbol_690 = 0u;
-  thread uint tint_symbol_691 = 0u;
-  thread uint tint_symbol_692 = 0u;
-  thread uint tint_symbol_693 = 0u;
-  thread uint tint_symbol_694 = 0u;
-  thread uint tint_symbol_695 = 0u;
-  thread uint tint_symbol_696 = 0u;
-  thread uint tint_symbol_697 = 0u;
-  thread uint tint_symbol_698 = 0u;
-  thread uint tint_symbol_699 = 0u;
-  thread uint tint_symbol_700 = 0u;
-  thread uint tint_symbol_701 = 0u;
-  thread uint tint_symbol_702 = 0u;
-  thread uint tint_symbol_703 = 0u;
-  thread uint tint_symbol_704 = 0u;
-  thread uint tint_symbol_705 = 0u;
-  thread uint tint_symbol_706 = 0u;
-  thread uint tint_symbol_707 = 0u;
-  thread uint tint_symbol_708 = 0u;
-  thread uint tint_symbol_709 = 0u;
-  thread uint tint_symbol_710 = 0u;
-  thread uint tint_symbol_711 = 0u;
-  thread uint tint_symbol_712 = 0u;
-  thread uint tint_symbol_713 = 0u;
-  thread uint tint_symbol_714 = 0u;
-  thread uint tint_symbol_715 = 0u;
-  thread uint tint_symbol_716 = 0u;
-  thread uint tint_symbol_717 = 0u;
-  thread uint tint_symbol_718 = 0u;
-  thread uint tint_symbol_719 = 0u;
-  thread uint tint_symbol_720 = 0u;
-  thread uint tint_symbol_721 = 0u;
-  thread uint tint_symbol_722 = 0u;
-  thread uint tint_symbol_723 = 0u;
-  thread uint tint_symbol_724 = 0u;
-  thread uint tint_symbol_725 = 0u;
-  thread uint tint_symbol_726 = 0u;
-  thread uint tint_symbol_727 = 0u;
-  thread uint tint_symbol_728 = 0u;
-  thread uint tint_symbol_729 = 0u;
-  thread uint tint_symbol_730 = 0u;
-  thread uint tint_symbol_731 = 0u;
-  thread uint tint_symbol_732 = 0u;
-  thread uint tint_symbol_733 = 0u;
-  thread uint tint_symbol_734 = 0u;
-  thread uint tint_symbol_735 = 0u;
-  thread uint tint_symbol_736 = 0u;
-  thread uint tint_symbol_737 = 0u;
-  thread uint tint_symbol_738 = 0u;
-  thread uint tint_symbol_739 = 0u;
-  thread uint tint_symbol_740 = 0u;
-  thread uint tint_symbol_741 = 0u;
-  thread uint tint_symbol_742 = 0u;
-  thread uint tint_symbol_743 = 0u;
-  thread uint tint_symbol_744 = 0u;
-  thread uint tint_symbol_745 = 0u;
-  thread uint tint_symbol_746 = 0u;
-  thread uint tint_symbol_747 = 0u;
-  thread uint tint_symbol_748 = 0u;
-  thread uint tint_symbol_749 = 0u;
-  thread uint tint_symbol_750 = 0u;
-  thread uint tint_symbol_751 = 0u;
-  thread uint tint_symbol_752 = 0u;
-  thread uint tint_symbol_753 = 0u;
-  thread uint tint_symbol_754 = 0u;
-  thread uint tint_symbol_755 = 0u;
-  thread uint tint_symbol_756 = 0u;
-  thread uint tint_symbol_757 = 0u;
-  thread uint tint_symbol_758 = 0u;
-  thread uint tint_symbol_759 = 0u;
-  thread uint tint_symbol_760 = 0u;
-  thread uint tint_symbol_761 = 0u;
-  thread uint tint_symbol_762 = 0u;
-  thread uint tint_symbol_763 = 0u;
-  thread uint tint_symbol_764 = 0u;
-  thread uint tint_symbol_765 = 0u;
-  thread uint tint_symbol_766 = 0u;
-  thread uint tint_symbol_767 = 0u;
-  thread uint tint_symbol_768 = 0u;
-  thread uint tint_symbol_769 = 0u;
-  thread uint tint_symbol_770 = 0u;
-  thread uint tint_symbol_771 = 0u;
-  thread uint tint_symbol_772 = 0u;
-  thread uint tint_symbol_773 = 0u;
-  thread uint tint_symbol_774 = 0u;
-  thread uint tint_symbol_775 = 0u;
-  thread uint tint_symbol_776 = 0u;
-  thread uint tint_symbol_777 = 0u;
-  thread uint tint_symbol_778 = 0u;
-  thread uint tint_symbol_779 = 0u;
-  thread uint tint_symbol_780 = 0u;
-  thread uint tint_symbol_781 = 0u;
-  thread uint tint_symbol_782 = 0u;
-  thread uint tint_symbol_783 = 0u;
-  thread uint tint_symbol_784 = 0u;
-  thread uint tint_symbol_785 = 0u;
-  thread uint tint_symbol_786 = 0u;
-  thread uint tint_symbol_787 = 0u;
-  thread uint tint_symbol_788 = 0u;
-  thread uint tint_symbol_789 = 0u;
-  thread uint tint_symbol_790 = 0u;
-  thread uint tint_symbol_791 = 0u;
-  thread uint tint_symbol_792 = 0u;
-  thread uint tint_symbol_793 = 0u;
-  thread uint tint_symbol_794 = 0u;
-  thread uint tint_symbol_795 = 0u;
-  thread uint tint_symbol_796 = 0u;
-  thread uint tint_symbol_797 = 0u;
-  thread uint tint_symbol_798 = 0u;
-  thread uint tint_symbol_799 = 0u;
-  thread uint tint_symbol_800 = 0u;
-  thread uint tint_symbol_801 = 0u;
-  thread uint tint_symbol_802 = 0u;
-  thread uint tint_symbol_803 = 0u;
-  thread uint tint_symbol_804 = 0u;
-  thread uint tint_symbol_805 = 0u;
-  thread uint tint_symbol_806 = 0u;
-  thread uint tint_symbol_807 = 0u;
-  thread uint tint_symbol_808 = 0u;
-  thread uint tint_symbol_809 = 0u;
-  thread uint tint_symbol_810 = 0u;
-  thread uint tint_symbol_811 = 0u;
-  thread uint tint_symbol_812 = 0u;
-  thread uint tint_symbol_813 = 0u;
-  thread uint tint_symbol_814 = 0u;
-  thread uint tint_symbol_815 = 0u;
-  thread uint tint_symbol_816 = 0u;
-  thread uint tint_symbol_817 = 0u;
-  thread uint tint_symbol_818 = 0u;
-  thread uint tint_symbol_819 = 0u;
-  thread uint tint_symbol_820 = 0u;
-  thread uint tint_symbol_821 = 0u;
-  thread uint tint_symbol_822 = 0u;
-  thread uint tint_symbol_823 = 0u;
-  thread uint tint_symbol_824 = 0u;
-  thread uint tint_symbol_825 = 0u;
-  thread uint tint_symbol_826 = 0u;
-  thread uint tint_symbol_827 = 0u;
-  thread uint tint_symbol_828 = 0u;
-  thread uint tint_symbol_829 = 0u;
-  thread uint tint_symbol_830 = 0u;
-  thread uint tint_symbol_831 = 0u;
-  thread uint tint_symbol_832 = 0u;
-  thread uint tint_symbol_833 = 0u;
-  thread uint tint_symbol_834 = 0u;
-  thread uint tint_symbol_835 = 0u;
-  thread uint tint_symbol_836 = 0u;
-  thread uint tint_symbol_837 = 0u;
-  thread uint tint_symbol_838 = 0u;
-  thread uint tint_symbol_839 = 0u;
-  thread uint tint_symbol_840 = 0u;
-  thread uint tint_symbol_841 = 0u;
-  thread uint tint_symbol_842 = 0u;
-  thread uint tint_symbol_843 = 0u;
-  thread uint tint_symbol_844 = 0u;
-  thread uint tint_symbol_845 = 0u;
-  thread uint tint_symbol_846 = 0u;
-  thread uint tint_symbol_847 = 0u;
-  thread uint tint_symbol_848 = 0u;
-  thread uint tint_symbol_849 = 0u;
-  thread uint tint_symbol_850 = 0u;
-  thread uint tint_symbol_851 = 0u;
-  thread uint tint_symbol_852 = 0u;
-  thread uint tint_symbol_853 = 0u;
-  thread uint tint_symbol_854 = 0u;
-  thread uint tint_symbol_855 = 0u;
-  thread uint tint_symbol_856 = 0u;
-  thread uint tint_symbol_857 = 0u;
-  thread uint tint_symbol_858 = 0u;
-  thread uint tint_symbol_859 = 0u;
-  thread uint tint_symbol_860 = 0u;
-  thread uint tint_symbol_861 = 0u;
-  thread uint tint_symbol_862 = 0u;
-  thread uint tint_symbol_863 = 0u;
-  thread uint tint_symbol_864 = 0u;
-  thread uint tint_symbol_865 = 0u;
-  thread uint tint_symbol_866 = 0u;
-  thread uint tint_symbol_867 = 0u;
-  thread uint tint_symbol_868 = 0u;
-  thread uint tint_symbol_869 = 0u;
-  thread uint tint_symbol_870 = 0u;
-  thread uint tint_symbol_871 = 0u;
-  thread uint tint_symbol_872 = 0u;
-  thread uint tint_symbol_873 = 0u;
-  thread uint tint_symbol_874 = 0u;
-  thread uint tint_symbol_875 = 0u;
-  thread uint tint_symbol_876 = 0u;
-  thread uint tint_symbol_877 = 0u;
-  thread uint tint_symbol_878 = 0u;
-  thread uint tint_symbol_879 = 0u;
-  thread uint tint_symbol_880 = 0u;
-  thread uint tint_symbol_881 = 0u;
-  thread uint tint_symbol_882 = 0u;
-  thread uint tint_symbol_883 = 0u;
-  thread uint tint_symbol_884 = 0u;
-  thread uint tint_symbol_885 = 0u;
-  thread uint tint_symbol_886 = 0u;
-  thread uint tint_symbol_887 = 0u;
-  thread uint tint_symbol_888 = 0u;
-  thread uint tint_symbol_889 = 0u;
-  thread uint tint_symbol_890 = 0u;
-  thread uint tint_symbol_891 = 0u;
-  thread uint tint_symbol_892 = 0u;
-  thread uint tint_symbol_893 = 0u;
-  thread uint tint_symbol_894 = 0u;
-  thread uint tint_symbol_895 = 0u;
-  thread uint tint_symbol_896 = 0u;
-  thread uint tint_symbol_897 = 0u;
-  thread uint tint_symbol_898 = 0u;
-  thread uint tint_symbol_899 = 0u;
-  thread uint tint_symbol_900 = 0u;
-  thread uint tint_symbol_901 = 0u;
-  thread uint tint_symbol_902 = 0u;
-  thread uint tint_symbol_903 = 0u;
-  thread uint tint_symbol_904 = 0u;
-  thread uint tint_symbol_905 = 0u;
-  thread uint tint_symbol_906 = 0u;
-  thread uint tint_symbol_907 = 0u;
-  thread uint tint_symbol_908 = 0u;
-  thread uint tint_symbol_909 = 0u;
-  thread uint tint_symbol_910 = 0u;
-  thread uint tint_symbol_911 = 0u;
-  thread uint tint_symbol_912 = 0u;
-  thread uint tint_symbol_913 = 0u;
-  thread uint tint_symbol_914 = 0u;
-  thread uint tint_symbol_915 = 0u;
-  thread uint tint_symbol_916 = 0u;
-  thread uint tint_symbol_917 = 0u;
-  thread uint tint_symbol_918 = 0u;
-  thread uint tint_symbol_919 = 0u;
-  thread uint tint_symbol_920 = 0u;
-  thread uint tint_symbol_921 = 0u;
-  thread uint tint_symbol_922 = 0u;
-  thread uint tint_symbol_923 = 0u;
-  thread uint tint_symbol_924 = 0u;
-  thread uint tint_symbol_925 = 0u;
-  thread uint tint_symbol_926 = 0u;
-  thread uint tint_symbol_927 = 0u;
-  thread uint tint_symbol_928 = 0u;
-  thread uint tint_symbol_929 = 0u;
-  thread uint tint_symbol_930 = 0u;
-  thread uint tint_symbol_931 = 0u;
-  thread uint tint_symbol_932 = 0u;
-  thread uint tint_symbol_933 = 0u;
-  thread uint tint_symbol_934 = 0u;
-  thread uint tint_symbol_935 = 0u;
-  thread uint tint_symbol_936 = 0u;
-  thread uint tint_symbol_937 = 0u;
-  thread uint tint_symbol_938 = 0u;
-  thread uint tint_symbol_939 = 0u;
-  thread uint tint_symbol_940 = 0u;
-  thread uint tint_symbol_941 = 0u;
-  thread uint tint_symbol_942 = 0u;
-  thread uint tint_symbol_943 = 0u;
-  thread uint tint_symbol_944 = 0u;
-  thread uint tint_symbol_945 = 0u;
-  thread uint tint_symbol_946 = 0u;
-  thread uint tint_symbol_947 = 0u;
-  thread uint tint_symbol_948 = 0u;
-  thread uint tint_symbol_949 = 0u;
-  thread uint tint_symbol_950 = 0u;
-  thread uint tint_symbol_951 = 0u;
-  thread uint tint_symbol_952 = 0u;
-  thread uint tint_symbol_953 = 0u;
-  thread uint tint_symbol_954 = 0u;
-  thread uint tint_symbol_955 = 0u;
-  thread uint tint_symbol_956 = 0u;
-  thread uint tint_symbol_957 = 0u;
-  thread uint tint_symbol_958 = 0u;
-  thread uint tint_symbol_959 = 0u;
-  thread uint tint_symbol_960 = 0u;
-  thread uint tint_symbol_961 = 0u;
-  thread uint tint_symbol_962 = 0u;
-  thread uint tint_symbol_963 = 0u;
-  thread uint tint_symbol_964 = 0u;
-  thread uint tint_symbol_965 = 0u;
-  thread uint tint_symbol_966 = 0u;
-  thread uint tint_symbol_967 = 0u;
-  thread uint tint_symbol_968 = 0u;
-  thread uint tint_symbol_969 = 0u;
-  thread uint tint_symbol_970 = 0u;
-  thread uint tint_symbol_971 = 0u;
-  thread uint tint_symbol_972 = 0u;
-  thread uint tint_symbol_973 = 0u;
-  thread uint tint_symbol_974 = 0u;
-  thread uint tint_symbol_975 = 0u;
-  thread uint tint_symbol_976 = 0u;
-  thread uint tint_symbol_977 = 0u;
-  thread uint tint_symbol_978 = 0u;
-  thread uint tint_symbol_979 = 0u;
-  thread uint tint_symbol_980 = 0u;
-  thread uint tint_symbol_981 = 0u;
-  thread uint tint_symbol_982 = 0u;
-  thread uint tint_symbol_983 = 0u;
-  thread uint tint_symbol_984 = 0u;
-  thread uint tint_symbol_985 = 0u;
-  thread uint tint_symbol_986 = 0u;
-  thread uint tint_symbol_987 = 0u;
-  thread uint tint_symbol_988 = 0u;
-  thread uint tint_symbol_989 = 0u;
-  thread uint tint_symbol_990 = 0u;
-  thread uint tint_symbol_991 = 0u;
-  thread uint tint_symbol_992 = 0u;
-  thread uint tint_symbol_993 = 0u;
-  thread uint tint_symbol_994 = 0u;
-  thread uint tint_symbol_995 = 0u;
-  thread uint tint_symbol_996 = 0u;
-  thread uint tint_symbol_997 = 0u;
-  thread uint tint_symbol_998 = 0u;
-  thread uint tint_symbol_999 = 0u;
-  thread uint tint_symbol_1000 = 0u;
-  thread uint tint_symbol_1001 = 0u;
+struct tint_private_vars_struct {
+  uint v0;
+  uint v1;
+  uint v2;
+  uint v3;
+  uint v4;
+  uint v5;
+  uint v6;
+  uint v7;
+  uint v8;
+  uint v9;
+  uint v10;
+  uint v11;
+  uint v12;
+  uint v13;
+  uint v14;
+  uint v15;
+  uint v16;
+  uint v17;
+  uint v18;
+  uint v19;
+  uint v20;
+  uint v21;
+  uint v22;
+  uint v23;
+  uint v24;
+  uint v25;
+  uint v26;
+  uint v27;
+  uint v28;
+  uint v29;
+  uint v30;
+  uint v31;
+  uint v32;
+  uint v33;
+  uint v34;
+  uint v35;
+  uint v36;
+  uint v37;
+  uint v38;
+  uint v39;
+  uint v40;
+  uint v41;
+  uint v42;
+  uint v43;
+  uint v44;
+  uint v45;
+  uint v46;
+  uint v47;
+  uint v48;
+  uint v49;
+  uint v50;
+  uint v51;
+  uint v52;
+  uint v53;
+  uint v54;
+  uint v55;
+  uint v56;
+  uint v57;
+  uint v58;
+  uint v59;
+  uint v60;
+  uint v61;
+  uint v62;
+  uint v63;
+  uint v64;
+  uint v65;
+  uint v66;
+  uint v67;
+  uint v68;
+  uint v69;
+  uint v70;
+  uint v71;
+  uint v72;
+  uint v73;
+  uint v74;
+  uint v75;
+  uint v76;
+  uint v77;
+  uint v78;
+  uint v79;
+  uint v80;
+  uint v81;
+  uint v82;
+  uint v83;
+  uint v84;
+  uint v85;
+  uint v86;
+  uint v87;
+  uint v88;
+  uint v89;
+  uint v90;
+  uint v91;
+  uint v92;
+  uint v93;
+  uint v94;
+  uint v95;
+  uint v96;
+  uint v97;
+  uint v98;
+  uint v99;
+  uint v100;
+  uint v101;
+  uint v102;
+  uint v103;
+  uint v104;
+  uint v105;
+  uint v106;
+  uint v107;
+  uint v108;
+  uint v109;
+  uint v110;
+  uint v111;
+  uint v112;
+  uint v113;
+  uint v114;
+  uint v115;
+  uint v116;
+  uint v117;
+  uint v118;
+  uint v119;
+  uint v120;
+  uint v121;
+  uint v122;
+  uint v123;
+  uint v124;
+  uint v125;
+  uint v126;
+  uint v127;
+  uint v128;
+  uint v129;
+  uint v130;
+  uint v131;
+  uint v132;
+  uint v133;
+  uint v134;
+  uint v135;
+  uint v136;
+  uint v137;
+  uint v138;
+  uint v139;
+  uint v140;
+  uint v141;
+  uint v142;
+  uint v143;
+  uint v144;
+  uint v145;
+  uint v146;
+  uint v147;
+  uint v148;
+  uint v149;
+  uint v150;
+  uint v151;
+  uint v152;
+  uint v153;
+  uint v154;
+  uint v155;
+  uint v156;
+  uint v157;
+  uint v158;
+  uint v159;
+  uint v160;
+  uint v161;
+  uint v162;
+  uint v163;
+  uint v164;
+  uint v165;
+  uint v166;
+  uint v167;
+  uint v168;
+  uint v169;
+  uint v170;
+  uint v171;
+  uint v172;
+  uint v173;
+  uint v174;
+  uint v175;
+  uint v176;
+  uint v177;
+  uint v178;
+  uint v179;
+  uint v180;
+  uint v181;
+  uint v182;
+  uint v183;
+  uint v184;
+  uint v185;
+  uint v186;
+  uint v187;
+  uint v188;
+  uint v189;
+  uint v190;
+  uint v191;
+  uint v192;
+  uint v193;
+  uint v194;
+  uint v195;
+  uint v196;
+  uint v197;
+  uint v198;
+  uint v199;
+  uint v200;
+  uint v201;
+  uint v202;
+  uint v203;
+  uint v204;
+  uint v205;
+  uint v206;
+  uint v207;
+  uint v208;
+  uint v209;
+  uint v210;
+  uint v211;
+  uint v212;
+  uint v213;
+  uint v214;
+  uint v215;
+  uint v216;
+  uint v217;
+  uint v218;
+  uint v219;
+  uint v220;
+  uint v221;
+  uint v222;
+  uint v223;
+  uint v224;
+  uint v225;
+  uint v226;
+  uint v227;
+  uint v228;
+  uint v229;
+  uint v230;
+  uint v231;
+  uint v232;
+  uint v233;
+  uint v234;
+  uint v235;
+  uint v236;
+  uint v237;
+  uint v238;
+  uint v239;
+  uint v240;
+  uint v241;
+  uint v242;
+  uint v243;
+  uint v244;
+  uint v245;
+  uint v246;
+  uint v247;
+  uint v248;
+  uint v249;
+  uint v250;
+  uint v251;
+  uint v252;
+  uint v253;
+  uint v254;
+  uint v255;
+  uint v256;
+  uint v257;
+  uint v258;
+  uint v259;
+  uint v260;
+  uint v261;
+  uint v262;
+  uint v263;
+  uint v264;
+  uint v265;
+  uint v266;
+  uint v267;
+  uint v268;
+  uint v269;
+  uint v270;
+  uint v271;
+  uint v272;
+  uint v273;
+  uint v274;
+  uint v275;
+  uint v276;
+  uint v277;
+  uint v278;
+  uint v279;
+  uint v280;
+  uint v281;
+  uint v282;
+  uint v283;
+  uint v284;
+  uint v285;
+  uint v286;
+  uint v287;
+  uint v288;
+  uint v289;
+  uint v290;
+  uint v291;
+  uint v292;
+  uint v293;
+  uint v294;
+  uint v295;
+  uint v296;
+  uint v297;
+  uint v298;
+  uint v299;
+  uint v300;
+  uint v301;
+  uint v302;
+  uint v303;
+  uint v304;
+  uint v305;
+  uint v306;
+  uint v307;
+  uint v308;
+  uint v309;
+  uint v310;
+  uint v311;
+  uint v312;
+  uint v313;
+  uint v314;
+  uint v315;
+  uint v316;
+  uint v317;
+  uint v318;
+  uint v319;
+  uint v320;
+  uint v321;
+  uint v322;
+  uint v323;
+  uint v324;
+  uint v325;
+  uint v326;
+  uint v327;
+  uint v328;
+  uint v329;
+  uint v330;
+  uint v331;
+  uint v332;
+  uint v333;
+  uint v334;
+  uint v335;
+  uint v336;
+  uint v337;
+  uint v338;
+  uint v339;
+  uint v340;
+  uint v341;
+  uint v342;
+  uint v343;
+  uint v344;
+  uint v345;
+  uint v346;
+  uint v347;
+  uint v348;
+  uint v349;
+  uint v350;
+  uint v351;
+  uint v352;
+  uint v353;
+  uint v354;
+  uint v355;
+  uint v356;
+  uint v357;
+  uint v358;
+  uint v359;
+  uint v360;
+  uint v361;
+  uint v362;
+  uint v363;
+  uint v364;
+  uint v365;
+  uint v366;
+  uint v367;
+  uint v368;
+  uint v369;
+  uint v370;
+  uint v371;
+  uint v372;
+  uint v373;
+  uint v374;
+  uint v375;
+  uint v376;
+  uint v377;
+  uint v378;
+  uint v379;
+  uint v380;
+  uint v381;
+  uint v382;
+  uint v383;
+  uint v384;
+  uint v385;
+  uint v386;
+  uint v387;
+  uint v388;
+  uint v389;
+  uint v390;
+  uint v391;
+  uint v392;
+  uint v393;
+  uint v394;
+  uint v395;
+  uint v396;
+  uint v397;
+  uint v398;
+  uint v399;
+  uint v400;
+  uint v401;
+  uint v402;
+  uint v403;
+  uint v404;
+  uint v405;
+  uint v406;
+  uint v407;
+  uint v408;
+  uint v409;
+  uint v410;
+  uint v411;
+  uint v412;
+  uint v413;
+  uint v414;
+  uint v415;
+  uint v416;
+  uint v417;
+  uint v418;
+  uint v419;
+  uint v420;
+  uint v421;
+  uint v422;
+  uint v423;
+  uint v424;
+  uint v425;
+  uint v426;
+  uint v427;
+  uint v428;
+  uint v429;
+  uint v430;
+  uint v431;
+  uint v432;
+  uint v433;
+  uint v434;
+  uint v435;
+  uint v436;
+  uint v437;
+  uint v438;
+  uint v439;
+  uint v440;
+  uint v441;
+  uint v442;
+  uint v443;
+  uint v444;
+  uint v445;
+  uint v446;
+  uint v447;
+  uint v448;
+  uint v449;
+  uint v450;
+  uint v451;
+  uint v452;
+  uint v453;
+  uint v454;
+  uint v455;
+  uint v456;
+  uint v457;
+  uint v458;
+  uint v459;
+  uint v460;
+  uint v461;
+  uint v462;
+  uint v463;
+  uint v464;
+  uint v465;
+  uint v466;
+  uint v467;
+  uint v468;
+  uint v469;
+  uint v470;
+  uint v471;
+  uint v472;
+  uint v473;
+  uint v474;
+  uint v475;
+  uint v476;
+  uint v477;
+  uint v478;
+  uint v479;
+  uint v480;
+  uint v481;
+  uint v482;
+  uint v483;
+  uint v484;
+  uint v485;
+  uint v486;
+  uint v487;
+  uint v488;
+  uint v489;
+  uint v490;
+  uint v491;
+  uint v492;
+  uint v493;
+  uint v494;
+  uint v495;
+  uint v496;
+  uint v497;
+  uint v498;
+  uint v499;
+  uint v500;
+  uint v501;
+  uint v502;
+  uint v503;
+  uint v504;
+  uint v505;
+  uint v506;
+  uint v507;
+  uint v508;
+  uint v509;
+  uint v510;
+  uint v511;
+  uint v512;
+  uint v513;
+  uint v514;
+  uint v515;
+  uint v516;
+  uint v517;
+  uint v518;
+  uint v519;
+  uint v520;
+  uint v521;
+  uint v522;
+  uint v523;
+  uint v524;
+  uint v525;
+  uint v526;
+  uint v527;
+  uint v528;
+  uint v529;
+  uint v530;
+  uint v531;
+  uint v532;
+  uint v533;
+  uint v534;
+  uint v535;
+  uint v536;
+  uint v537;
+  uint v538;
+  uint v539;
+  uint v540;
+  uint v541;
+  uint v542;
+  uint v543;
+  uint v544;
+  uint v545;
+  uint v546;
+  uint v547;
+  uint v548;
+  uint v549;
+  uint v550;
+  uint v551;
+  uint v552;
+  uint v553;
+  uint v554;
+  uint v555;
+  uint v556;
+  uint v557;
+  uint v558;
+  uint v559;
+  uint v560;
+  uint v561;
+  uint v562;
+  uint v563;
+  uint v564;
+  uint v565;
+  uint v566;
+  uint v567;
+  uint v568;
+  uint v569;
+  uint v570;
+  uint v571;
+  uint v572;
+  uint v573;
+  uint v574;
+  uint v575;
+  uint v576;
+  uint v577;
+  uint v578;
+  uint v579;
+  uint v580;
+  uint v581;
+  uint v582;
+  uint v583;
+  uint v584;
+  uint v585;
+  uint v586;
+  uint v587;
+  uint v588;
+  uint v589;
+  uint v590;
+  uint v591;
+  uint v592;
+  uint v593;
+  uint v594;
+  uint v595;
+  uint v596;
+  uint v597;
+  uint v598;
+  uint v599;
+  uint v600;
+  uint v601;
+  uint v602;
+  uint v603;
+  uint v604;
+  uint v605;
+  uint v606;
+  uint v607;
+  uint v608;
+  uint v609;
+  uint v610;
+  uint v611;
+  uint v612;
+  uint v613;
+  uint v614;
+  uint v615;
+  uint v616;
+  uint v617;
+  uint v618;
+  uint v619;
+  uint v620;
+  uint v621;
+  uint v622;
+  uint v623;
+  uint v624;
+  uint v625;
+  uint v626;
+  uint v627;
+  uint v628;
+  uint v629;
+  uint v630;
+  uint v631;
+  uint v632;
+  uint v633;
+  uint v634;
+  uint v635;
+  uint v636;
+  uint v637;
+  uint v638;
+  uint v639;
+  uint v640;
+  uint v641;
+  uint v642;
+  uint v643;
+  uint v644;
+  uint v645;
+  uint v646;
+  uint v647;
+  uint v648;
+  uint v649;
+  uint v650;
+  uint v651;
+  uint v652;
+  uint v653;
+  uint v654;
+  uint v655;
+  uint v656;
+  uint v657;
+  uint v658;
+  uint v659;
+  uint v660;
+  uint v661;
+  uint v662;
+  uint v663;
+  uint v664;
+  uint v665;
+  uint v666;
+  uint v667;
+  uint v668;
+  uint v669;
+  uint v670;
+  uint v671;
+  uint v672;
+  uint v673;
+  uint v674;
+  uint v675;
+  uint v676;
+  uint v677;
+  uint v678;
+  uint v679;
+  uint v680;
+  uint v681;
+  uint v682;
+  uint v683;
+  uint v684;
+  uint v685;
+  uint v686;
+  uint v687;
+  uint v688;
+  uint v689;
+  uint v690;
+  uint v691;
+  uint v692;
+  uint v693;
+  uint v694;
+  uint v695;
+  uint v696;
+  uint v697;
+  uint v698;
+  uint v699;
+  uint v700;
+  uint v701;
+  uint v702;
+  uint v703;
+  uint v704;
+  uint v705;
+  uint v706;
+  uint v707;
+  uint v708;
+  uint v709;
+  uint v710;
+  uint v711;
+  uint v712;
+  uint v713;
+  uint v714;
+  uint v715;
+  uint v716;
+  uint v717;
+  uint v718;
+  uint v719;
+  uint v720;
+  uint v721;
+  uint v722;
+  uint v723;
+  uint v724;
+  uint v725;
+  uint v726;
+  uint v727;
+  uint v728;
+  uint v729;
+  uint v730;
+  uint v731;
+  uint v732;
+  uint v733;
+  uint v734;
+  uint v735;
+  uint v736;
+  uint v737;
+  uint v738;
+  uint v739;
+  uint v740;
+  uint v741;
+  uint v742;
+  uint v743;
+  uint v744;
+  uint v745;
+  uint v746;
+  uint v747;
+  uint v748;
+  uint v749;
+  uint v750;
+  uint v751;
+  uint v752;
+  uint v753;
+  uint v754;
+  uint v755;
+  uint v756;
+  uint v757;
+  uint v758;
+  uint v759;
+  uint v760;
+  uint v761;
+  uint v762;
+  uint v763;
+  uint v764;
+  uint v765;
+  uint v766;
+  uint v767;
+  uint v768;
+  uint v769;
+  uint v770;
+  uint v771;
+  uint v772;
+  uint v773;
+  uint v774;
+  uint v775;
+  uint v776;
+  uint v777;
+  uint v778;
+  uint v779;
+  uint v780;
+  uint v781;
+  uint v782;
+  uint v783;
+  uint v784;
+  uint v785;
+  uint v786;
+  uint v787;
+  uint v788;
+  uint v789;
+  uint v790;
+  uint v791;
+  uint v792;
+  uint v793;
+  uint v794;
+  uint v795;
+  uint v796;
+  uint v797;
+  uint v798;
+  uint v799;
+  uint v800;
+  uint v801;
+  uint v802;
+  uint v803;
+  uint v804;
+  uint v805;
+  uint v806;
+  uint v807;
+  uint v808;
+  uint v809;
+  uint v810;
+  uint v811;
+  uint v812;
+  uint v813;
+  uint v814;
+  uint v815;
+  uint v816;
+  uint v817;
+  uint v818;
+  uint v819;
+  uint v820;
+  uint v821;
+  uint v822;
+  uint v823;
+  uint v824;
+  uint v825;
+  uint v826;
+  uint v827;
+  uint v828;
+  uint v829;
+  uint v830;
+  uint v831;
+  uint v832;
+  uint v833;
+  uint v834;
+  uint v835;
+  uint v836;
+  uint v837;
+  uint v838;
+  uint v839;
+  uint v840;
+  uint v841;
+  uint v842;
+  uint v843;
+  uint v844;
+  uint v845;
+  uint v846;
+  uint v847;
+  uint v848;
+  uint v849;
+  uint v850;
+  uint v851;
+  uint v852;
+  uint v853;
+  uint v854;
+  uint v855;
+  uint v856;
+  uint v857;
+  uint v858;
+  uint v859;
+  uint v860;
+  uint v861;
+  uint v862;
+  uint v863;
+  uint v864;
+  uint v865;
+  uint v866;
+  uint v867;
+  uint v868;
+  uint v869;
+  uint v870;
+  uint v871;
+  uint v872;
+  uint v873;
+  uint v874;
+  uint v875;
+  uint v876;
+  uint v877;
+  uint v878;
+  uint v879;
+  uint v880;
+  uint v881;
+  uint v882;
+  uint v883;
+  uint v884;
+  uint v885;
+  uint v886;
+  uint v887;
+  uint v888;
+  uint v889;
+  uint v890;
+  uint v891;
+  uint v892;
+  uint v893;
+  uint v894;
+  uint v895;
+  uint v896;
+  uint v897;
+  uint v898;
+  uint v899;
+  uint v900;
+  uint v901;
+  uint v902;
+  uint v903;
+  uint v904;
+  uint v905;
+  uint v906;
+  uint v907;
+  uint v908;
+  uint v909;
+  uint v910;
+  uint v911;
+  uint v912;
+  uint v913;
+  uint v914;
+  uint v915;
+  uint v916;
+  uint v917;
+  uint v918;
+  uint v919;
+  uint v920;
+  uint v921;
+  uint v922;
+  uint v923;
+  uint v924;
+  uint v925;
+  uint v926;
+  uint v927;
+  uint v928;
+  uint v929;
+  uint v930;
+  uint v931;
+  uint v932;
+  uint v933;
+  uint v934;
+  uint v935;
+  uint v936;
+  uint v937;
+  uint v938;
+  uint v939;
+  uint v940;
+  uint v941;
+  uint v942;
+  uint v943;
+  uint v944;
+  uint v945;
+  uint v946;
+  uint v947;
+  uint v948;
+  uint v949;
+  uint v950;
+  uint v951;
+  uint v952;
+  uint v953;
+  uint v954;
+  uint v955;
+  uint v956;
+  uint v957;
+  uint v958;
+  uint v959;
+  uint v960;
+  uint v961;
+  uint v962;
+  uint v963;
+  uint v964;
+  uint v965;
+  uint v966;
+  uint v967;
+  uint v968;
+  uint v969;
+  uint v970;
+  uint v971;
+  uint v972;
+  uint v973;
+  uint v974;
+  uint v975;
+  uint v976;
+  uint v977;
+  uint v978;
+  uint v979;
+  uint v980;
+  uint v981;
+  uint v982;
+  uint v983;
+  uint v984;
+  uint v985;
+  uint v986;
+  uint v987;
+  uint v988;
+  uint v989;
+  uint v990;
+  uint v991;
+  uint v992;
+  uint v993;
+  uint v994;
+  uint v995;
+  uint v996;
+  uint v997;
+  uint v998;
+  uint v999;
+};
+
+uint foo(thread tint_private_vars_struct* const tint_private_vars) {
   uint x = 0u;
-  x = (x + tint_symbol_2);
-  x = (x + tint_symbol_3);
-  x = (x + tint_symbol_4);
-  x = (x + tint_symbol_5);
-  x = (x + tint_symbol_6);
-  x = (x + tint_symbol_7);
-  x = (x + tint_symbol_8);
-  x = (x + tint_symbol_9);
-  x = (x + tint_symbol_10);
-  x = (x + tint_symbol_11);
-  x = (x + tint_symbol_12);
-  x = (x + tint_symbol_13);
-  x = (x + tint_symbol_14);
-  x = (x + tint_symbol_15);
-  x = (x + tint_symbol_16);
-  x = (x + tint_symbol_17);
-  x = (x + tint_symbol_18);
-  x = (x + tint_symbol_19);
-  x = (x + tint_symbol_20);
-  x = (x + tint_symbol_21);
-  x = (x + tint_symbol_22);
-  x = (x + tint_symbol_23);
-  x = (x + tint_symbol_24);
-  x = (x + tint_symbol_25);
-  x = (x + tint_symbol_26);
-  x = (x + tint_symbol_27);
-  x = (x + tint_symbol_28);
-  x = (x + tint_symbol_29);
-  x = (x + tint_symbol_30);
-  x = (x + tint_symbol_31);
-  x = (x + tint_symbol_32);
-  x = (x + tint_symbol_33);
-  x = (x + tint_symbol_34);
-  x = (x + tint_symbol_35);
-  x = (x + tint_symbol_36);
-  x = (x + tint_symbol_37);
-  x = (x + tint_symbol_38);
-  x = (x + tint_symbol_39);
-  x = (x + tint_symbol_40);
-  x = (x + tint_symbol_41);
-  x = (x + tint_symbol_42);
-  x = (x + tint_symbol_43);
-  x = (x + tint_symbol_44);
-  x = (x + tint_symbol_45);
-  x = (x + tint_symbol_46);
-  x = (x + tint_symbol_47);
-  x = (x + tint_symbol_48);
-  x = (x + tint_symbol_49);
-  x = (x + tint_symbol_50);
-  x = (x + tint_symbol_51);
-  x = (x + tint_symbol_52);
-  x = (x + tint_symbol_53);
-  x = (x + tint_symbol_54);
-  x = (x + tint_symbol_55);
-  x = (x + tint_symbol_56);
-  x = (x + tint_symbol_57);
-  x = (x + tint_symbol_58);
-  x = (x + tint_symbol_59);
-  x = (x + tint_symbol_60);
-  x = (x + tint_symbol_61);
-  x = (x + tint_symbol_62);
-  x = (x + tint_symbol_63);
-  x = (x + tint_symbol_64);
-  x = (x + tint_symbol_65);
-  x = (x + tint_symbol_66);
-  x = (x + tint_symbol_67);
-  x = (x + tint_symbol_68);
-  x = (x + tint_symbol_69);
-  x = (x + tint_symbol_70);
-  x = (x + tint_symbol_71);
-  x = (x + tint_symbol_72);
-  x = (x + tint_symbol_73);
-  x = (x + tint_symbol_74);
-  x = (x + tint_symbol_75);
-  x = (x + tint_symbol_76);
-  x = (x + tint_symbol_77);
-  x = (x + tint_symbol_78);
-  x = (x + tint_symbol_79);
-  x = (x + tint_symbol_80);
-  x = (x + tint_symbol_81);
-  x = (x + tint_symbol_82);
-  x = (x + tint_symbol_83);
-  x = (x + tint_symbol_84);
-  x = (x + tint_symbol_85);
-  x = (x + tint_symbol_86);
-  x = (x + tint_symbol_87);
-  x = (x + tint_symbol_88);
-  x = (x + tint_symbol_89);
-  x = (x + tint_symbol_90);
-  x = (x + tint_symbol_91);
-  x = (x + tint_symbol_92);
-  x = (x + tint_symbol_93);
-  x = (x + tint_symbol_94);
-  x = (x + tint_symbol_95);
-  x = (x + tint_symbol_96);
-  x = (x + tint_symbol_97);
-  x = (x + tint_symbol_98);
-  x = (x + tint_symbol_99);
-  x = (x + tint_symbol_100);
-  x = (x + tint_symbol_101);
-  x = (x + tint_symbol_102);
-  x = (x + tint_symbol_103);
-  x = (x + tint_symbol_104);
-  x = (x + tint_symbol_105);
-  x = (x + tint_symbol_106);
-  x = (x + tint_symbol_107);
-  x = (x + tint_symbol_108);
-  x = (x + tint_symbol_109);
-  x = (x + tint_symbol_110);
-  x = (x + tint_symbol_111);
-  x = (x + tint_symbol_112);
-  x = (x + tint_symbol_113);
-  x = (x + tint_symbol_114);
-  x = (x + tint_symbol_115);
-  x = (x + tint_symbol_116);
-  x = (x + tint_symbol_117);
-  x = (x + tint_symbol_118);
-  x = (x + tint_symbol_119);
-  x = (x + tint_symbol_120);
-  x = (x + tint_symbol_121);
-  x = (x + tint_symbol_122);
-  x = (x + tint_symbol_123);
-  x = (x + tint_symbol_124);
-  x = (x + tint_symbol_125);
-  x = (x + tint_symbol_126);
-  x = (x + tint_symbol_127);
-  x = (x + tint_symbol_128);
-  x = (x + tint_symbol_129);
-  x = (x + tint_symbol_130);
-  x = (x + tint_symbol_131);
-  x = (x + tint_symbol_132);
-  x = (x + tint_symbol_133);
-  x = (x + tint_symbol_134);
-  x = (x + tint_symbol_135);
-  x = (x + tint_symbol_136);
-  x = (x + tint_symbol_137);
-  x = (x + tint_symbol_138);
-  x = (x + tint_symbol_139);
-  x = (x + tint_symbol_140);
-  x = (x + tint_symbol_141);
-  x = (x + tint_symbol_142);
-  x = (x + tint_symbol_143);
-  x = (x + tint_symbol_144);
-  x = (x + tint_symbol_145);
-  x = (x + tint_symbol_146);
-  x = (x + tint_symbol_147);
-  x = (x + tint_symbol_148);
-  x = (x + tint_symbol_149);
-  x = (x + tint_symbol_150);
-  x = (x + tint_symbol_151);
-  x = (x + tint_symbol_152);
-  x = (x + tint_symbol_153);
-  x = (x + tint_symbol_154);
-  x = (x + tint_symbol_155);
-  x = (x + tint_symbol_156);
-  x = (x + tint_symbol_157);
-  x = (x + tint_symbol_158);
-  x = (x + tint_symbol_159);
-  x = (x + tint_symbol_160);
-  x = (x + tint_symbol_161);
-  x = (x + tint_symbol_162);
-  x = (x + tint_symbol_163);
-  x = (x + tint_symbol_164);
-  x = (x + tint_symbol_165);
-  x = (x + tint_symbol_166);
-  x = (x + tint_symbol_167);
-  x = (x + tint_symbol_168);
-  x = (x + tint_symbol_169);
-  x = (x + tint_symbol_170);
-  x = (x + tint_symbol_171);
-  x = (x + tint_symbol_172);
-  x = (x + tint_symbol_173);
-  x = (x + tint_symbol_174);
-  x = (x + tint_symbol_175);
-  x = (x + tint_symbol_176);
-  x = (x + tint_symbol_177);
-  x = (x + tint_symbol_178);
-  x = (x + tint_symbol_179);
-  x = (x + tint_symbol_180);
-  x = (x + tint_symbol_181);
-  x = (x + tint_symbol_182);
-  x = (x + tint_symbol_183);
-  x = (x + tint_symbol_184);
-  x = (x + tint_symbol_185);
-  x = (x + tint_symbol_186);
-  x = (x + tint_symbol_187);
-  x = (x + tint_symbol_188);
-  x = (x + tint_symbol_189);
-  x = (x + tint_symbol_190);
-  x = (x + tint_symbol_191);
-  x = (x + tint_symbol_192);
-  x = (x + tint_symbol_193);
-  x = (x + tint_symbol_194);
-  x = (x + tint_symbol_195);
-  x = (x + tint_symbol_196);
-  x = (x + tint_symbol_197);
-  x = (x + tint_symbol_198);
-  x = (x + tint_symbol_199);
-  x = (x + tint_symbol_200);
-  x = (x + tint_symbol_201);
-  x = (x + tint_symbol_202);
-  x = (x + tint_symbol_203);
-  x = (x + tint_symbol_204);
-  x = (x + tint_symbol_205);
-  x = (x + tint_symbol_206);
-  x = (x + tint_symbol_207);
-  x = (x + tint_symbol_208);
-  x = (x + tint_symbol_209);
-  x = (x + tint_symbol_210);
-  x = (x + tint_symbol_211);
-  x = (x + tint_symbol_212);
-  x = (x + tint_symbol_213);
-  x = (x + tint_symbol_214);
-  x = (x + tint_symbol_215);
-  x = (x + tint_symbol_216);
-  x = (x + tint_symbol_217);
-  x = (x + tint_symbol_218);
-  x = (x + tint_symbol_219);
-  x = (x + tint_symbol_220);
-  x = (x + tint_symbol_221);
-  x = (x + tint_symbol_222);
-  x = (x + tint_symbol_223);
-  x = (x + tint_symbol_224);
-  x = (x + tint_symbol_225);
-  x = (x + tint_symbol_226);
-  x = (x + tint_symbol_227);
-  x = (x + tint_symbol_228);
-  x = (x + tint_symbol_229);
-  x = (x + tint_symbol_230);
-  x = (x + tint_symbol_231);
-  x = (x + tint_symbol_232);
-  x = (x + tint_symbol_233);
-  x = (x + tint_symbol_234);
-  x = (x + tint_symbol_235);
-  x = (x + tint_symbol_236);
-  x = (x + tint_symbol_237);
-  x = (x + tint_symbol_238);
-  x = (x + tint_symbol_239);
-  x = (x + tint_symbol_240);
-  x = (x + tint_symbol_241);
-  x = (x + tint_symbol_242);
-  x = (x + tint_symbol_243);
-  x = (x + tint_symbol_244);
-  x = (x + tint_symbol_245);
-  x = (x + tint_symbol_246);
-  x = (x + tint_symbol_247);
-  x = (x + tint_symbol_248);
-  x = (x + tint_symbol_249);
-  x = (x + tint_symbol_250);
-  x = (x + tint_symbol_251);
-  x = (x + tint_symbol_252);
-  x = (x + tint_symbol_253);
-  x = (x + tint_symbol_254);
-  x = (x + tint_symbol_255);
-  x = (x + tint_symbol_256);
-  x = (x + tint_symbol_257);
-  x = (x + tint_symbol_258);
-  x = (x + tint_symbol_259);
-  x = (x + tint_symbol_260);
-  x = (x + tint_symbol_261);
-  x = (x + tint_symbol_262);
-  x = (x + tint_symbol_263);
-  x = (x + tint_symbol_264);
-  x = (x + tint_symbol_265);
-  x = (x + tint_symbol_266);
-  x = (x + tint_symbol_267);
-  x = (x + tint_symbol_268);
-  x = (x + tint_symbol_269);
-  x = (x + tint_symbol_270);
-  x = (x + tint_symbol_271);
-  x = (x + tint_symbol_272);
-  x = (x + tint_symbol_273);
-  x = (x + tint_symbol_274);
-  x = (x + tint_symbol_275);
-  x = (x + tint_symbol_276);
-  x = (x + tint_symbol_277);
-  x = (x + tint_symbol_278);
-  x = (x + tint_symbol_279);
-  x = (x + tint_symbol_280);
-  x = (x + tint_symbol_281);
-  x = (x + tint_symbol_282);
-  x = (x + tint_symbol_283);
-  x = (x + tint_symbol_284);
-  x = (x + tint_symbol_285);
-  x = (x + tint_symbol_286);
-  x = (x + tint_symbol_287);
-  x = (x + tint_symbol_288);
-  x = (x + tint_symbol_289);
-  x = (x + tint_symbol_290);
-  x = (x + tint_symbol_291);
-  x = (x + tint_symbol_292);
-  x = (x + tint_symbol_293);
-  x = (x + tint_symbol_294);
-  x = (x + tint_symbol_295);
-  x = (x + tint_symbol_296);
-  x = (x + tint_symbol_297);
-  x = (x + tint_symbol_298);
-  x = (x + tint_symbol_299);
-  x = (x + tint_symbol_300);
-  x = (x + tint_symbol_301);
-  x = (x + tint_symbol_302);
-  x = (x + tint_symbol_303);
-  x = (x + tint_symbol_304);
-  x = (x + tint_symbol_305);
-  x = (x + tint_symbol_306);
-  x = (x + tint_symbol_307);
-  x = (x + tint_symbol_308);
-  x = (x + tint_symbol_309);
-  x = (x + tint_symbol_310);
-  x = (x + tint_symbol_311);
-  x = (x + tint_symbol_312);
-  x = (x + tint_symbol_313);
-  x = (x + tint_symbol_314);
-  x = (x + tint_symbol_315);
-  x = (x + tint_symbol_316);
-  x = (x + tint_symbol_317);
-  x = (x + tint_symbol_318);
-  x = (x + tint_symbol_319);
-  x = (x + tint_symbol_320);
-  x = (x + tint_symbol_321);
-  x = (x + tint_symbol_322);
-  x = (x + tint_symbol_323);
-  x = (x + tint_symbol_324);
-  x = (x + tint_symbol_325);
-  x = (x + tint_symbol_326);
-  x = (x + tint_symbol_327);
-  x = (x + tint_symbol_328);
-  x = (x + tint_symbol_329);
-  x = (x + tint_symbol_330);
-  x = (x + tint_symbol_331);
-  x = (x + tint_symbol_332);
-  x = (x + tint_symbol_333);
-  x = (x + tint_symbol_334);
-  x = (x + tint_symbol_335);
-  x = (x + tint_symbol_336);
-  x = (x + tint_symbol_337);
-  x = (x + tint_symbol_338);
-  x = (x + tint_symbol_339);
-  x = (x + tint_symbol_340);
-  x = (x + tint_symbol_341);
-  x = (x + tint_symbol_342);
-  x = (x + tint_symbol_343);
-  x = (x + tint_symbol_344);
-  x = (x + tint_symbol_345);
-  x = (x + tint_symbol_346);
-  x = (x + tint_symbol_347);
-  x = (x + tint_symbol_348);
-  x = (x + tint_symbol_349);
-  x = (x + tint_symbol_350);
-  x = (x + tint_symbol_351);
-  x = (x + tint_symbol_352);
-  x = (x + tint_symbol_353);
-  x = (x + tint_symbol_354);
-  x = (x + tint_symbol_355);
-  x = (x + tint_symbol_356);
-  x = (x + tint_symbol_357);
-  x = (x + tint_symbol_358);
-  x = (x + tint_symbol_359);
-  x = (x + tint_symbol_360);
-  x = (x + tint_symbol_361);
-  x = (x + tint_symbol_362);
-  x = (x + tint_symbol_363);
-  x = (x + tint_symbol_364);
-  x = (x + tint_symbol_365);
-  x = (x + tint_symbol_366);
-  x = (x + tint_symbol_367);
-  x = (x + tint_symbol_368);
-  x = (x + tint_symbol_369);
-  x = (x + tint_symbol_370);
-  x = (x + tint_symbol_371);
-  x = (x + tint_symbol_372);
-  x = (x + tint_symbol_373);
-  x = (x + tint_symbol_374);
-  x = (x + tint_symbol_375);
-  x = (x + tint_symbol_376);
-  x = (x + tint_symbol_377);
-  x = (x + tint_symbol_378);
-  x = (x + tint_symbol_379);
-  x = (x + tint_symbol_380);
-  x = (x + tint_symbol_381);
-  x = (x + tint_symbol_382);
-  x = (x + tint_symbol_383);
-  x = (x + tint_symbol_384);
-  x = (x + tint_symbol_385);
-  x = (x + tint_symbol_386);
-  x = (x + tint_symbol_387);
-  x = (x + tint_symbol_388);
-  x = (x + tint_symbol_389);
-  x = (x + tint_symbol_390);
-  x = (x + tint_symbol_391);
-  x = (x + tint_symbol_392);
-  x = (x + tint_symbol_393);
-  x = (x + tint_symbol_394);
-  x = (x + tint_symbol_395);
-  x = (x + tint_symbol_396);
-  x = (x + tint_symbol_397);
-  x = (x + tint_symbol_398);
-  x = (x + tint_symbol_399);
-  x = (x + tint_symbol_400);
-  x = (x + tint_symbol_401);
-  x = (x + tint_symbol_402);
-  x = (x + tint_symbol_403);
-  x = (x + tint_symbol_404);
-  x = (x + tint_symbol_405);
-  x = (x + tint_symbol_406);
-  x = (x + tint_symbol_407);
-  x = (x + tint_symbol_408);
-  x = (x + tint_symbol_409);
-  x = (x + tint_symbol_410);
-  x = (x + tint_symbol_411);
-  x = (x + tint_symbol_412);
-  x = (x + tint_symbol_413);
-  x = (x + tint_symbol_414);
-  x = (x + tint_symbol_415);
-  x = (x + tint_symbol_416);
-  x = (x + tint_symbol_417);
-  x = (x + tint_symbol_418);
-  x = (x + tint_symbol_419);
-  x = (x + tint_symbol_420);
-  x = (x + tint_symbol_421);
-  x = (x + tint_symbol_422);
-  x = (x + tint_symbol_423);
-  x = (x + tint_symbol_424);
-  x = (x + tint_symbol_425);
-  x = (x + tint_symbol_426);
-  x = (x + tint_symbol_427);
-  x = (x + tint_symbol_428);
-  x = (x + tint_symbol_429);
-  x = (x + tint_symbol_430);
-  x = (x + tint_symbol_431);
-  x = (x + tint_symbol_432);
-  x = (x + tint_symbol_433);
-  x = (x + tint_symbol_434);
-  x = (x + tint_symbol_435);
-  x = (x + tint_symbol_436);
-  x = (x + tint_symbol_437);
-  x = (x + tint_symbol_438);
-  x = (x + tint_symbol_439);
-  x = (x + tint_symbol_440);
-  x = (x + tint_symbol_441);
-  x = (x + tint_symbol_442);
-  x = (x + tint_symbol_443);
-  x = (x + tint_symbol_444);
-  x = (x + tint_symbol_445);
-  x = (x + tint_symbol_446);
-  x = (x + tint_symbol_447);
-  x = (x + tint_symbol_448);
-  x = (x + tint_symbol_449);
-  x = (x + tint_symbol_450);
-  x = (x + tint_symbol_451);
-  x = (x + tint_symbol_452);
-  x = (x + tint_symbol_453);
-  x = (x + tint_symbol_454);
-  x = (x + tint_symbol_455);
-  x = (x + tint_symbol_456);
-  x = (x + tint_symbol_457);
-  x = (x + tint_symbol_458);
-  x = (x + tint_symbol_459);
-  x = (x + tint_symbol_460);
-  x = (x + tint_symbol_461);
-  x = (x + tint_symbol_462);
-  x = (x + tint_symbol_463);
-  x = (x + tint_symbol_464);
-  x = (x + tint_symbol_465);
-  x = (x + tint_symbol_466);
-  x = (x + tint_symbol_467);
-  x = (x + tint_symbol_468);
-  x = (x + tint_symbol_469);
-  x = (x + tint_symbol_470);
-  x = (x + tint_symbol_471);
-  x = (x + tint_symbol_472);
-  x = (x + tint_symbol_473);
-  x = (x + tint_symbol_474);
-  x = (x + tint_symbol_475);
-  x = (x + tint_symbol_476);
-  x = (x + tint_symbol_477);
-  x = (x + tint_symbol_478);
-  x = (x + tint_symbol_479);
-  x = (x + tint_symbol_480);
-  x = (x + tint_symbol_481);
-  x = (x + tint_symbol_482);
-  x = (x + tint_symbol_483);
-  x = (x + tint_symbol_484);
-  x = (x + tint_symbol_485);
-  x = (x + tint_symbol_486);
-  x = (x + tint_symbol_487);
-  x = (x + tint_symbol_488);
-  x = (x + tint_symbol_489);
-  x = (x + tint_symbol_490);
-  x = (x + tint_symbol_491);
-  x = (x + tint_symbol_492);
-  x = (x + tint_symbol_493);
-  x = (x + tint_symbol_494);
-  x = (x + tint_symbol_495);
-  x = (x + tint_symbol_496);
-  x = (x + tint_symbol_497);
-  x = (x + tint_symbol_498);
-  x = (x + tint_symbol_499);
-  x = (x + tint_symbol_500);
-  x = (x + tint_symbol_501);
-  x = (x + tint_symbol_502);
-  x = (x + tint_symbol_503);
-  x = (x + tint_symbol_504);
-  x = (x + tint_symbol_505);
-  x = (x + tint_symbol_506);
-  x = (x + tint_symbol_507);
-  x = (x + tint_symbol_508);
-  x = (x + tint_symbol_509);
-  x = (x + tint_symbol_510);
-  x = (x + tint_symbol_511);
-  x = (x + tint_symbol_512);
-  x = (x + tint_symbol_513);
-  x = (x + tint_symbol_514);
-  x = (x + tint_symbol_515);
-  x = (x + tint_symbol_516);
-  x = (x + tint_symbol_517);
-  x = (x + tint_symbol_518);
-  x = (x + tint_symbol_519);
-  x = (x + tint_symbol_520);
-  x = (x + tint_symbol_521);
-  x = (x + tint_symbol_522);
-  x = (x + tint_symbol_523);
-  x = (x + tint_symbol_524);
-  x = (x + tint_symbol_525);
-  x = (x + tint_symbol_526);
-  x = (x + tint_symbol_527);
-  x = (x + tint_symbol_528);
-  x = (x + tint_symbol_529);
-  x = (x + tint_symbol_530);
-  x = (x + tint_symbol_531);
-  x = (x + tint_symbol_532);
-  x = (x + tint_symbol_533);
-  x = (x + tint_symbol_534);
-  x = (x + tint_symbol_535);
-  x = (x + tint_symbol_536);
-  x = (x + tint_symbol_537);
-  x = (x + tint_symbol_538);
-  x = (x + tint_symbol_539);
-  x = (x + tint_symbol_540);
-  x = (x + tint_symbol_541);
-  x = (x + tint_symbol_542);
-  x = (x + tint_symbol_543);
-  x = (x + tint_symbol_544);
-  x = (x + tint_symbol_545);
-  x = (x + tint_symbol_546);
-  x = (x + tint_symbol_547);
-  x = (x + tint_symbol_548);
-  x = (x + tint_symbol_549);
-  x = (x + tint_symbol_550);
-  x = (x + tint_symbol_551);
-  x = (x + tint_symbol_552);
-  x = (x + tint_symbol_553);
-  x = (x + tint_symbol_554);
-  x = (x + tint_symbol_555);
-  x = (x + tint_symbol_556);
-  x = (x + tint_symbol_557);
-  x = (x + tint_symbol_558);
-  x = (x + tint_symbol_559);
-  x = (x + tint_symbol_560);
-  x = (x + tint_symbol_561);
-  x = (x + tint_symbol_562);
-  x = (x + tint_symbol_563);
-  x = (x + tint_symbol_564);
-  x = (x + tint_symbol_565);
-  x = (x + tint_symbol_566);
-  x = (x + tint_symbol_567);
-  x = (x + tint_symbol_568);
-  x = (x + tint_symbol_569);
-  x = (x + tint_symbol_570);
-  x = (x + tint_symbol_571);
-  x = (x + tint_symbol_572);
-  x = (x + tint_symbol_573);
-  x = (x + tint_symbol_574);
-  x = (x + tint_symbol_575);
-  x = (x + tint_symbol_576);
-  x = (x + tint_symbol_577);
-  x = (x + tint_symbol_578);
-  x = (x + tint_symbol_579);
-  x = (x + tint_symbol_580);
-  x = (x + tint_symbol_581);
-  x = (x + tint_symbol_582);
-  x = (x + tint_symbol_583);
-  x = (x + tint_symbol_584);
-  x = (x + tint_symbol_585);
-  x = (x + tint_symbol_586);
-  x = (x + tint_symbol_587);
-  x = (x + tint_symbol_588);
-  x = (x + tint_symbol_589);
-  x = (x + tint_symbol_590);
-  x = (x + tint_symbol_591);
-  x = (x + tint_symbol_592);
-  x = (x + tint_symbol_593);
-  x = (x + tint_symbol_594);
-  x = (x + tint_symbol_595);
-  x = (x + tint_symbol_596);
-  x = (x + tint_symbol_597);
-  x = (x + tint_symbol_598);
-  x = (x + tint_symbol_599);
-  x = (x + tint_symbol_600);
-  x = (x + tint_symbol_601);
-  x = (x + tint_symbol_602);
-  x = (x + tint_symbol_603);
-  x = (x + tint_symbol_604);
-  x = (x + tint_symbol_605);
-  x = (x + tint_symbol_606);
-  x = (x + tint_symbol_607);
-  x = (x + tint_symbol_608);
-  x = (x + tint_symbol_609);
-  x = (x + tint_symbol_610);
-  x = (x + tint_symbol_611);
-  x = (x + tint_symbol_612);
-  x = (x + tint_symbol_613);
-  x = (x + tint_symbol_614);
-  x = (x + tint_symbol_615);
-  x = (x + tint_symbol_616);
-  x = (x + tint_symbol_617);
-  x = (x + tint_symbol_618);
-  x = (x + tint_symbol_619);
-  x = (x + tint_symbol_620);
-  x = (x + tint_symbol_621);
-  x = (x + tint_symbol_622);
-  x = (x + tint_symbol_623);
-  x = (x + tint_symbol_624);
-  x = (x + tint_symbol_625);
-  x = (x + tint_symbol_626);
-  x = (x + tint_symbol_627);
-  x = (x + tint_symbol_628);
-  x = (x + tint_symbol_629);
-  x = (x + tint_symbol_630);
-  x = (x + tint_symbol_631);
-  x = (x + tint_symbol_632);
-  x = (x + tint_symbol_633);
-  x = (x + tint_symbol_634);
-  x = (x + tint_symbol_635);
-  x = (x + tint_symbol_636);
-  x = (x + tint_symbol_637);
-  x = (x + tint_symbol_638);
-  x = (x + tint_symbol_639);
-  x = (x + tint_symbol_640);
-  x = (x + tint_symbol_641);
-  x = (x + tint_symbol_642);
-  x = (x + tint_symbol_643);
-  x = (x + tint_symbol_644);
-  x = (x + tint_symbol_645);
-  x = (x + tint_symbol_646);
-  x = (x + tint_symbol_647);
-  x = (x + tint_symbol_648);
-  x = (x + tint_symbol_649);
-  x = (x + tint_symbol_650);
-  x = (x + tint_symbol_651);
-  x = (x + tint_symbol_652);
-  x = (x + tint_symbol_653);
-  x = (x + tint_symbol_654);
-  x = (x + tint_symbol_655);
-  x = (x + tint_symbol_656);
-  x = (x + tint_symbol_657);
-  x = (x + tint_symbol_658);
-  x = (x + tint_symbol_659);
-  x = (x + tint_symbol_660);
-  x = (x + tint_symbol_661);
-  x = (x + tint_symbol_662);
-  x = (x + tint_symbol_663);
-  x = (x + tint_symbol_664);
-  x = (x + tint_symbol_665);
-  x = (x + tint_symbol_666);
-  x = (x + tint_symbol_667);
-  x = (x + tint_symbol_668);
-  x = (x + tint_symbol_669);
-  x = (x + tint_symbol_670);
-  x = (x + tint_symbol_671);
-  x = (x + tint_symbol_672);
-  x = (x + tint_symbol_673);
-  x = (x + tint_symbol_674);
-  x = (x + tint_symbol_675);
-  x = (x + tint_symbol_676);
-  x = (x + tint_symbol_677);
-  x = (x + tint_symbol_678);
-  x = (x + tint_symbol_679);
-  x = (x + tint_symbol_680);
-  x = (x + tint_symbol_681);
-  x = (x + tint_symbol_682);
-  x = (x + tint_symbol_683);
-  x = (x + tint_symbol_684);
-  x = (x + tint_symbol_685);
-  x = (x + tint_symbol_686);
-  x = (x + tint_symbol_687);
-  x = (x + tint_symbol_688);
-  x = (x + tint_symbol_689);
-  x = (x + tint_symbol_690);
-  x = (x + tint_symbol_691);
-  x = (x + tint_symbol_692);
-  x = (x + tint_symbol_693);
-  x = (x + tint_symbol_694);
-  x = (x + tint_symbol_695);
-  x = (x + tint_symbol_696);
-  x = (x + tint_symbol_697);
-  x = (x + tint_symbol_698);
-  x = (x + tint_symbol_699);
-  x = (x + tint_symbol_700);
-  x = (x + tint_symbol_701);
-  x = (x + tint_symbol_702);
-  x = (x + tint_symbol_703);
-  x = (x + tint_symbol_704);
-  x = (x + tint_symbol_705);
-  x = (x + tint_symbol_706);
-  x = (x + tint_symbol_707);
-  x = (x + tint_symbol_708);
-  x = (x + tint_symbol_709);
-  x = (x + tint_symbol_710);
-  x = (x + tint_symbol_711);
-  x = (x + tint_symbol_712);
-  x = (x + tint_symbol_713);
-  x = (x + tint_symbol_714);
-  x = (x + tint_symbol_715);
-  x = (x + tint_symbol_716);
-  x = (x + tint_symbol_717);
-  x = (x + tint_symbol_718);
-  x = (x + tint_symbol_719);
-  x = (x + tint_symbol_720);
-  x = (x + tint_symbol_721);
-  x = (x + tint_symbol_722);
-  x = (x + tint_symbol_723);
-  x = (x + tint_symbol_724);
-  x = (x + tint_symbol_725);
-  x = (x + tint_symbol_726);
-  x = (x + tint_symbol_727);
-  x = (x + tint_symbol_728);
-  x = (x + tint_symbol_729);
-  x = (x + tint_symbol_730);
-  x = (x + tint_symbol_731);
-  x = (x + tint_symbol_732);
-  x = (x + tint_symbol_733);
-  x = (x + tint_symbol_734);
-  x = (x + tint_symbol_735);
-  x = (x + tint_symbol_736);
-  x = (x + tint_symbol_737);
-  x = (x + tint_symbol_738);
-  x = (x + tint_symbol_739);
-  x = (x + tint_symbol_740);
-  x = (x + tint_symbol_741);
-  x = (x + tint_symbol_742);
-  x = (x + tint_symbol_743);
-  x = (x + tint_symbol_744);
-  x = (x + tint_symbol_745);
-  x = (x + tint_symbol_746);
-  x = (x + tint_symbol_747);
-  x = (x + tint_symbol_748);
-  x = (x + tint_symbol_749);
-  x = (x + tint_symbol_750);
-  x = (x + tint_symbol_751);
-  x = (x + tint_symbol_752);
-  x = (x + tint_symbol_753);
-  x = (x + tint_symbol_754);
-  x = (x + tint_symbol_755);
-  x = (x + tint_symbol_756);
-  x = (x + tint_symbol_757);
-  x = (x + tint_symbol_758);
-  x = (x + tint_symbol_759);
-  x = (x + tint_symbol_760);
-  x = (x + tint_symbol_761);
-  x = (x + tint_symbol_762);
-  x = (x + tint_symbol_763);
-  x = (x + tint_symbol_764);
-  x = (x + tint_symbol_765);
-  x = (x + tint_symbol_766);
-  x = (x + tint_symbol_767);
-  x = (x + tint_symbol_768);
-  x = (x + tint_symbol_769);
-  x = (x + tint_symbol_770);
-  x = (x + tint_symbol_771);
-  x = (x + tint_symbol_772);
-  x = (x + tint_symbol_773);
-  x = (x + tint_symbol_774);
-  x = (x + tint_symbol_775);
-  x = (x + tint_symbol_776);
-  x = (x + tint_symbol_777);
-  x = (x + tint_symbol_778);
-  x = (x + tint_symbol_779);
-  x = (x + tint_symbol_780);
-  x = (x + tint_symbol_781);
-  x = (x + tint_symbol_782);
-  x = (x + tint_symbol_783);
-  x = (x + tint_symbol_784);
-  x = (x + tint_symbol_785);
-  x = (x + tint_symbol_786);
-  x = (x + tint_symbol_787);
-  x = (x + tint_symbol_788);
-  x = (x + tint_symbol_789);
-  x = (x + tint_symbol_790);
-  x = (x + tint_symbol_791);
-  x = (x + tint_symbol_792);
-  x = (x + tint_symbol_793);
-  x = (x + tint_symbol_794);
-  x = (x + tint_symbol_795);
-  x = (x + tint_symbol_796);
-  x = (x + tint_symbol_797);
-  x = (x + tint_symbol_798);
-  x = (x + tint_symbol_799);
-  x = (x + tint_symbol_800);
-  x = (x + tint_symbol_801);
-  x = (x + tint_symbol_802);
-  x = (x + tint_symbol_803);
-  x = (x + tint_symbol_804);
-  x = (x + tint_symbol_805);
-  x = (x + tint_symbol_806);
-  x = (x + tint_symbol_807);
-  x = (x + tint_symbol_808);
-  x = (x + tint_symbol_809);
-  x = (x + tint_symbol_810);
-  x = (x + tint_symbol_811);
-  x = (x + tint_symbol_812);
-  x = (x + tint_symbol_813);
-  x = (x + tint_symbol_814);
-  x = (x + tint_symbol_815);
-  x = (x + tint_symbol_816);
-  x = (x + tint_symbol_817);
-  x = (x + tint_symbol_818);
-  x = (x + tint_symbol_819);
-  x = (x + tint_symbol_820);
-  x = (x + tint_symbol_821);
-  x = (x + tint_symbol_822);
-  x = (x + tint_symbol_823);
-  x = (x + tint_symbol_824);
-  x = (x + tint_symbol_825);
-  x = (x + tint_symbol_826);
-  x = (x + tint_symbol_827);
-  x = (x + tint_symbol_828);
-  x = (x + tint_symbol_829);
-  x = (x + tint_symbol_830);
-  x = (x + tint_symbol_831);
-  x = (x + tint_symbol_832);
-  x = (x + tint_symbol_833);
-  x = (x + tint_symbol_834);
-  x = (x + tint_symbol_835);
-  x = (x + tint_symbol_836);
-  x = (x + tint_symbol_837);
-  x = (x + tint_symbol_838);
-  x = (x + tint_symbol_839);
-  x = (x + tint_symbol_840);
-  x = (x + tint_symbol_841);
-  x = (x + tint_symbol_842);
-  x = (x + tint_symbol_843);
-  x = (x + tint_symbol_844);
-  x = (x + tint_symbol_845);
-  x = (x + tint_symbol_846);
-  x = (x + tint_symbol_847);
-  x = (x + tint_symbol_848);
-  x = (x + tint_symbol_849);
-  x = (x + tint_symbol_850);
-  x = (x + tint_symbol_851);
-  x = (x + tint_symbol_852);
-  x = (x + tint_symbol_853);
-  x = (x + tint_symbol_854);
-  x = (x + tint_symbol_855);
-  x = (x + tint_symbol_856);
-  x = (x + tint_symbol_857);
-  x = (x + tint_symbol_858);
-  x = (x + tint_symbol_859);
-  x = (x + tint_symbol_860);
-  x = (x + tint_symbol_861);
-  x = (x + tint_symbol_862);
-  x = (x + tint_symbol_863);
-  x = (x + tint_symbol_864);
-  x = (x + tint_symbol_865);
-  x = (x + tint_symbol_866);
-  x = (x + tint_symbol_867);
-  x = (x + tint_symbol_868);
-  x = (x + tint_symbol_869);
-  x = (x + tint_symbol_870);
-  x = (x + tint_symbol_871);
-  x = (x + tint_symbol_872);
-  x = (x + tint_symbol_873);
-  x = (x + tint_symbol_874);
-  x = (x + tint_symbol_875);
-  x = (x + tint_symbol_876);
-  x = (x + tint_symbol_877);
-  x = (x + tint_symbol_878);
-  x = (x + tint_symbol_879);
-  x = (x + tint_symbol_880);
-  x = (x + tint_symbol_881);
-  x = (x + tint_symbol_882);
-  x = (x + tint_symbol_883);
-  x = (x + tint_symbol_884);
-  x = (x + tint_symbol_885);
-  x = (x + tint_symbol_886);
-  x = (x + tint_symbol_887);
-  x = (x + tint_symbol_888);
-  x = (x + tint_symbol_889);
-  x = (x + tint_symbol_890);
-  x = (x + tint_symbol_891);
-  x = (x + tint_symbol_892);
-  x = (x + tint_symbol_893);
-  x = (x + tint_symbol_894);
-  x = (x + tint_symbol_895);
-  x = (x + tint_symbol_896);
-  x = (x + tint_symbol_897);
-  x = (x + tint_symbol_898);
-  x = (x + tint_symbol_899);
-  x = (x + tint_symbol_900);
-  x = (x + tint_symbol_901);
-  x = (x + tint_symbol_902);
-  x = (x + tint_symbol_903);
-  x = (x + tint_symbol_904);
-  x = (x + tint_symbol_905);
-  x = (x + tint_symbol_906);
-  x = (x + tint_symbol_907);
-  x = (x + tint_symbol_908);
-  x = (x + tint_symbol_909);
-  x = (x + tint_symbol_910);
-  x = (x + tint_symbol_911);
-  x = (x + tint_symbol_912);
-  x = (x + tint_symbol_913);
-  x = (x + tint_symbol_914);
-  x = (x + tint_symbol_915);
-  x = (x + tint_symbol_916);
-  x = (x + tint_symbol_917);
-  x = (x + tint_symbol_918);
-  x = (x + tint_symbol_919);
-  x = (x + tint_symbol_920);
-  x = (x + tint_symbol_921);
-  x = (x + tint_symbol_922);
-  x = (x + tint_symbol_923);
-  x = (x + tint_symbol_924);
-  x = (x + tint_symbol_925);
-  x = (x + tint_symbol_926);
-  x = (x + tint_symbol_927);
-  x = (x + tint_symbol_928);
-  x = (x + tint_symbol_929);
-  x = (x + tint_symbol_930);
-  x = (x + tint_symbol_931);
-  x = (x + tint_symbol_932);
-  x = (x + tint_symbol_933);
-  x = (x + tint_symbol_934);
-  x = (x + tint_symbol_935);
-  x = (x + tint_symbol_936);
-  x = (x + tint_symbol_937);
-  x = (x + tint_symbol_938);
-  x = (x + tint_symbol_939);
-  x = (x + tint_symbol_940);
-  x = (x + tint_symbol_941);
-  x = (x + tint_symbol_942);
-  x = (x + tint_symbol_943);
-  x = (x + tint_symbol_944);
-  x = (x + tint_symbol_945);
-  x = (x + tint_symbol_946);
-  x = (x + tint_symbol_947);
-  x = (x + tint_symbol_948);
-  x = (x + tint_symbol_949);
-  x = (x + tint_symbol_950);
-  x = (x + tint_symbol_951);
-  x = (x + tint_symbol_952);
-  x = (x + tint_symbol_953);
-  x = (x + tint_symbol_954);
-  x = (x + tint_symbol_955);
-  x = (x + tint_symbol_956);
-  x = (x + tint_symbol_957);
-  x = (x + tint_symbol_958);
-  x = (x + tint_symbol_959);
-  x = (x + tint_symbol_960);
-  x = (x + tint_symbol_961);
-  x = (x + tint_symbol_962);
-  x = (x + tint_symbol_963);
-  x = (x + tint_symbol_964);
-  x = (x + tint_symbol_965);
-  x = (x + tint_symbol_966);
-  x = (x + tint_symbol_967);
-  x = (x + tint_symbol_968);
-  x = (x + tint_symbol_969);
-  x = (x + tint_symbol_970);
-  x = (x + tint_symbol_971);
-  x = (x + tint_symbol_972);
-  x = (x + tint_symbol_973);
-  x = (x + tint_symbol_974);
-  x = (x + tint_symbol_975);
-  x = (x + tint_symbol_976);
-  x = (x + tint_symbol_977);
-  x = (x + tint_symbol_978);
-  x = (x + tint_symbol_979);
-  x = (x + tint_symbol_980);
-  x = (x + tint_symbol_981);
-  x = (x + tint_symbol_982);
-  x = (x + tint_symbol_983);
-  x = (x + tint_symbol_984);
-  x = (x + tint_symbol_985);
-  x = (x + tint_symbol_986);
-  x = (x + tint_symbol_987);
-  x = (x + tint_symbol_988);
-  x = (x + tint_symbol_989);
-  x = (x + tint_symbol_990);
-  x = (x + tint_symbol_991);
-  x = (x + tint_symbol_992);
-  x = (x + tint_symbol_993);
-  x = (x + tint_symbol_994);
-  x = (x + tint_symbol_995);
-  x = (x + tint_symbol_996);
-  x = (x + tint_symbol_997);
-  x = (x + tint_symbol_998);
-  x = (x + tint_symbol_999);
-  x = (x + tint_symbol_1000);
-  x = (x + tint_symbol_1001);
+  x = (x + (*(tint_private_vars)).v0);
+  x = (x + (*(tint_private_vars)).v1);
+  x = (x + (*(tint_private_vars)).v2);
+  x = (x + (*(tint_private_vars)).v3);
+  x = (x + (*(tint_private_vars)).v4);
+  x = (x + (*(tint_private_vars)).v5);
+  x = (x + (*(tint_private_vars)).v6);
+  x = (x + (*(tint_private_vars)).v7);
+  x = (x + (*(tint_private_vars)).v8);
+  x = (x + (*(tint_private_vars)).v9);
+  x = (x + (*(tint_private_vars)).v10);
+  x = (x + (*(tint_private_vars)).v11);
+  x = (x + (*(tint_private_vars)).v12);
+  x = (x + (*(tint_private_vars)).v13);
+  x = (x + (*(tint_private_vars)).v14);
+  x = (x + (*(tint_private_vars)).v15);
+  x = (x + (*(tint_private_vars)).v16);
+  x = (x + (*(tint_private_vars)).v17);
+  x = (x + (*(tint_private_vars)).v18);
+  x = (x + (*(tint_private_vars)).v19);
+  x = (x + (*(tint_private_vars)).v20);
+  x = (x + (*(tint_private_vars)).v21);
+  x = (x + (*(tint_private_vars)).v22);
+  x = (x + (*(tint_private_vars)).v23);
+  x = (x + (*(tint_private_vars)).v24);
+  x = (x + (*(tint_private_vars)).v25);
+  x = (x + (*(tint_private_vars)).v26);
+  x = (x + (*(tint_private_vars)).v27);
+  x = (x + (*(tint_private_vars)).v28);
+  x = (x + (*(tint_private_vars)).v29);
+  x = (x + (*(tint_private_vars)).v30);
+  x = (x + (*(tint_private_vars)).v31);
+  x = (x + (*(tint_private_vars)).v32);
+  x = (x + (*(tint_private_vars)).v33);
+  x = (x + (*(tint_private_vars)).v34);
+  x = (x + (*(tint_private_vars)).v35);
+  x = (x + (*(tint_private_vars)).v36);
+  x = (x + (*(tint_private_vars)).v37);
+  x = (x + (*(tint_private_vars)).v38);
+  x = (x + (*(tint_private_vars)).v39);
+  x = (x + (*(tint_private_vars)).v40);
+  x = (x + (*(tint_private_vars)).v41);
+  x = (x + (*(tint_private_vars)).v42);
+  x = (x + (*(tint_private_vars)).v43);
+  x = (x + (*(tint_private_vars)).v44);
+  x = (x + (*(tint_private_vars)).v45);
+  x = (x + (*(tint_private_vars)).v46);
+  x = (x + (*(tint_private_vars)).v47);
+  x = (x + (*(tint_private_vars)).v48);
+  x = (x + (*(tint_private_vars)).v49);
+  x = (x + (*(tint_private_vars)).v50);
+  x = (x + (*(tint_private_vars)).v51);
+  x = (x + (*(tint_private_vars)).v52);
+  x = (x + (*(tint_private_vars)).v53);
+  x = (x + (*(tint_private_vars)).v54);
+  x = (x + (*(tint_private_vars)).v55);
+  x = (x + (*(tint_private_vars)).v56);
+  x = (x + (*(tint_private_vars)).v57);
+  x = (x + (*(tint_private_vars)).v58);
+  x = (x + (*(tint_private_vars)).v59);
+  x = (x + (*(tint_private_vars)).v60);
+  x = (x + (*(tint_private_vars)).v61);
+  x = (x + (*(tint_private_vars)).v62);
+  x = (x + (*(tint_private_vars)).v63);
+  x = (x + (*(tint_private_vars)).v64);
+  x = (x + (*(tint_private_vars)).v65);
+  x = (x + (*(tint_private_vars)).v66);
+  x = (x + (*(tint_private_vars)).v67);
+  x = (x + (*(tint_private_vars)).v68);
+  x = (x + (*(tint_private_vars)).v69);
+  x = (x + (*(tint_private_vars)).v70);
+  x = (x + (*(tint_private_vars)).v71);
+  x = (x + (*(tint_private_vars)).v72);
+  x = (x + (*(tint_private_vars)).v73);
+  x = (x + (*(tint_private_vars)).v74);
+  x = (x + (*(tint_private_vars)).v75);
+  x = (x + (*(tint_private_vars)).v76);
+  x = (x + (*(tint_private_vars)).v77);
+  x = (x + (*(tint_private_vars)).v78);
+  x = (x + (*(tint_private_vars)).v79);
+  x = (x + (*(tint_private_vars)).v80);
+  x = (x + (*(tint_private_vars)).v81);
+  x = (x + (*(tint_private_vars)).v82);
+  x = (x + (*(tint_private_vars)).v83);
+  x = (x + (*(tint_private_vars)).v84);
+  x = (x + (*(tint_private_vars)).v85);
+  x = (x + (*(tint_private_vars)).v86);
+  x = (x + (*(tint_private_vars)).v87);
+  x = (x + (*(tint_private_vars)).v88);
+  x = (x + (*(tint_private_vars)).v89);
+  x = (x + (*(tint_private_vars)).v90);
+  x = (x + (*(tint_private_vars)).v91);
+  x = (x + (*(tint_private_vars)).v92);
+  x = (x + (*(tint_private_vars)).v93);
+  x = (x + (*(tint_private_vars)).v94);
+  x = (x + (*(tint_private_vars)).v95);
+  x = (x + (*(tint_private_vars)).v96);
+  x = (x + (*(tint_private_vars)).v97);
+  x = (x + (*(tint_private_vars)).v98);
+  x = (x + (*(tint_private_vars)).v99);
+  x = (x + (*(tint_private_vars)).v100);
+  x = (x + (*(tint_private_vars)).v101);
+  x = (x + (*(tint_private_vars)).v102);
+  x = (x + (*(tint_private_vars)).v103);
+  x = (x + (*(tint_private_vars)).v104);
+  x = (x + (*(tint_private_vars)).v105);
+  x = (x + (*(tint_private_vars)).v106);
+  x = (x + (*(tint_private_vars)).v107);
+  x = (x + (*(tint_private_vars)).v108);
+  x = (x + (*(tint_private_vars)).v109);
+  x = (x + (*(tint_private_vars)).v110);
+  x = (x + (*(tint_private_vars)).v111);
+  x = (x + (*(tint_private_vars)).v112);
+  x = (x + (*(tint_private_vars)).v113);
+  x = (x + (*(tint_private_vars)).v114);
+  x = (x + (*(tint_private_vars)).v115);
+  x = (x + (*(tint_private_vars)).v116);
+  x = (x + (*(tint_private_vars)).v117);
+  x = (x + (*(tint_private_vars)).v118);
+  x = (x + (*(tint_private_vars)).v119);
+  x = (x + (*(tint_private_vars)).v120);
+  x = (x + (*(tint_private_vars)).v121);
+  x = (x + (*(tint_private_vars)).v122);
+  x = (x + (*(tint_private_vars)).v123);
+  x = (x + (*(tint_private_vars)).v124);
+  x = (x + (*(tint_private_vars)).v125);
+  x = (x + (*(tint_private_vars)).v126);
+  x = (x + (*(tint_private_vars)).v127);
+  x = (x + (*(tint_private_vars)).v128);
+  x = (x + (*(tint_private_vars)).v129);
+  x = (x + (*(tint_private_vars)).v130);
+  x = (x + (*(tint_private_vars)).v131);
+  x = (x + (*(tint_private_vars)).v132);
+  x = (x + (*(tint_private_vars)).v133);
+  x = (x + (*(tint_private_vars)).v134);
+  x = (x + (*(tint_private_vars)).v135);
+  x = (x + (*(tint_private_vars)).v136);
+  x = (x + (*(tint_private_vars)).v137);
+  x = (x + (*(tint_private_vars)).v138);
+  x = (x + (*(tint_private_vars)).v139);
+  x = (x + (*(tint_private_vars)).v140);
+  x = (x + (*(tint_private_vars)).v141);
+  x = (x + (*(tint_private_vars)).v142);
+  x = (x + (*(tint_private_vars)).v143);
+  x = (x + (*(tint_private_vars)).v144);
+  x = (x + (*(tint_private_vars)).v145);
+  x = (x + (*(tint_private_vars)).v146);
+  x = (x + (*(tint_private_vars)).v147);
+  x = (x + (*(tint_private_vars)).v148);
+  x = (x + (*(tint_private_vars)).v149);
+  x = (x + (*(tint_private_vars)).v150);
+  x = (x + (*(tint_private_vars)).v151);
+  x = (x + (*(tint_private_vars)).v152);
+  x = (x + (*(tint_private_vars)).v153);
+  x = (x + (*(tint_private_vars)).v154);
+  x = (x + (*(tint_private_vars)).v155);
+  x = (x + (*(tint_private_vars)).v156);
+  x = (x + (*(tint_private_vars)).v157);
+  x = (x + (*(tint_private_vars)).v158);
+  x = (x + (*(tint_private_vars)).v159);
+  x = (x + (*(tint_private_vars)).v160);
+  x = (x + (*(tint_private_vars)).v161);
+  x = (x + (*(tint_private_vars)).v162);
+  x = (x + (*(tint_private_vars)).v163);
+  x = (x + (*(tint_private_vars)).v164);
+  x = (x + (*(tint_private_vars)).v165);
+  x = (x + (*(tint_private_vars)).v166);
+  x = (x + (*(tint_private_vars)).v167);
+  x = (x + (*(tint_private_vars)).v168);
+  x = (x + (*(tint_private_vars)).v169);
+  x = (x + (*(tint_private_vars)).v170);
+  x = (x + (*(tint_private_vars)).v171);
+  x = (x + (*(tint_private_vars)).v172);
+  x = (x + (*(tint_private_vars)).v173);
+  x = (x + (*(tint_private_vars)).v174);
+  x = (x + (*(tint_private_vars)).v175);
+  x = (x + (*(tint_private_vars)).v176);
+  x = (x + (*(tint_private_vars)).v177);
+  x = (x + (*(tint_private_vars)).v178);
+  x = (x + (*(tint_private_vars)).v179);
+  x = (x + (*(tint_private_vars)).v180);
+  x = (x + (*(tint_private_vars)).v181);
+  x = (x + (*(tint_private_vars)).v182);
+  x = (x + (*(tint_private_vars)).v183);
+  x = (x + (*(tint_private_vars)).v184);
+  x = (x + (*(tint_private_vars)).v185);
+  x = (x + (*(tint_private_vars)).v186);
+  x = (x + (*(tint_private_vars)).v187);
+  x = (x + (*(tint_private_vars)).v188);
+  x = (x + (*(tint_private_vars)).v189);
+  x = (x + (*(tint_private_vars)).v190);
+  x = (x + (*(tint_private_vars)).v191);
+  x = (x + (*(tint_private_vars)).v192);
+  x = (x + (*(tint_private_vars)).v193);
+  x = (x + (*(tint_private_vars)).v194);
+  x = (x + (*(tint_private_vars)).v195);
+  x = (x + (*(tint_private_vars)).v196);
+  x = (x + (*(tint_private_vars)).v197);
+  x = (x + (*(tint_private_vars)).v198);
+  x = (x + (*(tint_private_vars)).v199);
+  x = (x + (*(tint_private_vars)).v200);
+  x = (x + (*(tint_private_vars)).v201);
+  x = (x + (*(tint_private_vars)).v202);
+  x = (x + (*(tint_private_vars)).v203);
+  x = (x + (*(tint_private_vars)).v204);
+  x = (x + (*(tint_private_vars)).v205);
+  x = (x + (*(tint_private_vars)).v206);
+  x = (x + (*(tint_private_vars)).v207);
+  x = (x + (*(tint_private_vars)).v208);
+  x = (x + (*(tint_private_vars)).v209);
+  x = (x + (*(tint_private_vars)).v210);
+  x = (x + (*(tint_private_vars)).v211);
+  x = (x + (*(tint_private_vars)).v212);
+  x = (x + (*(tint_private_vars)).v213);
+  x = (x + (*(tint_private_vars)).v214);
+  x = (x + (*(tint_private_vars)).v215);
+  x = (x + (*(tint_private_vars)).v216);
+  x = (x + (*(tint_private_vars)).v217);
+  x = (x + (*(tint_private_vars)).v218);
+  x = (x + (*(tint_private_vars)).v219);
+  x = (x + (*(tint_private_vars)).v220);
+  x = (x + (*(tint_private_vars)).v221);
+  x = (x + (*(tint_private_vars)).v222);
+  x = (x + (*(tint_private_vars)).v223);
+  x = (x + (*(tint_private_vars)).v224);
+  x = (x + (*(tint_private_vars)).v225);
+  x = (x + (*(tint_private_vars)).v226);
+  x = (x + (*(tint_private_vars)).v227);
+  x = (x + (*(tint_private_vars)).v228);
+  x = (x + (*(tint_private_vars)).v229);
+  x = (x + (*(tint_private_vars)).v230);
+  x = (x + (*(tint_private_vars)).v231);
+  x = (x + (*(tint_private_vars)).v232);
+  x = (x + (*(tint_private_vars)).v233);
+  x = (x + (*(tint_private_vars)).v234);
+  x = (x + (*(tint_private_vars)).v235);
+  x = (x + (*(tint_private_vars)).v236);
+  x = (x + (*(tint_private_vars)).v237);
+  x = (x + (*(tint_private_vars)).v238);
+  x = (x + (*(tint_private_vars)).v239);
+  x = (x + (*(tint_private_vars)).v240);
+  x = (x + (*(tint_private_vars)).v241);
+  x = (x + (*(tint_private_vars)).v242);
+  x = (x + (*(tint_private_vars)).v243);
+  x = (x + (*(tint_private_vars)).v244);
+  x = (x + (*(tint_private_vars)).v245);
+  x = (x + (*(tint_private_vars)).v246);
+  x = (x + (*(tint_private_vars)).v247);
+  x = (x + (*(tint_private_vars)).v248);
+  x = (x + (*(tint_private_vars)).v249);
+  x = (x + (*(tint_private_vars)).v250);
+  x = (x + (*(tint_private_vars)).v251);
+  x = (x + (*(tint_private_vars)).v252);
+  x = (x + (*(tint_private_vars)).v253);
+  x = (x + (*(tint_private_vars)).v254);
+  x = (x + (*(tint_private_vars)).v255);
+  x = (x + (*(tint_private_vars)).v256);
+  x = (x + (*(tint_private_vars)).v257);
+  x = (x + (*(tint_private_vars)).v258);
+  x = (x + (*(tint_private_vars)).v259);
+  x = (x + (*(tint_private_vars)).v260);
+  x = (x + (*(tint_private_vars)).v261);
+  x = (x + (*(tint_private_vars)).v262);
+  x = (x + (*(tint_private_vars)).v263);
+  x = (x + (*(tint_private_vars)).v264);
+  x = (x + (*(tint_private_vars)).v265);
+  x = (x + (*(tint_private_vars)).v266);
+  x = (x + (*(tint_private_vars)).v267);
+  x = (x + (*(tint_private_vars)).v268);
+  x = (x + (*(tint_private_vars)).v269);
+  x = (x + (*(tint_private_vars)).v270);
+  x = (x + (*(tint_private_vars)).v271);
+  x = (x + (*(tint_private_vars)).v272);
+  x = (x + (*(tint_private_vars)).v273);
+  x = (x + (*(tint_private_vars)).v274);
+  x = (x + (*(tint_private_vars)).v275);
+  x = (x + (*(tint_private_vars)).v276);
+  x = (x + (*(tint_private_vars)).v277);
+  x = (x + (*(tint_private_vars)).v278);
+  x = (x + (*(tint_private_vars)).v279);
+  x = (x + (*(tint_private_vars)).v280);
+  x = (x + (*(tint_private_vars)).v281);
+  x = (x + (*(tint_private_vars)).v282);
+  x = (x + (*(tint_private_vars)).v283);
+  x = (x + (*(tint_private_vars)).v284);
+  x = (x + (*(tint_private_vars)).v285);
+  x = (x + (*(tint_private_vars)).v286);
+  x = (x + (*(tint_private_vars)).v287);
+  x = (x + (*(tint_private_vars)).v288);
+  x = (x + (*(tint_private_vars)).v289);
+  x = (x + (*(tint_private_vars)).v290);
+  x = (x + (*(tint_private_vars)).v291);
+  x = (x + (*(tint_private_vars)).v292);
+  x = (x + (*(tint_private_vars)).v293);
+  x = (x + (*(tint_private_vars)).v294);
+  x = (x + (*(tint_private_vars)).v295);
+  x = (x + (*(tint_private_vars)).v296);
+  x = (x + (*(tint_private_vars)).v297);
+  x = (x + (*(tint_private_vars)).v298);
+  x = (x + (*(tint_private_vars)).v299);
+  x = (x + (*(tint_private_vars)).v300);
+  x = (x + (*(tint_private_vars)).v301);
+  x = (x + (*(tint_private_vars)).v302);
+  x = (x + (*(tint_private_vars)).v303);
+  x = (x + (*(tint_private_vars)).v304);
+  x = (x + (*(tint_private_vars)).v305);
+  x = (x + (*(tint_private_vars)).v306);
+  x = (x + (*(tint_private_vars)).v307);
+  x = (x + (*(tint_private_vars)).v308);
+  x = (x + (*(tint_private_vars)).v309);
+  x = (x + (*(tint_private_vars)).v310);
+  x = (x + (*(tint_private_vars)).v311);
+  x = (x + (*(tint_private_vars)).v312);
+  x = (x + (*(tint_private_vars)).v313);
+  x = (x + (*(tint_private_vars)).v314);
+  x = (x + (*(tint_private_vars)).v315);
+  x = (x + (*(tint_private_vars)).v316);
+  x = (x + (*(tint_private_vars)).v317);
+  x = (x + (*(tint_private_vars)).v318);
+  x = (x + (*(tint_private_vars)).v319);
+  x = (x + (*(tint_private_vars)).v320);
+  x = (x + (*(tint_private_vars)).v321);
+  x = (x + (*(tint_private_vars)).v322);
+  x = (x + (*(tint_private_vars)).v323);
+  x = (x + (*(tint_private_vars)).v324);
+  x = (x + (*(tint_private_vars)).v325);
+  x = (x + (*(tint_private_vars)).v326);
+  x = (x + (*(tint_private_vars)).v327);
+  x = (x + (*(tint_private_vars)).v328);
+  x = (x + (*(tint_private_vars)).v329);
+  x = (x + (*(tint_private_vars)).v330);
+  x = (x + (*(tint_private_vars)).v331);
+  x = (x + (*(tint_private_vars)).v332);
+  x = (x + (*(tint_private_vars)).v333);
+  x = (x + (*(tint_private_vars)).v334);
+  x = (x + (*(tint_private_vars)).v335);
+  x = (x + (*(tint_private_vars)).v336);
+  x = (x + (*(tint_private_vars)).v337);
+  x = (x + (*(tint_private_vars)).v338);
+  x = (x + (*(tint_private_vars)).v339);
+  x = (x + (*(tint_private_vars)).v340);
+  x = (x + (*(tint_private_vars)).v341);
+  x = (x + (*(tint_private_vars)).v342);
+  x = (x + (*(tint_private_vars)).v343);
+  x = (x + (*(tint_private_vars)).v344);
+  x = (x + (*(tint_private_vars)).v345);
+  x = (x + (*(tint_private_vars)).v346);
+  x = (x + (*(tint_private_vars)).v347);
+  x = (x + (*(tint_private_vars)).v348);
+  x = (x + (*(tint_private_vars)).v349);
+  x = (x + (*(tint_private_vars)).v350);
+  x = (x + (*(tint_private_vars)).v351);
+  x = (x + (*(tint_private_vars)).v352);
+  x = (x + (*(tint_private_vars)).v353);
+  x = (x + (*(tint_private_vars)).v354);
+  x = (x + (*(tint_private_vars)).v355);
+  x = (x + (*(tint_private_vars)).v356);
+  x = (x + (*(tint_private_vars)).v357);
+  x = (x + (*(tint_private_vars)).v358);
+  x = (x + (*(tint_private_vars)).v359);
+  x = (x + (*(tint_private_vars)).v360);
+  x = (x + (*(tint_private_vars)).v361);
+  x = (x + (*(tint_private_vars)).v362);
+  x = (x + (*(tint_private_vars)).v363);
+  x = (x + (*(tint_private_vars)).v364);
+  x = (x + (*(tint_private_vars)).v365);
+  x = (x + (*(tint_private_vars)).v366);
+  x = (x + (*(tint_private_vars)).v367);
+  x = (x + (*(tint_private_vars)).v368);
+  x = (x + (*(tint_private_vars)).v369);
+  x = (x + (*(tint_private_vars)).v370);
+  x = (x + (*(tint_private_vars)).v371);
+  x = (x + (*(tint_private_vars)).v372);
+  x = (x + (*(tint_private_vars)).v373);
+  x = (x + (*(tint_private_vars)).v374);
+  x = (x + (*(tint_private_vars)).v375);
+  x = (x + (*(tint_private_vars)).v376);
+  x = (x + (*(tint_private_vars)).v377);
+  x = (x + (*(tint_private_vars)).v378);
+  x = (x + (*(tint_private_vars)).v379);
+  x = (x + (*(tint_private_vars)).v380);
+  x = (x + (*(tint_private_vars)).v381);
+  x = (x + (*(tint_private_vars)).v382);
+  x = (x + (*(tint_private_vars)).v383);
+  x = (x + (*(tint_private_vars)).v384);
+  x = (x + (*(tint_private_vars)).v385);
+  x = (x + (*(tint_private_vars)).v386);
+  x = (x + (*(tint_private_vars)).v387);
+  x = (x + (*(tint_private_vars)).v388);
+  x = (x + (*(tint_private_vars)).v389);
+  x = (x + (*(tint_private_vars)).v390);
+  x = (x + (*(tint_private_vars)).v391);
+  x = (x + (*(tint_private_vars)).v392);
+  x = (x + (*(tint_private_vars)).v393);
+  x = (x + (*(tint_private_vars)).v394);
+  x = (x + (*(tint_private_vars)).v395);
+  x = (x + (*(tint_private_vars)).v396);
+  x = (x + (*(tint_private_vars)).v397);
+  x = (x + (*(tint_private_vars)).v398);
+  x = (x + (*(tint_private_vars)).v399);
+  x = (x + (*(tint_private_vars)).v400);
+  x = (x + (*(tint_private_vars)).v401);
+  x = (x + (*(tint_private_vars)).v402);
+  x = (x + (*(tint_private_vars)).v403);
+  x = (x + (*(tint_private_vars)).v404);
+  x = (x + (*(tint_private_vars)).v405);
+  x = (x + (*(tint_private_vars)).v406);
+  x = (x + (*(tint_private_vars)).v407);
+  x = (x + (*(tint_private_vars)).v408);
+  x = (x + (*(tint_private_vars)).v409);
+  x = (x + (*(tint_private_vars)).v410);
+  x = (x + (*(tint_private_vars)).v411);
+  x = (x + (*(tint_private_vars)).v412);
+  x = (x + (*(tint_private_vars)).v413);
+  x = (x + (*(tint_private_vars)).v414);
+  x = (x + (*(tint_private_vars)).v415);
+  x = (x + (*(tint_private_vars)).v416);
+  x = (x + (*(tint_private_vars)).v417);
+  x = (x + (*(tint_private_vars)).v418);
+  x = (x + (*(tint_private_vars)).v419);
+  x = (x + (*(tint_private_vars)).v420);
+  x = (x + (*(tint_private_vars)).v421);
+  x = (x + (*(tint_private_vars)).v422);
+  x = (x + (*(tint_private_vars)).v423);
+  x = (x + (*(tint_private_vars)).v424);
+  x = (x + (*(tint_private_vars)).v425);
+  x = (x + (*(tint_private_vars)).v426);
+  x = (x + (*(tint_private_vars)).v427);
+  x = (x + (*(tint_private_vars)).v428);
+  x = (x + (*(tint_private_vars)).v429);
+  x = (x + (*(tint_private_vars)).v430);
+  x = (x + (*(tint_private_vars)).v431);
+  x = (x + (*(tint_private_vars)).v432);
+  x = (x + (*(tint_private_vars)).v433);
+  x = (x + (*(tint_private_vars)).v434);
+  x = (x + (*(tint_private_vars)).v435);
+  x = (x + (*(tint_private_vars)).v436);
+  x = (x + (*(tint_private_vars)).v437);
+  x = (x + (*(tint_private_vars)).v438);
+  x = (x + (*(tint_private_vars)).v439);
+  x = (x + (*(tint_private_vars)).v440);
+  x = (x + (*(tint_private_vars)).v441);
+  x = (x + (*(tint_private_vars)).v442);
+  x = (x + (*(tint_private_vars)).v443);
+  x = (x + (*(tint_private_vars)).v444);
+  x = (x + (*(tint_private_vars)).v445);
+  x = (x + (*(tint_private_vars)).v446);
+  x = (x + (*(tint_private_vars)).v447);
+  x = (x + (*(tint_private_vars)).v448);
+  x = (x + (*(tint_private_vars)).v449);
+  x = (x + (*(tint_private_vars)).v450);
+  x = (x + (*(tint_private_vars)).v451);
+  x = (x + (*(tint_private_vars)).v452);
+  x = (x + (*(tint_private_vars)).v453);
+  x = (x + (*(tint_private_vars)).v454);
+  x = (x + (*(tint_private_vars)).v455);
+  x = (x + (*(tint_private_vars)).v456);
+  x = (x + (*(tint_private_vars)).v457);
+  x = (x + (*(tint_private_vars)).v458);
+  x = (x + (*(tint_private_vars)).v459);
+  x = (x + (*(tint_private_vars)).v460);
+  x = (x + (*(tint_private_vars)).v461);
+  x = (x + (*(tint_private_vars)).v462);
+  x = (x + (*(tint_private_vars)).v463);
+  x = (x + (*(tint_private_vars)).v464);
+  x = (x + (*(tint_private_vars)).v465);
+  x = (x + (*(tint_private_vars)).v466);
+  x = (x + (*(tint_private_vars)).v467);
+  x = (x + (*(tint_private_vars)).v468);
+  x = (x + (*(tint_private_vars)).v469);
+  x = (x + (*(tint_private_vars)).v470);
+  x = (x + (*(tint_private_vars)).v471);
+  x = (x + (*(tint_private_vars)).v472);
+  x = (x + (*(tint_private_vars)).v473);
+  x = (x + (*(tint_private_vars)).v474);
+  x = (x + (*(tint_private_vars)).v475);
+  x = (x + (*(tint_private_vars)).v476);
+  x = (x + (*(tint_private_vars)).v477);
+  x = (x + (*(tint_private_vars)).v478);
+  x = (x + (*(tint_private_vars)).v479);
+  x = (x + (*(tint_private_vars)).v480);
+  x = (x + (*(tint_private_vars)).v481);
+  x = (x + (*(tint_private_vars)).v482);
+  x = (x + (*(tint_private_vars)).v483);
+  x = (x + (*(tint_private_vars)).v484);
+  x = (x + (*(tint_private_vars)).v485);
+  x = (x + (*(tint_private_vars)).v486);
+  x = (x + (*(tint_private_vars)).v487);
+  x = (x + (*(tint_private_vars)).v488);
+  x = (x + (*(tint_private_vars)).v489);
+  x = (x + (*(tint_private_vars)).v490);
+  x = (x + (*(tint_private_vars)).v491);
+  x = (x + (*(tint_private_vars)).v492);
+  x = (x + (*(tint_private_vars)).v493);
+  x = (x + (*(tint_private_vars)).v494);
+  x = (x + (*(tint_private_vars)).v495);
+  x = (x + (*(tint_private_vars)).v496);
+  x = (x + (*(tint_private_vars)).v497);
+  x = (x + (*(tint_private_vars)).v498);
+  x = (x + (*(tint_private_vars)).v499);
+  x = (x + (*(tint_private_vars)).v500);
+  x = (x + (*(tint_private_vars)).v501);
+  x = (x + (*(tint_private_vars)).v502);
+  x = (x + (*(tint_private_vars)).v503);
+  x = (x + (*(tint_private_vars)).v504);
+  x = (x + (*(tint_private_vars)).v505);
+  x = (x + (*(tint_private_vars)).v506);
+  x = (x + (*(tint_private_vars)).v507);
+  x = (x + (*(tint_private_vars)).v508);
+  x = (x + (*(tint_private_vars)).v509);
+  x = (x + (*(tint_private_vars)).v510);
+  x = (x + (*(tint_private_vars)).v511);
+  x = (x + (*(tint_private_vars)).v512);
+  x = (x + (*(tint_private_vars)).v513);
+  x = (x + (*(tint_private_vars)).v514);
+  x = (x + (*(tint_private_vars)).v515);
+  x = (x + (*(tint_private_vars)).v516);
+  x = (x + (*(tint_private_vars)).v517);
+  x = (x + (*(tint_private_vars)).v518);
+  x = (x + (*(tint_private_vars)).v519);
+  x = (x + (*(tint_private_vars)).v520);
+  x = (x + (*(tint_private_vars)).v521);
+  x = (x + (*(tint_private_vars)).v522);
+  x = (x + (*(tint_private_vars)).v523);
+  x = (x + (*(tint_private_vars)).v524);
+  x = (x + (*(tint_private_vars)).v525);
+  x = (x + (*(tint_private_vars)).v526);
+  x = (x + (*(tint_private_vars)).v527);
+  x = (x + (*(tint_private_vars)).v528);
+  x = (x + (*(tint_private_vars)).v529);
+  x = (x + (*(tint_private_vars)).v530);
+  x = (x + (*(tint_private_vars)).v531);
+  x = (x + (*(tint_private_vars)).v532);
+  x = (x + (*(tint_private_vars)).v533);
+  x = (x + (*(tint_private_vars)).v534);
+  x = (x + (*(tint_private_vars)).v535);
+  x = (x + (*(tint_private_vars)).v536);
+  x = (x + (*(tint_private_vars)).v537);
+  x = (x + (*(tint_private_vars)).v538);
+  x = (x + (*(tint_private_vars)).v539);
+  x = (x + (*(tint_private_vars)).v540);
+  x = (x + (*(tint_private_vars)).v541);
+  x = (x + (*(tint_private_vars)).v542);
+  x = (x + (*(tint_private_vars)).v543);
+  x = (x + (*(tint_private_vars)).v544);
+  x = (x + (*(tint_private_vars)).v545);
+  x = (x + (*(tint_private_vars)).v546);
+  x = (x + (*(tint_private_vars)).v547);
+  x = (x + (*(tint_private_vars)).v548);
+  x = (x + (*(tint_private_vars)).v549);
+  x = (x + (*(tint_private_vars)).v550);
+  x = (x + (*(tint_private_vars)).v551);
+  x = (x + (*(tint_private_vars)).v552);
+  x = (x + (*(tint_private_vars)).v553);
+  x = (x + (*(tint_private_vars)).v554);
+  x = (x + (*(tint_private_vars)).v555);
+  x = (x + (*(tint_private_vars)).v556);
+  x = (x + (*(tint_private_vars)).v557);
+  x = (x + (*(tint_private_vars)).v558);
+  x = (x + (*(tint_private_vars)).v559);
+  x = (x + (*(tint_private_vars)).v560);
+  x = (x + (*(tint_private_vars)).v561);
+  x = (x + (*(tint_private_vars)).v562);
+  x = (x + (*(tint_private_vars)).v563);
+  x = (x + (*(tint_private_vars)).v564);
+  x = (x + (*(tint_private_vars)).v565);
+  x = (x + (*(tint_private_vars)).v566);
+  x = (x + (*(tint_private_vars)).v567);
+  x = (x + (*(tint_private_vars)).v568);
+  x = (x + (*(tint_private_vars)).v569);
+  x = (x + (*(tint_private_vars)).v570);
+  x = (x + (*(tint_private_vars)).v571);
+  x = (x + (*(tint_private_vars)).v572);
+  x = (x + (*(tint_private_vars)).v573);
+  x = (x + (*(tint_private_vars)).v574);
+  x = (x + (*(tint_private_vars)).v575);
+  x = (x + (*(tint_private_vars)).v576);
+  x = (x + (*(tint_private_vars)).v577);
+  x = (x + (*(tint_private_vars)).v578);
+  x = (x + (*(tint_private_vars)).v579);
+  x = (x + (*(tint_private_vars)).v580);
+  x = (x + (*(tint_private_vars)).v581);
+  x = (x + (*(tint_private_vars)).v582);
+  x = (x + (*(tint_private_vars)).v583);
+  x = (x + (*(tint_private_vars)).v584);
+  x = (x + (*(tint_private_vars)).v585);
+  x = (x + (*(tint_private_vars)).v586);
+  x = (x + (*(tint_private_vars)).v587);
+  x = (x + (*(tint_private_vars)).v588);
+  x = (x + (*(tint_private_vars)).v589);
+  x = (x + (*(tint_private_vars)).v590);
+  x = (x + (*(tint_private_vars)).v591);
+  x = (x + (*(tint_private_vars)).v592);
+  x = (x + (*(tint_private_vars)).v593);
+  x = (x + (*(tint_private_vars)).v594);
+  x = (x + (*(tint_private_vars)).v595);
+  x = (x + (*(tint_private_vars)).v596);
+  x = (x + (*(tint_private_vars)).v597);
+  x = (x + (*(tint_private_vars)).v598);
+  x = (x + (*(tint_private_vars)).v599);
+  x = (x + (*(tint_private_vars)).v600);
+  x = (x + (*(tint_private_vars)).v601);
+  x = (x + (*(tint_private_vars)).v602);
+  x = (x + (*(tint_private_vars)).v603);
+  x = (x + (*(tint_private_vars)).v604);
+  x = (x + (*(tint_private_vars)).v605);
+  x = (x + (*(tint_private_vars)).v606);
+  x = (x + (*(tint_private_vars)).v607);
+  x = (x + (*(tint_private_vars)).v608);
+  x = (x + (*(tint_private_vars)).v609);
+  x = (x + (*(tint_private_vars)).v610);
+  x = (x + (*(tint_private_vars)).v611);
+  x = (x + (*(tint_private_vars)).v612);
+  x = (x + (*(tint_private_vars)).v613);
+  x = (x + (*(tint_private_vars)).v614);
+  x = (x + (*(tint_private_vars)).v615);
+  x = (x + (*(tint_private_vars)).v616);
+  x = (x + (*(tint_private_vars)).v617);
+  x = (x + (*(tint_private_vars)).v618);
+  x = (x + (*(tint_private_vars)).v619);
+  x = (x + (*(tint_private_vars)).v620);
+  x = (x + (*(tint_private_vars)).v621);
+  x = (x + (*(tint_private_vars)).v622);
+  x = (x + (*(tint_private_vars)).v623);
+  x = (x + (*(tint_private_vars)).v624);
+  x = (x + (*(tint_private_vars)).v625);
+  x = (x + (*(tint_private_vars)).v626);
+  x = (x + (*(tint_private_vars)).v627);
+  x = (x + (*(tint_private_vars)).v628);
+  x = (x + (*(tint_private_vars)).v629);
+  x = (x + (*(tint_private_vars)).v630);
+  x = (x + (*(tint_private_vars)).v631);
+  x = (x + (*(tint_private_vars)).v632);
+  x = (x + (*(tint_private_vars)).v633);
+  x = (x + (*(tint_private_vars)).v634);
+  x = (x + (*(tint_private_vars)).v635);
+  x = (x + (*(tint_private_vars)).v636);
+  x = (x + (*(tint_private_vars)).v637);
+  x = (x + (*(tint_private_vars)).v638);
+  x = (x + (*(tint_private_vars)).v639);
+  x = (x + (*(tint_private_vars)).v640);
+  x = (x + (*(tint_private_vars)).v641);
+  x = (x + (*(tint_private_vars)).v642);
+  x = (x + (*(tint_private_vars)).v643);
+  x = (x + (*(tint_private_vars)).v644);
+  x = (x + (*(tint_private_vars)).v645);
+  x = (x + (*(tint_private_vars)).v646);
+  x = (x + (*(tint_private_vars)).v647);
+  x = (x + (*(tint_private_vars)).v648);
+  x = (x + (*(tint_private_vars)).v649);
+  x = (x + (*(tint_private_vars)).v650);
+  x = (x + (*(tint_private_vars)).v651);
+  x = (x + (*(tint_private_vars)).v652);
+  x = (x + (*(tint_private_vars)).v653);
+  x = (x + (*(tint_private_vars)).v654);
+  x = (x + (*(tint_private_vars)).v655);
+  x = (x + (*(tint_private_vars)).v656);
+  x = (x + (*(tint_private_vars)).v657);
+  x = (x + (*(tint_private_vars)).v658);
+  x = (x + (*(tint_private_vars)).v659);
+  x = (x + (*(tint_private_vars)).v660);
+  x = (x + (*(tint_private_vars)).v661);
+  x = (x + (*(tint_private_vars)).v662);
+  x = (x + (*(tint_private_vars)).v663);
+  x = (x + (*(tint_private_vars)).v664);
+  x = (x + (*(tint_private_vars)).v665);
+  x = (x + (*(tint_private_vars)).v666);
+  x = (x + (*(tint_private_vars)).v667);
+  x = (x + (*(tint_private_vars)).v668);
+  x = (x + (*(tint_private_vars)).v669);
+  x = (x + (*(tint_private_vars)).v670);
+  x = (x + (*(tint_private_vars)).v671);
+  x = (x + (*(tint_private_vars)).v672);
+  x = (x + (*(tint_private_vars)).v673);
+  x = (x + (*(tint_private_vars)).v674);
+  x = (x + (*(tint_private_vars)).v675);
+  x = (x + (*(tint_private_vars)).v676);
+  x = (x + (*(tint_private_vars)).v677);
+  x = (x + (*(tint_private_vars)).v678);
+  x = (x + (*(tint_private_vars)).v679);
+  x = (x + (*(tint_private_vars)).v680);
+  x = (x + (*(tint_private_vars)).v681);
+  x = (x + (*(tint_private_vars)).v682);
+  x = (x + (*(tint_private_vars)).v683);
+  x = (x + (*(tint_private_vars)).v684);
+  x = (x + (*(tint_private_vars)).v685);
+  x = (x + (*(tint_private_vars)).v686);
+  x = (x + (*(tint_private_vars)).v687);
+  x = (x + (*(tint_private_vars)).v688);
+  x = (x + (*(tint_private_vars)).v689);
+  x = (x + (*(tint_private_vars)).v690);
+  x = (x + (*(tint_private_vars)).v691);
+  x = (x + (*(tint_private_vars)).v692);
+  x = (x + (*(tint_private_vars)).v693);
+  x = (x + (*(tint_private_vars)).v694);
+  x = (x + (*(tint_private_vars)).v695);
+  x = (x + (*(tint_private_vars)).v696);
+  x = (x + (*(tint_private_vars)).v697);
+  x = (x + (*(tint_private_vars)).v698);
+  x = (x + (*(tint_private_vars)).v699);
+  x = (x + (*(tint_private_vars)).v700);
+  x = (x + (*(tint_private_vars)).v701);
+  x = (x + (*(tint_private_vars)).v702);
+  x = (x + (*(tint_private_vars)).v703);
+  x = (x + (*(tint_private_vars)).v704);
+  x = (x + (*(tint_private_vars)).v705);
+  x = (x + (*(tint_private_vars)).v706);
+  x = (x + (*(tint_private_vars)).v707);
+  x = (x + (*(tint_private_vars)).v708);
+  x = (x + (*(tint_private_vars)).v709);
+  x = (x + (*(tint_private_vars)).v710);
+  x = (x + (*(tint_private_vars)).v711);
+  x = (x + (*(tint_private_vars)).v712);
+  x = (x + (*(tint_private_vars)).v713);
+  x = (x + (*(tint_private_vars)).v714);
+  x = (x + (*(tint_private_vars)).v715);
+  x = (x + (*(tint_private_vars)).v716);
+  x = (x + (*(tint_private_vars)).v717);
+  x = (x + (*(tint_private_vars)).v718);
+  x = (x + (*(tint_private_vars)).v719);
+  x = (x + (*(tint_private_vars)).v720);
+  x = (x + (*(tint_private_vars)).v721);
+  x = (x + (*(tint_private_vars)).v722);
+  x = (x + (*(tint_private_vars)).v723);
+  x = (x + (*(tint_private_vars)).v724);
+  x = (x + (*(tint_private_vars)).v725);
+  x = (x + (*(tint_private_vars)).v726);
+  x = (x + (*(tint_private_vars)).v727);
+  x = (x + (*(tint_private_vars)).v728);
+  x = (x + (*(tint_private_vars)).v729);
+  x = (x + (*(tint_private_vars)).v730);
+  x = (x + (*(tint_private_vars)).v731);
+  x = (x + (*(tint_private_vars)).v732);
+  x = (x + (*(tint_private_vars)).v733);
+  x = (x + (*(tint_private_vars)).v734);
+  x = (x + (*(tint_private_vars)).v735);
+  x = (x + (*(tint_private_vars)).v736);
+  x = (x + (*(tint_private_vars)).v737);
+  x = (x + (*(tint_private_vars)).v738);
+  x = (x + (*(tint_private_vars)).v739);
+  x = (x + (*(tint_private_vars)).v740);
+  x = (x + (*(tint_private_vars)).v741);
+  x = (x + (*(tint_private_vars)).v742);
+  x = (x + (*(tint_private_vars)).v743);
+  x = (x + (*(tint_private_vars)).v744);
+  x = (x + (*(tint_private_vars)).v745);
+  x = (x + (*(tint_private_vars)).v746);
+  x = (x + (*(tint_private_vars)).v747);
+  x = (x + (*(tint_private_vars)).v748);
+  x = (x + (*(tint_private_vars)).v749);
+  x = (x + (*(tint_private_vars)).v750);
+  x = (x + (*(tint_private_vars)).v751);
+  x = (x + (*(tint_private_vars)).v752);
+  x = (x + (*(tint_private_vars)).v753);
+  x = (x + (*(tint_private_vars)).v754);
+  x = (x + (*(tint_private_vars)).v755);
+  x = (x + (*(tint_private_vars)).v756);
+  x = (x + (*(tint_private_vars)).v757);
+  x = (x + (*(tint_private_vars)).v758);
+  x = (x + (*(tint_private_vars)).v759);
+  x = (x + (*(tint_private_vars)).v760);
+  x = (x + (*(tint_private_vars)).v761);
+  x = (x + (*(tint_private_vars)).v762);
+  x = (x + (*(tint_private_vars)).v763);
+  x = (x + (*(tint_private_vars)).v764);
+  x = (x + (*(tint_private_vars)).v765);
+  x = (x + (*(tint_private_vars)).v766);
+  x = (x + (*(tint_private_vars)).v767);
+  x = (x + (*(tint_private_vars)).v768);
+  x = (x + (*(tint_private_vars)).v769);
+  x = (x + (*(tint_private_vars)).v770);
+  x = (x + (*(tint_private_vars)).v771);
+  x = (x + (*(tint_private_vars)).v772);
+  x = (x + (*(tint_private_vars)).v773);
+  x = (x + (*(tint_private_vars)).v774);
+  x = (x + (*(tint_private_vars)).v775);
+  x = (x + (*(tint_private_vars)).v776);
+  x = (x + (*(tint_private_vars)).v777);
+  x = (x + (*(tint_private_vars)).v778);
+  x = (x + (*(tint_private_vars)).v779);
+  x = (x + (*(tint_private_vars)).v780);
+  x = (x + (*(tint_private_vars)).v781);
+  x = (x + (*(tint_private_vars)).v782);
+  x = (x + (*(tint_private_vars)).v783);
+  x = (x + (*(tint_private_vars)).v784);
+  x = (x + (*(tint_private_vars)).v785);
+  x = (x + (*(tint_private_vars)).v786);
+  x = (x + (*(tint_private_vars)).v787);
+  x = (x + (*(tint_private_vars)).v788);
+  x = (x + (*(tint_private_vars)).v789);
+  x = (x + (*(tint_private_vars)).v790);
+  x = (x + (*(tint_private_vars)).v791);
+  x = (x + (*(tint_private_vars)).v792);
+  x = (x + (*(tint_private_vars)).v793);
+  x = (x + (*(tint_private_vars)).v794);
+  x = (x + (*(tint_private_vars)).v795);
+  x = (x + (*(tint_private_vars)).v796);
+  x = (x + (*(tint_private_vars)).v797);
+  x = (x + (*(tint_private_vars)).v798);
+  x = (x + (*(tint_private_vars)).v799);
+  x = (x + (*(tint_private_vars)).v800);
+  x = (x + (*(tint_private_vars)).v801);
+  x = (x + (*(tint_private_vars)).v802);
+  x = (x + (*(tint_private_vars)).v803);
+  x = (x + (*(tint_private_vars)).v804);
+  x = (x + (*(tint_private_vars)).v805);
+  x = (x + (*(tint_private_vars)).v806);
+  x = (x + (*(tint_private_vars)).v807);
+  x = (x + (*(tint_private_vars)).v808);
+  x = (x + (*(tint_private_vars)).v809);
+  x = (x + (*(tint_private_vars)).v810);
+  x = (x + (*(tint_private_vars)).v811);
+  x = (x + (*(tint_private_vars)).v812);
+  x = (x + (*(tint_private_vars)).v813);
+  x = (x + (*(tint_private_vars)).v814);
+  x = (x + (*(tint_private_vars)).v815);
+  x = (x + (*(tint_private_vars)).v816);
+  x = (x + (*(tint_private_vars)).v817);
+  x = (x + (*(tint_private_vars)).v818);
+  x = (x + (*(tint_private_vars)).v819);
+  x = (x + (*(tint_private_vars)).v820);
+  x = (x + (*(tint_private_vars)).v821);
+  x = (x + (*(tint_private_vars)).v822);
+  x = (x + (*(tint_private_vars)).v823);
+  x = (x + (*(tint_private_vars)).v824);
+  x = (x + (*(tint_private_vars)).v825);
+  x = (x + (*(tint_private_vars)).v826);
+  x = (x + (*(tint_private_vars)).v827);
+  x = (x + (*(tint_private_vars)).v828);
+  x = (x + (*(tint_private_vars)).v829);
+  x = (x + (*(tint_private_vars)).v830);
+  x = (x + (*(tint_private_vars)).v831);
+  x = (x + (*(tint_private_vars)).v832);
+  x = (x + (*(tint_private_vars)).v833);
+  x = (x + (*(tint_private_vars)).v834);
+  x = (x + (*(tint_private_vars)).v835);
+  x = (x + (*(tint_private_vars)).v836);
+  x = (x + (*(tint_private_vars)).v837);
+  x = (x + (*(tint_private_vars)).v838);
+  x = (x + (*(tint_private_vars)).v839);
+  x = (x + (*(tint_private_vars)).v840);
+  x = (x + (*(tint_private_vars)).v841);
+  x = (x + (*(tint_private_vars)).v842);
+  x = (x + (*(tint_private_vars)).v843);
+  x = (x + (*(tint_private_vars)).v844);
+  x = (x + (*(tint_private_vars)).v845);
+  x = (x + (*(tint_private_vars)).v846);
+  x = (x + (*(tint_private_vars)).v847);
+  x = (x + (*(tint_private_vars)).v848);
+  x = (x + (*(tint_private_vars)).v849);
+  x = (x + (*(tint_private_vars)).v850);
+  x = (x + (*(tint_private_vars)).v851);
+  x = (x + (*(tint_private_vars)).v852);
+  x = (x + (*(tint_private_vars)).v853);
+  x = (x + (*(tint_private_vars)).v854);
+  x = (x + (*(tint_private_vars)).v855);
+  x = (x + (*(tint_private_vars)).v856);
+  x = (x + (*(tint_private_vars)).v857);
+  x = (x + (*(tint_private_vars)).v858);
+  x = (x + (*(tint_private_vars)).v859);
+  x = (x + (*(tint_private_vars)).v860);
+  x = (x + (*(tint_private_vars)).v861);
+  x = (x + (*(tint_private_vars)).v862);
+  x = (x + (*(tint_private_vars)).v863);
+  x = (x + (*(tint_private_vars)).v864);
+  x = (x + (*(tint_private_vars)).v865);
+  x = (x + (*(tint_private_vars)).v866);
+  x = (x + (*(tint_private_vars)).v867);
+  x = (x + (*(tint_private_vars)).v868);
+  x = (x + (*(tint_private_vars)).v869);
+  x = (x + (*(tint_private_vars)).v870);
+  x = (x + (*(tint_private_vars)).v871);
+  x = (x + (*(tint_private_vars)).v872);
+  x = (x + (*(tint_private_vars)).v873);
+  x = (x + (*(tint_private_vars)).v874);
+  x = (x + (*(tint_private_vars)).v875);
+  x = (x + (*(tint_private_vars)).v876);
+  x = (x + (*(tint_private_vars)).v877);
+  x = (x + (*(tint_private_vars)).v878);
+  x = (x + (*(tint_private_vars)).v879);
+  x = (x + (*(tint_private_vars)).v880);
+  x = (x + (*(tint_private_vars)).v881);
+  x = (x + (*(tint_private_vars)).v882);
+  x = (x + (*(tint_private_vars)).v883);
+  x = (x + (*(tint_private_vars)).v884);
+  x = (x + (*(tint_private_vars)).v885);
+  x = (x + (*(tint_private_vars)).v886);
+  x = (x + (*(tint_private_vars)).v887);
+  x = (x + (*(tint_private_vars)).v888);
+  x = (x + (*(tint_private_vars)).v889);
+  x = (x + (*(tint_private_vars)).v890);
+  x = (x + (*(tint_private_vars)).v891);
+  x = (x + (*(tint_private_vars)).v892);
+  x = (x + (*(tint_private_vars)).v893);
+  x = (x + (*(tint_private_vars)).v894);
+  x = (x + (*(tint_private_vars)).v895);
+  x = (x + (*(tint_private_vars)).v896);
+  x = (x + (*(tint_private_vars)).v897);
+  x = (x + (*(tint_private_vars)).v898);
+  x = (x + (*(tint_private_vars)).v899);
+  x = (x + (*(tint_private_vars)).v900);
+  x = (x + (*(tint_private_vars)).v901);
+  x = (x + (*(tint_private_vars)).v902);
+  x = (x + (*(tint_private_vars)).v903);
+  x = (x + (*(tint_private_vars)).v904);
+  x = (x + (*(tint_private_vars)).v905);
+  x = (x + (*(tint_private_vars)).v906);
+  x = (x + (*(tint_private_vars)).v907);
+  x = (x + (*(tint_private_vars)).v908);
+  x = (x + (*(tint_private_vars)).v909);
+  x = (x + (*(tint_private_vars)).v910);
+  x = (x + (*(tint_private_vars)).v911);
+  x = (x + (*(tint_private_vars)).v912);
+  x = (x + (*(tint_private_vars)).v913);
+  x = (x + (*(tint_private_vars)).v914);
+  x = (x + (*(tint_private_vars)).v915);
+  x = (x + (*(tint_private_vars)).v916);
+  x = (x + (*(tint_private_vars)).v917);
+  x = (x + (*(tint_private_vars)).v918);
+  x = (x + (*(tint_private_vars)).v919);
+  x = (x + (*(tint_private_vars)).v920);
+  x = (x + (*(tint_private_vars)).v921);
+  x = (x + (*(tint_private_vars)).v922);
+  x = (x + (*(tint_private_vars)).v923);
+  x = (x + (*(tint_private_vars)).v924);
+  x = (x + (*(tint_private_vars)).v925);
+  x = (x + (*(tint_private_vars)).v926);
+  x = (x + (*(tint_private_vars)).v927);
+  x = (x + (*(tint_private_vars)).v928);
+  x = (x + (*(tint_private_vars)).v929);
+  x = (x + (*(tint_private_vars)).v930);
+  x = (x + (*(tint_private_vars)).v931);
+  x = (x + (*(tint_private_vars)).v932);
+  x = (x + (*(tint_private_vars)).v933);
+  x = (x + (*(tint_private_vars)).v934);
+  x = (x + (*(tint_private_vars)).v935);
+  x = (x + (*(tint_private_vars)).v936);
+  x = (x + (*(tint_private_vars)).v937);
+  x = (x + (*(tint_private_vars)).v938);
+  x = (x + (*(tint_private_vars)).v939);
+  x = (x + (*(tint_private_vars)).v940);
+  x = (x + (*(tint_private_vars)).v941);
+  x = (x + (*(tint_private_vars)).v942);
+  x = (x + (*(tint_private_vars)).v943);
+  x = (x + (*(tint_private_vars)).v944);
+  x = (x + (*(tint_private_vars)).v945);
+  x = (x + (*(tint_private_vars)).v946);
+  x = (x + (*(tint_private_vars)).v947);
+  x = (x + (*(tint_private_vars)).v948);
+  x = (x + (*(tint_private_vars)).v949);
+  x = (x + (*(tint_private_vars)).v950);
+  x = (x + (*(tint_private_vars)).v951);
+  x = (x + (*(tint_private_vars)).v952);
+  x = (x + (*(tint_private_vars)).v953);
+  x = (x + (*(tint_private_vars)).v954);
+  x = (x + (*(tint_private_vars)).v955);
+  x = (x + (*(tint_private_vars)).v956);
+  x = (x + (*(tint_private_vars)).v957);
+  x = (x + (*(tint_private_vars)).v958);
+  x = (x + (*(tint_private_vars)).v959);
+  x = (x + (*(tint_private_vars)).v960);
+  x = (x + (*(tint_private_vars)).v961);
+  x = (x + (*(tint_private_vars)).v962);
+  x = (x + (*(tint_private_vars)).v963);
+  x = (x + (*(tint_private_vars)).v964);
+  x = (x + (*(tint_private_vars)).v965);
+  x = (x + (*(tint_private_vars)).v966);
+  x = (x + (*(tint_private_vars)).v967);
+  x = (x + (*(tint_private_vars)).v968);
+  x = (x + (*(tint_private_vars)).v969);
+  x = (x + (*(tint_private_vars)).v970);
+  x = (x + (*(tint_private_vars)).v971);
+  x = (x + (*(tint_private_vars)).v972);
+  x = (x + (*(tint_private_vars)).v973);
+  x = (x + (*(tint_private_vars)).v974);
+  x = (x + (*(tint_private_vars)).v975);
+  x = (x + (*(tint_private_vars)).v976);
+  x = (x + (*(tint_private_vars)).v977);
+  x = (x + (*(tint_private_vars)).v978);
+  x = (x + (*(tint_private_vars)).v979);
+  x = (x + (*(tint_private_vars)).v980);
+  x = (x + (*(tint_private_vars)).v981);
+  x = (x + (*(tint_private_vars)).v982);
+  x = (x + (*(tint_private_vars)).v983);
+  x = (x + (*(tint_private_vars)).v984);
+  x = (x + (*(tint_private_vars)).v985);
+  x = (x + (*(tint_private_vars)).v986);
+  x = (x + (*(tint_private_vars)).v987);
+  x = (x + (*(tint_private_vars)).v988);
+  x = (x + (*(tint_private_vars)).v989);
+  x = (x + (*(tint_private_vars)).v990);
+  x = (x + (*(tint_private_vars)).v991);
+  x = (x + (*(tint_private_vars)).v992);
+  x = (x + (*(tint_private_vars)).v993);
+  x = (x + (*(tint_private_vars)).v994);
+  x = (x + (*(tint_private_vars)).v995);
+  x = (x + (*(tint_private_vars)).v996);
+  x = (x + (*(tint_private_vars)).v997);
+  x = (x + (*(tint_private_vars)).v998);
+  x = (x + (*(tint_private_vars)).v999);
   return x;
 }
 
@@ -2010,12 +2013,13 @@
   uint value [[color(0)]];
 };
 
-uint tint_symbol_inner() {
-  return foo();
+uint tint_symbol_inner(thread tint_private_vars_struct* const tint_private_vars) {
+  return foo(tint_private_vars);
 }
 
 fragment tint_symbol_1 tint_symbol() {
-  uint const inner_result = tint_symbol_inner();
+  thread tint_private_vars_struct tint_private_vars = {};
+  uint const inner_result = tint_symbol_inner(&(tint_private_vars));
   tint_symbol_1 wrapper_result = {};
   wrapper_result.value = inner_result;
   return wrapper_result;
diff --git a/test/tint/bug/tint/1520.spvasm.expected.msl b/test/tint/bug/tint/1520.spvasm.expected.msl
index d3244ac..3a7ff63 100644
--- a/test/tint/bug/tint/1520.spvasm.expected.msl
+++ b/test/tint/bug/tint/1520.spvasm.expected.msl
@@ -14,6 +14,12 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float4 sk_FragColor;
+  bool sk_Clockwise;
+  float4 vcolor_S0;
+};
+
 struct tint_packed_vec3_f32_array_element {
   /* 0x0000 */ packed_float3 elements;
   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
@@ -96,7 +102,7 @@
   return x_66;
 }
 
-void main_1(thread float4* const tint_symbol_6, const constant UniformBuffer_tint_packed_vec3* const tint_symbol_7, thread float4* const tint_symbol_8) {
+void main_1(thread tint_private_vars_struct* const tint_private_vars, const constant UniformBuffer_tint_packed_vec3* const tint_symbol_6) {
   float4 outputColor_S0 = 0.0f;
   float4 output_S1 = 0.0f;
   float x_8_unknown = 0.0f;
@@ -111,9 +117,9 @@
   bool x_111 = false;
   bool x_114 = false;
   bool x_115 = false;
-  float4 const x_72 = *(tint_symbol_6);
+  float4 const x_72 = (*(tint_private_vars)).vcolor_S0;
   outputColor_S0 = x_72;
-  float const x_77 = (*(tint_symbol_7)).unknownInput_S1_c0;
+  float const x_77 = (*(tint_symbol_6)).unknownInput_S1_c0;
   x_8_unknown = x_77;
   x_9_ok = true;
   x_87 = false;
@@ -154,19 +160,19 @@
   x_9_ok = x_111;
   x_115 = false;
   if (x_111) {
-    x_114 = test_int_S1_c0_b(tint_symbol_7);
+    x_114 = test_int_S1_c0_b(tint_symbol_6);
     x_115 = x_114;
   }
   if (x_115) {
-    float4 const x_122 = (*(tint_symbol_7)).ucolorGreen_S1_c0;
+    float4 const x_122 = (*(tint_symbol_6)).ucolorGreen_S1_c0;
     x_116 = x_122;
   } else {
-    float4 const x_124 = (*(tint_symbol_7)).ucolorRed_S1_c0;
+    float4 const x_124 = (*(tint_symbol_6)).ucolorRed_S1_c0;
     x_116 = x_124;
   }
   float4 const x_125 = x_116;
   output_S1 = x_125;
-  *(tint_symbol_8) = x_125;
+  (*(tint_private_vars)).sk_FragColor = x_125;
   return;
 }
 
@@ -182,19 +188,17 @@
   float4 sk_FragColor_1 [[color(0)]];
 };
 
-main_out tint_symbol_inner(bool sk_Clockwise_param, float4 vcolor_S0_param, thread float4* const tint_symbol_10, const constant UniformBuffer_tint_packed_vec3* const tint_symbol_11, thread float4* const tint_symbol_12) {
-  thread bool tint_symbol_9 = false;
-  tint_symbol_9 = sk_Clockwise_param;
-  *(tint_symbol_10) = vcolor_S0_param;
-  main_1(tint_symbol_10, tint_symbol_11, tint_symbol_12);
-  main_out const tint_symbol_4 = {.sk_FragColor_1=*(tint_symbol_12)};
+main_out tint_symbol_inner(bool sk_Clockwise_param, float4 vcolor_S0_param, thread tint_private_vars_struct* const tint_private_vars, const constant UniformBuffer_tint_packed_vec3* const tint_symbol_7) {
+  (*(tint_private_vars)).sk_Clockwise = sk_Clockwise_param;
+  (*(tint_private_vars)).vcolor_S0 = vcolor_S0_param;
+  main_1(tint_private_vars, tint_symbol_7);
+  main_out const tint_symbol_4 = {.sk_FragColor_1=(*(tint_private_vars)).sk_FragColor};
   return tint_symbol_4;
 }
 
-fragment tint_symbol_3 tint_symbol(const constant UniformBuffer_tint_packed_vec3* tint_symbol_14 [[buffer(0)]], bool sk_Clockwise_param [[front_facing]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread float4 tint_symbol_13 = 0.0f;
-  thread float4 tint_symbol_15 = 0.0f;
-  main_out const inner_result = tint_symbol_inner(sk_Clockwise_param, tint_symbol_1.vcolor_S0_param, &(tint_symbol_13), tint_symbol_14, &(tint_symbol_15));
+fragment tint_symbol_3 tint_symbol(const constant UniformBuffer_tint_packed_vec3* tint_symbol_8 [[buffer(0)]], bool sk_Clockwise_param [[front_facing]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_out const inner_result = tint_symbol_inner(sk_Clockwise_param, tint_symbol_1.vcolor_S0_param, &(tint_private_vars), tint_symbol_8);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.sk_FragColor_1 = inner_result.sk_FragColor_1;
   return wrapper_result;
diff --git a/test/tint/bug/tint/1703.wgsl.expected.msl b/test/tint/bug/tint/1703.wgsl.expected.msl
index c2380c4..a19c983 100644
--- a/test/tint/bug/tint/1703.wgsl.expected.msl
+++ b/test/tint/bug/tint/1703.wgsl.expected.msl
@@ -1,23 +1,27 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void foo_member_initialize(thread float4* const tint_symbol, const constant float* const tint_symbol_1, texture2d<float, access::sample> tint_symbol_2, sampler tint_symbol_3) {
+struct tint_private_vars_struct {
+  float4 my_global;
+};
+
+void foo_member_initialize(thread tint_private_vars_struct* const tint_private_vars, const constant float* const tint_symbol, texture2d<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
   bool2 vb2 = false;
-  vb2[0] = ((*(tint_symbol))[2] != 0.0f);
-  vb2[0] = (*(tint_symbol_1) == -1.0f);
-  vb2 = bool2((*(tint_symbol_1) == -1.0f), false);
+  vb2[0] = ((*(tint_private_vars)).my_global[2] != 0.0f);
+  vb2[0] = (*(tint_symbol) == -1.0f);
+  vb2 = bool2((*(tint_symbol) == -1.0f), false);
   if (vb2[0]) {
-    float4 const r = tint_symbol_2.sample(tint_symbol_3, float2(0.0f), bias(0.0f));
+    float4 const r = tint_symbol_1.sample(tint_symbol_2, float2(0.0f), bias(0.0f));
   }
 }
 
-void foo_default_initialize(thread float4* const tint_symbol_4, const constant float* const tint_symbol_5, texture2d<float, access::sample> tint_symbol_6, sampler tint_symbol_7) {
+void foo_default_initialize(thread tint_private_vars_struct* const tint_private_vars, const constant float* const tint_symbol_3, texture2d<float, access::sample> tint_symbol_4, sampler tint_symbol_5) {
   bool2 vb2 = false;
-  vb2[0] = ((*(tint_symbol_4))[2] != 0.0f);
-  vb2[0] = (*(tint_symbol_5) == -1.0f);
+  vb2[0] = ((*(tint_private_vars)).my_global[2] != 0.0f);
+  vb2[0] = (*(tint_symbol_3) == -1.0f);
   vb2 = bool2(false);
   if (vb2[0]) {
-    float4 const r = tint_symbol_6.sample(tint_symbol_7, float2(0.0f), bias(0.0f));
+    float4 const r = tint_symbol_4.sample(tint_symbol_5, float2(0.0f), bias(0.0f));
   }
 }
 
diff --git a/test/tint/bug/tint/1820.wgsl.expected.msl b/test/tint/bug/tint/1820.wgsl.expected.msl
index 4c26583..fec8589 100644
--- a/test/tint/bug/tint/1820.wgsl.expected.msl
+++ b/test/tint/bug/tint/1820.wgsl.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int global;
+};
+
 int tint_ftoi(float v) {
   return select(2147483647, select(int(v), (-2147483647 - 1), (v < -2147483648.0f)), (v < 2147483520.0f));
 }
@@ -13,14 +17,13 @@
   }
 }
 
-int baz(int x) {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 42;
+int baz(int x, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).global = 42;
   return x;
 }
 
-void bar(float x) {
-  switch(baz(tint_ftoi(x))) {
+void bar(float x, thread tint_private_vars_struct* const tint_private_vars) {
+  switch(baz(tint_ftoi(x), tint_private_vars)) {
     default: {
       break;
     }
diff --git a/test/tint/bug/tint/1875.wgsl b/test/tint/bug/tint/1875.wgsl
new file mode 100644
index 0000000..0c389f7
--- /dev/null
+++ b/test/tint/bug/tint/1875.wgsl
@@ -0,0 +1,28 @@
+struct Outputs {
+  data  : array<u32>,
+};
+var<private> count: u32 = 0;
+
+@group(0) @binding(1) var<storage, read_write> outputs : Outputs;
+
+fn push_output(value : u32) {
+  outputs.data[count] = value;
+  count += 1;
+}
+
+@compute @workgroup_size(1)
+fn main() {
+  _ = &outputs;
+
+  var a: u32 = 0;
+  var b: u32 = 10;
+  var c: u32 = 4294967294;
+
+  a++;
+  b++;
+  c++;
+
+  push_output(a);
+  push_output(b);
+  push_output(c);
+}
diff --git a/test/tint/bug/tint/1875.wgsl.expected.dxc.hlsl b/test/tint/bug/tint/1875.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8867c17
--- /dev/null
+++ b/test/tint/bug/tint/1875.wgsl.expected.dxc.hlsl
@@ -0,0 +1,21 @@
+static uint count = 0u;
+RWByteAddressBuffer outputs : register(u1, space0);
+
+void push_output(uint value) {
+  outputs.Store((4u * count), asuint(value));
+  count = (count + 1u);
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  uint a = 0u;
+  uint b = 10u;
+  uint c = 4294967294u;
+  a = (a + 1u);
+  b = (b + 1u);
+  c = (c + 1u);
+  push_output(a);
+  push_output(b);
+  push_output(c);
+  return;
+}
diff --git a/test/tint/bug/tint/1875.wgsl.expected.fxc.hlsl b/test/tint/bug/tint/1875.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8867c17
--- /dev/null
+++ b/test/tint/bug/tint/1875.wgsl.expected.fxc.hlsl
@@ -0,0 +1,21 @@
+static uint count = 0u;
+RWByteAddressBuffer outputs : register(u1, space0);
+
+void push_output(uint value) {
+  outputs.Store((4u * count), asuint(value));
+  count = (count + 1u);
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  uint a = 0u;
+  uint b = 10u;
+  uint c = 4294967294u;
+  a = (a + 1u);
+  b = (b + 1u);
+  c = (c + 1u);
+  push_output(a);
+  push_output(b);
+  push_output(c);
+  return;
+}
diff --git a/test/tint/bug/tint/1875.wgsl.expected.glsl b/test/tint/bug/tint/1875.wgsl.expected.glsl
new file mode 100644
index 0000000..cca3c5c
--- /dev/null
+++ b/test/tint/bug/tint/1875.wgsl.expected.glsl
@@ -0,0 +1,29 @@
+#version 310 es
+
+uint count = 0u;
+layout(binding = 1, std430) buffer Outputs_ssbo {
+  uint data[];
+} outputs;
+
+void push_output(uint value) {
+  outputs.data[count] = value;
+  count = (count + 1u);
+}
+
+void tint_symbol() {
+  uint a = 0u;
+  uint b = 10u;
+  uint c = 4294967294u;
+  a = (a + 1u);
+  b = (b + 1u);
+  c = (c + 1u);
+  push_output(a);
+  push_output(b);
+  push_output(c);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  tint_symbol();
+  return;
+}
diff --git a/test/tint/bug/tint/1875.wgsl.expected.msl b/test/tint/bug/tint/1875.wgsl.expected.msl
new file mode 100644
index 0000000..f3abb69
--- /dev/null
+++ b/test/tint/bug/tint/1875.wgsl.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+    const constant T& operator[](size_t i) const constant { return elements[i]; }
+    device T& operator[](size_t i) device { return elements[i]; }
+    const device T& operator[](size_t i) const device { return elements[i]; }
+    thread T& operator[](size_t i) thread { return elements[i]; }
+    const thread T& operator[](size_t i) const thread { return elements[i]; }
+    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+    T elements[N];
+};
+
+struct tint_private_vars_struct {
+  uint count;
+};
+
+struct Outputs {
+  /* 0x0000 */ tint_array<uint, 1> data;
+};
+
+void push_output(uint value, thread tint_private_vars_struct* const tint_private_vars, device Outputs* const tint_symbol_1) {
+  (*(tint_symbol_1)).data[(*(tint_private_vars)).count] = value;
+  (*(tint_private_vars)).count = ((*(tint_private_vars)).count + 1u);
+}
+
+kernel void tint_symbol(device Outputs* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.count = 0u;
+  uint a = 0u;
+  uint b = 10u;
+  uint c = 4294967294u;
+  a = (a + 1u);
+  b = (b + 1u);
+  c = (c + 1u);
+  push_output(a, &(tint_private_vars), tint_symbol_2);
+  push_output(b, &(tint_private_vars), tint_symbol_2);
+  push_output(c, &(tint_private_vars), tint_symbol_2);
+  return;
+}
+
diff --git a/test/tint/bug/tint/1875.wgsl.expected.spvasm b/test/tint/bug/tint/1875.wgsl.expected.spvasm
new file mode 100644
index 0000000..0071087
--- /dev/null
+++ b/test/tint/bug/tint/1875.wgsl.expected.spvasm
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %count "count"
+               OpName %Outputs "Outputs"
+               OpMemberName %Outputs 0 "data"
+               OpName %outputs "outputs"
+               OpName %push_output "push_output"
+               OpName %value "value"
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpDecorate %Outputs Block
+               OpMemberDecorate %Outputs 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %outputs DescriptorSet 0
+               OpDecorate %outputs Binding 1
+       %uint = OpTypeInt 32 0
+          %2 = OpConstantNull %uint
+%_ptr_Private_uint = OpTypePointer Private %uint
+      %count = OpVariable %_ptr_Private_uint Private %2
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+    %Outputs = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_Outputs = OpTypePointer StorageBuffer %Outputs
+    %outputs = OpVariable %_ptr_StorageBuffer_Outputs StorageBuffer
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_1 = OpConstant %uint 1
+         %21 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+    %uint_10 = OpConstant %uint 10
+%uint_4294967294 = OpConstant %uint 4294967294
+%push_output = OpFunction %void None %9
+      %value = OpFunctionParameter %uint
+         %13 = OpLabel
+         %15 = OpLoad %uint %count
+         %17 = OpAccessChain %_ptr_StorageBuffer_uint %outputs %uint_0 %15
+               OpStore %17 %value
+         %18 = OpLoad %uint %count
+         %20 = OpIAdd %uint %18 %uint_1
+               OpStore %count %20
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %21
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %2
+          %b = OpVariable %_ptr_Function_uint Function %2
+          %c = OpVariable %_ptr_Function_uint Function %2
+               OpStore %a %2
+               OpStore %b %uint_10
+               OpStore %c %uint_4294967294
+         %30 = OpLoad %uint %a
+         %31 = OpIAdd %uint %30 %uint_1
+               OpStore %a %31
+         %32 = OpLoad %uint %b
+         %33 = OpIAdd %uint %32 %uint_1
+               OpStore %b %33
+         %34 = OpLoad %uint %c
+         %35 = OpIAdd %uint %34 %uint_1
+               OpStore %c %35
+         %37 = OpLoad %uint %a
+         %36 = OpFunctionCall %void %push_output %37
+         %39 = OpLoad %uint %b
+         %38 = OpFunctionCall %void %push_output %39
+         %41 = OpLoad %uint %c
+         %40 = OpFunctionCall %void %push_output %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/bug/tint/1875.wgsl.expected.wgsl b/test/tint/bug/tint/1875.wgsl.expected.wgsl
new file mode 100644
index 0000000..2fa7345
--- /dev/null
+++ b/test/tint/bug/tint/1875.wgsl.expected.wgsl
@@ -0,0 +1,26 @@
+struct Outputs {
+  data : array<u32>,
+}
+
+var<private> count : u32 = 0;
+
+@group(0) @binding(1) var<storage, read_write> outputs : Outputs;
+
+fn push_output(value : u32) {
+  outputs.data[count] = value;
+  count += 1;
+}
+
+@compute @workgroup_size(1)
+fn main() {
+  _ = &(outputs);
+  var a : u32 = 0;
+  var b : u32 = 10;
+  var c : u32 = 4294967294;
+  a++;
+  b++;
+  c++;
+  push_output(a);
+  push_output(b);
+  push_output(c);
+}
diff --git a/test/tint/bug/tint/922.wgsl.expected.msl b/test/tint/bug/tint/922.wgsl.expected.msl
index 71503ce..2d9e6a2 100644
--- a/test/tint/bug/tint/922.wgsl.expected.msl
+++ b/test/tint/bug/tint/922.wgsl.expected.msl
@@ -14,6 +14,17 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float3 a_Position1;
+  float2 a_UV1;
+  float4 a_Color1;
+  float3 a_Normal1;
+  float a_PosMtxIdx1;
+  float4 v_Color;
+  float2 v_TexCoord;
+  float4 gl_Position;
+};
+
 int tint_ftoi(float v) {
   return select(2147483647, select(int(v), (-2147483647 - 1), (v < -2147483648.0f)), (v < 2147483520.0f));
 }
@@ -227,48 +238,48 @@
   return x_e12;
 }
 
-void main1(thread float* const tint_symbol_5, const constant ub_PacketParams* const tint_symbol_6, thread float3* const tint_symbol_7, const constant ub_SceneParams* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11, const constant ub_MaterialParams* const tint_symbol_12, thread float3* const tint_symbol_13, thread float2* const tint_symbol_14, thread float2* const tint_symbol_15) {
+void main1(thread tint_private_vars_struct* const tint_private_vars, const constant ub_PacketParams* const tint_symbol_5, const constant ub_SceneParams* const tint_symbol_6, const constant ub_MaterialParams* const tint_symbol_7) {
   Mat4x3_ t_PosMtx = {};
   float2 t_TexSpaceCoord = 0.0f;
-  float const x_e15 = *(tint_symbol_5);
-  Mat4x3_ const x_e18 = (*(tint_symbol_6)).u_PosMtx[tint_ftoi(x_e15)];
+  float const x_e15 = (*(tint_private_vars)).a_PosMtxIdx1;
+  Mat4x3_ const x_e18 = (*(tint_symbol_5)).u_PosMtx[tint_ftoi(x_e15)];
   t_PosMtx = x_e18;
   Mat4x3_ const x_e23 = t_PosMtx;
   Mat4x4_ const x_e24 = x_Mat4x4_1(x_e23);
-  float3 const x_e25 = *(tint_symbol_7);
+  float3 const x_e25 = (*(tint_private_vars)).a_Position1;
   Mat4x3_ const x_e29 = t_PosMtx;
   Mat4x4_ const x_e30 = x_Mat4x4_1(x_e29);
-  float3 const x_e31 = *(tint_symbol_7);
+  float3 const x_e31 = (*(tint_private_vars)).a_Position1;
   float4 const x_e34 = Mul(x_e30, float4(x_e31, 1.0f));
-  Mat4x4_ const x_e35 = (*(tint_symbol_8)).u_Projection;
+  Mat4x4_ const x_e35 = (*(tint_symbol_6)).u_Projection;
   Mat4x3_ const x_e37 = t_PosMtx;
   Mat4x4_ const x_e38 = x_Mat4x4_1(x_e37);
-  float3 const x_e39 = *(tint_symbol_7);
+  float3 const x_e39 = (*(tint_private_vars)).a_Position1;
   Mat4x3_ const x_e43 = t_PosMtx;
   Mat4x4_ const x_e44 = x_Mat4x4_1(x_e43);
-  float3 const x_e45 = *(tint_symbol_7);
+  float3 const x_e45 = (*(tint_private_vars)).a_Position1;
   float4 const x_e48 = Mul(x_e44, float4(x_e45, 1.0f));
   float4 const x_e49 = Mul(x_e35, x_e48);
-  *(tint_symbol_9) = x_e49;
-  float4 const x_e50 = *(tint_symbol_10);
-  *(tint_symbol_11) = x_e50;
-  float4 const x_e52 = (*(tint_symbol_12)).u_Misc0_;
+  (*(tint_private_vars)).gl_Position = x_e49;
+  float4 const x_e50 = (*(tint_private_vars)).a_Color1;
+  (*(tint_private_vars)).v_Color = x_e50;
+  float4 const x_e52 = (*(tint_symbol_7)).u_Misc0_;
   if ((x_e52[0] == 2.0f)) {
     {
-      float3 const x_e59 = *(tint_symbol_13);
-      Mat4x2_ const x_e64 = (*(tint_symbol_12)).u_TexMtx[0];
-      float3 const x_e65 = *(tint_symbol_13);
+      float3 const x_e59 = (*(tint_private_vars)).a_Normal1;
+      Mat4x2_ const x_e64 = (*(tint_symbol_7)).u_TexMtx[0];
+      float3 const x_e65 = (*(tint_private_vars)).a_Normal1;
       float2 const x_e68 = Mul2(x_e64, float4(x_e65, 1.0f));
-      *(tint_symbol_14) = x_e68.xy;
+      (*(tint_private_vars)).v_TexCoord = x_e68.xy;
       return;
     }
   } else {
     {
-      float2 const x_e73 = *(tint_symbol_15);
-      Mat4x2_ const x_e79 = (*(tint_symbol_12)).u_TexMtx[0];
-      float2 const x_e80 = *(tint_symbol_15);
+      float2 const x_e73 = (*(tint_private_vars)).a_UV1;
+      Mat4x2_ const x_e79 = (*(tint_symbol_7)).u_TexMtx[0];
+      float2 const x_e80 = (*(tint_private_vars)).a_UV1;
       float2 const x_e84 = Mul2(x_e79, float4(x_e80, 1.0f, 1.0f));
-      *(tint_symbol_14) = x_e84.xy;
+      (*(tint_private_vars)).v_TexCoord = x_e84.xy;
       return;
     }
   }
@@ -288,30 +299,23 @@
   float4 member [[position]];
 };
 
-VertexOutput tint_symbol_inner(float3 a_Position, float2 a_UV, float4 a_Color, float3 a_Normal, float a_PosMtxIdx, thread float3* const tint_symbol_16, thread float2* const tint_symbol_17, thread float4* const tint_symbol_18, thread float3* const tint_symbol_19, thread float* const tint_symbol_20, const constant ub_PacketParams* const tint_symbol_21, const constant ub_SceneParams* const tint_symbol_22, thread float4* const tint_symbol_23, thread float4* const tint_symbol_24, const constant ub_MaterialParams* const tint_symbol_25, thread float2* const tint_symbol_26) {
-  *(tint_symbol_16) = a_Position;
-  *(tint_symbol_17) = a_UV;
-  *(tint_symbol_18) = a_Color;
-  *(tint_symbol_19) = a_Normal;
-  *(tint_symbol_20) = a_PosMtxIdx;
-  main1(tint_symbol_20, tint_symbol_21, tint_symbol_16, tint_symbol_22, tint_symbol_23, tint_symbol_18, tint_symbol_24, tint_symbol_25, tint_symbol_19, tint_symbol_26, tint_symbol_17);
-  float4 const x_e11 = *(tint_symbol_24);
-  float2 const x_e13 = *(tint_symbol_26);
-  float4 const x_e15 = *(tint_symbol_23);
+VertexOutput tint_symbol_inner(float3 a_Position, float2 a_UV, float4 a_Color, float3 a_Normal, float a_PosMtxIdx, thread tint_private_vars_struct* const tint_private_vars, const constant ub_PacketParams* const tint_symbol_8, const constant ub_SceneParams* const tint_symbol_9, const constant ub_MaterialParams* const tint_symbol_10) {
+  (*(tint_private_vars)).a_Position1 = a_Position;
+  (*(tint_private_vars)).a_UV1 = a_UV;
+  (*(tint_private_vars)).a_Color1 = a_Color;
+  (*(tint_private_vars)).a_Normal1 = a_Normal;
+  (*(tint_private_vars)).a_PosMtxIdx1 = a_PosMtxIdx;
+  main1(tint_private_vars, tint_symbol_8, tint_symbol_9, tint_symbol_10);
+  float4 const x_e11 = (*(tint_private_vars)).v_Color;
+  float2 const x_e13 = (*(tint_private_vars)).v_TexCoord;
+  float4 const x_e15 = (*(tint_private_vars)).gl_Position;
   VertexOutput const tint_symbol_4 = {.v_Color=x_e11, .v_TexCoord=x_e13, .member=x_e15};
   return tint_symbol_4;
 }
 
-vertex tint_symbol_3 tint_symbol(const constant ub_PacketParams* tint_symbol_32 [[buffer(0)]], const constant ub_SceneParams* tint_symbol_33 [[buffer(1)]], const constant ub_MaterialParams* tint_symbol_36 [[buffer(2)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread float3 tint_symbol_27 = 0.0f;
-  thread float2 tint_symbol_28 = 0.0f;
-  thread float4 tint_symbol_29 = 0.0f;
-  thread float3 tint_symbol_30 = 0.0f;
-  thread float tint_symbol_31 = 0.0f;
-  thread float4 tint_symbol_34 = 0.0f;
-  thread float4 tint_symbol_35 = 0.0f;
-  thread float2 tint_symbol_37 = 0.0f;
-  VertexOutput const inner_result = tint_symbol_inner(tint_symbol_1.a_Position, tint_symbol_1.a_UV, tint_symbol_1.a_Color, tint_symbol_1.a_Normal, tint_symbol_1.a_PosMtxIdx, &(tint_symbol_27), &(tint_symbol_28), &(tint_symbol_29), &(tint_symbol_30), &(tint_symbol_31), tint_symbol_32, tint_symbol_33, &(tint_symbol_34), &(tint_symbol_35), tint_symbol_36, &(tint_symbol_37));
+vertex tint_symbol_3 tint_symbol(const constant ub_PacketParams* tint_symbol_11 [[buffer(0)]], const constant ub_SceneParams* tint_symbol_12 [[buffer(1)]], const constant ub_MaterialParams* tint_symbol_13 [[buffer(2)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  VertexOutput const inner_result = tint_symbol_inner(tint_symbol_1.a_Position, tint_symbol_1.a_UV, tint_symbol_1.a_Color, tint_symbol_1.a_Normal, tint_symbol_1.a_PosMtxIdx, &(tint_private_vars), tint_symbol_11, tint_symbol_12, tint_symbol_13);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.v_Color = inner_result.v_Color;
   wrapper_result.v_TexCoord = inner_result.v_TexCoord;
diff --git a/test/tint/bug/tint/926.wgsl.expected.msl b/test/tint/bug/tint/926.wgsl.expected.msl
index 34e8d8d..1b88705 100644
--- a/test/tint/bug/tint/926.wgsl.expected.msl
+++ b/test/tint/bug/tint/926.wgsl.expected.msl
@@ -1,17 +1,22 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint cubeVerts;
+};
+
 struct DrawIndirectArgs {
   /* 0x0000 */ atomic_uint vertexCount;
 };
 
-void computeMain_inner(uint3 global_id, device DrawIndirectArgs* const tint_symbol) {
-  thread uint tint_symbol_1 = 0u;
-  uint const firstVertex = atomic_fetch_add_explicit(&((*(tint_symbol)).vertexCount), tint_symbol_1, memory_order_relaxed);
+void computeMain_inner(uint3 global_id, thread tint_private_vars_struct* const tint_private_vars, device DrawIndirectArgs* const tint_symbol) {
+  uint const firstVertex = atomic_fetch_add_explicit(&((*(tint_symbol)).vertexCount), (*(tint_private_vars)).cubeVerts, memory_order_relaxed);
 }
 
-kernel void computeMain(device DrawIndirectArgs* tint_symbol_2 [[buffer(0)]], uint3 global_id [[thread_position_in_grid]]) {
-  computeMain_inner(global_id, tint_symbol_2);
+kernel void computeMain(device DrawIndirectArgs* tint_symbol_1 [[buffer(0)]], uint3 global_id [[thread_position_in_grid]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.cubeVerts = 0u;
+  computeMain_inner(global_id, &(tint_private_vars), tint_symbol_1);
   return;
 }
 
diff --git a/test/tint/bug/tint/948.wgsl.expected.msl b/test/tint/bug/tint/948.wgsl.expected.msl
index 85775c9..ae3f8b8 100644
--- a/test/tint/bug/tint/948.wgsl.expected.msl
+++ b/test/tint/bug/tint/948.wgsl.expected.msl
@@ -14,6 +14,17 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float2 tUV;
+  float mt;
+  float4 glFragColor;
+  float2 tileID_1;
+  float2 levelUnits;
+  float2 stageUnits_1;
+  float3 vPosition;
+  float2 vUV;
+};
+
 struct LeftOver_tint_packed_vec3 {
   /* 0x0000 */ float time;
   /* 0x0004 */ uint padding;
@@ -54,8 +65,7 @@
   return float4x4(float4(x_40[0], x_40[1], x_40[2], x_40[3]), float4(x_47[0], x_47[1], x_47[2], x_47[3]), float4(x_54[0], x_54[1], x_54[2], x_54[3]), float4(0.0f));
 }
 
-void main_1(thread float2* const tint_symbol_8, const constant LeftOver_tint_packed_vec3* const tint_symbol_9, texture2d<float, access::sample> tint_symbol_10, sampler tint_symbol_11, texture2d<float, access::sample> tint_symbol_12, texture2d<float, access::sample> tint_symbol_13, sampler tint_symbol_14, texture2d<float, access::sample> tint_symbol_16, sampler tint_symbol_17, texture2d<float, access::sample> tint_symbol_18, sampler tint_symbol_19, thread float4* const tint_symbol_20) {
-  thread float tint_symbol_15 = 0.0f;
+void main_1(thread tint_private_vars_struct* const tint_private_vars, const constant LeftOver_tint_packed_vec3* const tint_symbol_8, texture2d<float, access::sample> tint_symbol_9, sampler tint_symbol_10, texture2d<float, access::sample> tint_symbol_11, texture2d<float, access::sample> tint_symbol_12, sampler tint_symbol_13, texture2d<float, access::sample> tint_symbol_14, sampler tint_symbol_15, texture2d<float, access::sample> tint_symbol_16, sampler tint_symbol_17) {
   float4 color = 0.0f;
   float2 tileUV = 0.0f;
   float2 tileID = 0.0f;
@@ -75,17 +85,17 @@
   float alpha = 0.0f;
   float3 mixed = 0.0f;
   color = float4(0.0f);
-  float2 const x_86 = *(tint_symbol_8);
+  float2 const x_86 = (*(tint_private_vars)).tUV;
   tileUV = fract(x_86);
   float const x_91 = tileUV[1];
   tileUV[1] = (1.0f - x_91);
-  float2 const x_95 = *(tint_symbol_8);
+  float2 const x_95 = (*(tint_private_vars)).tUV;
   tileID = floor(x_95);
-  float2 const x_101 = (*(tint_symbol_9)).spriteMapSize;
+  float2 const x_101 = (*(tint_symbol_8)).spriteMapSize;
   sheetUnits = (float2(1.0f) / x_101);
-  float const x_106 = (*(tint_symbol_9)).spriteCount;
+  float const x_106 = (*(tint_symbol_8)).spriteCount;
   spriteUnits = (1.0f / x_106);
-  float2 const x_111 = (*(tint_symbol_9)).stageSize;
+  float2 const x_111 = (*(tint_symbol_8)).stageSize;
   stageUnits = (float2(1.0f) / x_111);
   i = 0;
   while (true) {
@@ -98,15 +108,15 @@
     switch(x_126) {
       case 1: {
         float2 const x_150 = tileID;
-        float2 const x_154 = (*(tint_symbol_9)).stageSize;
-        float4 const x_156 = tint_symbol_10.sample(tint_symbol_11, ((x_150 + float2(0.5f)) / x_154), bias(0.0f));
+        float2 const x_154 = (*(tint_symbol_8)).stageSize;
+        float4 const x_156 = tint_symbol_9.sample(tint_symbol_10, ((x_150 + float2(0.5f)) / x_154), bias(0.0f));
         frameID_1 = x_156[0];
         break;
       }
       case 0: {
         float2 const x_136 = tileID;
-        float2 const x_140 = (*(tint_symbol_9)).stageSize;
-        float4 const x_142 = tint_symbol_12.sample(tint_symbol_11, ((x_136 + float2(0.5f)) / x_140), bias(0.0f));
+        float2 const x_140 = (*(tint_symbol_8)).stageSize;
+        float4 const x_142 = tint_symbol_11.sample(tint_symbol_10, ((x_136 + float2(0.5f)) / x_140), bias(0.0f));
         frameID_1 = x_142[0];
         break;
       }
@@ -115,14 +125,14 @@
       }
     }
     float const x_166 = frameID_1;
-    float const x_169 = (*(tint_symbol_9)).spriteCount;
-    float4 const x_172 = tint_symbol_13.sample(tint_symbol_14, float2(((x_166 + 0.5f) / x_169), 0.0f), bias(0.0f));
+    float const x_169 = (*(tint_symbol_8)).spriteCount;
+    float4 const x_172 = tint_symbol_12.sample(tint_symbol_13, float2(((x_166 + 0.5f) / x_169), 0.0f), bias(0.0f));
     animationData = x_172;
     float const x_174 = animationData[1];
     if ((x_174 > 0.0f)) {
-      float const x_181 = (*(tint_symbol_9)).time;
+      float const x_181 = (*(tint_symbol_8)).time;
       float const x_184 = animationData[2];
-      tint_symbol_15 = fmod((x_181 * x_184), 1.0f);
+      (*(tint_private_vars)).mt = fmod((x_181 * x_184), 1.0f);
       f = 0.0f;
       while (true) {
         float const x_193 = f;
@@ -131,14 +141,14 @@
           break;
         }
         float const x_197 = animationData[1];
-        float const x_198 = tint_symbol_15;
+        float const x_198 = (*(tint_private_vars)).mt;
         if ((x_197 > x_198)) {
           float const x_203 = animationData[0];
           frameID_1 = x_203;
           break;
         }
         float const x_208 = frameID_1;
-        float const x_211 = (*(tint_symbol_9)).spriteCount;
+        float const x_211 = (*(tint_symbol_8)).spriteCount;
         float const x_214 = f;
         float4 const x_217 = float4(0.0f);
         animationData = x_217;
@@ -150,10 +160,10 @@
     }
     float const x_222 = frameID_1;
     param = (x_222 + 0.5f);
-    float4x4 const x_225 = getFrameData_f1_(&(param), tint_symbol_9, tint_symbol_16, tint_symbol_17);
+    float4x4 const x_225 = getFrameData_f1_(&(param), tint_symbol_8, tint_symbol_14, tint_symbol_15);
     frameData = x_225;
     float4 const x_228 = frameData[0];
-    float2 const x_231 = (*(tint_symbol_9)).spriteMapSize;
+    float2 const x_231 = (*(tint_symbol_8)).spriteMapSize;
     frameSize = (float2(x_228[3], x_228[2]) / x_231);
     float4 const x_235 = frameData[0];
     float2 const x_237 = sheetUnits;
@@ -171,13 +181,13 @@
       float2 const x_263 = tileUV;
       float2 const x_264 = frameSize;
       float2 const x_266 = offset_1;
-      float4 const x_268 = tint_symbol_18.sample(tint_symbol_19, ((x_263 * x_264) + x_266));
+      float4 const x_268 = tint_symbol_16.sample(tint_symbol_17, ((x_263 * x_264) + x_266));
       color = x_268;
     } else {
       float2 const x_274 = tileUV;
       float2 const x_275 = frameSize;
       float2 const x_277 = offset_1;
-      float4 const x_279 = tint_symbol_18.sample(tint_symbol_19, ((x_274 * x_275) + x_277));
+      float4 const x_279 = tint_symbol_16.sample(tint_symbol_17, ((x_274 * x_275) + x_277));
       nc = x_279;
       float const x_283 = color[3];
       float const x_285 = nc[3];
@@ -195,13 +205,13 @@
       i = as_type<int>((as_type<uint>(x_304) + as_type<uint>(1)));
     }
   }
-  float3 const x_310 = float3((*(tint_symbol_9)).colorMul);
+  float3 const x_310 = float3((*(tint_symbol_8)).colorMul);
   float4 const x_311 = color;
   float3 const x_313 = (float3(x_311[0], x_311[1], x_311[2]) * x_310);
   float4 const x_314 = color;
   color = float4(x_313[0], x_313[1], x_313[2], x_314[3]);
   float4 const x_318 = color;
-  *(tint_symbol_20) = x_318;
+  (*(tint_private_vars)).glFragColor = x_318;
   return;
 }
 
@@ -222,27 +232,21 @@
   float4 glFragColor_1 [[color(0)]];
 };
 
-main_out tint_symbol_inner(float2 tUV_param, float2 tileID_1_param, float2 levelUnits_param, float2 stageUnits_1_param, float3 vPosition_param, float2 vUV_param, thread float2* const tint_symbol_21, const constant LeftOver_tint_packed_vec3* const tint_symbol_27, texture2d<float, access::sample> tint_symbol_28, sampler tint_symbol_29, texture2d<float, access::sample> tint_symbol_30, texture2d<float, access::sample> tint_symbol_31, sampler tint_symbol_32, texture2d<float, access::sample> tint_symbol_33, sampler tint_symbol_34, texture2d<float, access::sample> tint_symbol_35, sampler tint_symbol_36, thread float4* const tint_symbol_37) {
-  thread float2 tint_symbol_22 = 0.0f;
-  thread float2 tint_symbol_23 = 0.0f;
-  thread float2 tint_symbol_24 = 0.0f;
-  thread float3 tint_symbol_25 = 0.0f;
-  thread float2 tint_symbol_26 = 0.0f;
-  *(tint_symbol_21) = tUV_param;
-  tint_symbol_22 = tileID_1_param;
-  tint_symbol_23 = levelUnits_param;
-  tint_symbol_24 = stageUnits_1_param;
-  tint_symbol_25 = vPosition_param;
-  tint_symbol_26 = vUV_param;
-  main_1(tint_symbol_21, tint_symbol_27, tint_symbol_28, tint_symbol_29, tint_symbol_30, tint_symbol_31, tint_symbol_32, tint_symbol_33, tint_symbol_34, tint_symbol_35, tint_symbol_36, tint_symbol_37);
-  main_out const tint_symbol_4 = {.glFragColor_1=*(tint_symbol_37)};
+main_out tint_symbol_inner(float2 tUV_param, float2 tileID_1_param, float2 levelUnits_param, float2 stageUnits_1_param, float3 vPosition_param, float2 vUV_param, thread tint_private_vars_struct* const tint_private_vars, const constant LeftOver_tint_packed_vec3* const tint_symbol_18, texture2d<float, access::sample> tint_symbol_19, sampler tint_symbol_20, texture2d<float, access::sample> tint_symbol_21, texture2d<float, access::sample> tint_symbol_22, sampler tint_symbol_23, texture2d<float, access::sample> tint_symbol_24, sampler tint_symbol_25, texture2d<float, access::sample> tint_symbol_26, sampler tint_symbol_27) {
+  (*(tint_private_vars)).tUV = tUV_param;
+  (*(tint_private_vars)).tileID_1 = tileID_1_param;
+  (*(tint_private_vars)).levelUnits = levelUnits_param;
+  (*(tint_private_vars)).stageUnits_1 = stageUnits_1_param;
+  (*(tint_private_vars)).vPosition = vPosition_param;
+  (*(tint_private_vars)).vUV = vUV_param;
+  main_1(tint_private_vars, tint_symbol_18, tint_symbol_19, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23, tint_symbol_24, tint_symbol_25, tint_symbol_26, tint_symbol_27);
+  main_out const tint_symbol_4 = {.glFragColor_1=(*(tint_private_vars)).glFragColor};
   return tint_symbol_4;
 }
 
-fragment tint_symbol_3 tint_symbol(const constant LeftOver_tint_packed_vec3* tint_symbol_39 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_40 [[texture(0)]], sampler tint_symbol_41 [[sampler(0)]], texture2d<float, access::sample> tint_symbol_42 [[texture(1)]], texture2d<float, access::sample> tint_symbol_43 [[texture(2)]], sampler tint_symbol_44 [[sampler(1)]], texture2d<float, access::sample> tint_symbol_45 [[texture(3)]], sampler tint_symbol_46 [[sampler(2)]], texture2d<float, access::sample> tint_symbol_47 [[texture(4)]], sampler tint_symbol_48 [[sampler(3)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread float2 tint_symbol_38 = 0.0f;
-  thread float4 tint_symbol_49 = 0.0f;
-  main_out const inner_result = tint_symbol_inner(tint_symbol_1.tUV_param, tint_symbol_1.tileID_1_param, tint_symbol_1.levelUnits_param, tint_symbol_1.stageUnits_1_param, tint_symbol_1.vPosition_param, tint_symbol_1.vUV_param, &(tint_symbol_38), tint_symbol_39, tint_symbol_40, tint_symbol_41, tint_symbol_42, tint_symbol_43, tint_symbol_44, tint_symbol_45, tint_symbol_46, tint_symbol_47, tint_symbol_48, &(tint_symbol_49));
+fragment tint_symbol_3 tint_symbol(const constant LeftOver_tint_packed_vec3* tint_symbol_28 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_29 [[texture(0)]], sampler tint_symbol_30 [[sampler(0)]], texture2d<float, access::sample> tint_symbol_31 [[texture(1)]], texture2d<float, access::sample> tint_symbol_32 [[texture(2)]], sampler tint_symbol_33 [[sampler(1)]], texture2d<float, access::sample> tint_symbol_34 [[texture(3)]], sampler tint_symbol_35 [[sampler(2)]], texture2d<float, access::sample> tint_symbol_36 [[texture(4)]], sampler tint_symbol_37 [[sampler(3)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_out const inner_result = tint_symbol_inner(tint_symbol_1.tUV_param, tint_symbol_1.tileID_1_param, tint_symbol_1.levelUnits_param, tint_symbol_1.stageUnits_1_param, tint_symbol_1.vPosition_param, tint_symbol_1.vUV_param, &(tint_private_vars), tint_symbol_28, tint_symbol_29, tint_symbol_30, tint_symbol_31, tint_symbol_32, tint_symbol_33, tint_symbol_34, tint_symbol_35, tint_symbol_36, tint_symbol_37);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.glFragColor_1 = inner_result.glFragColor_1;
   return wrapper_result;
diff --git a/test/tint/bug/tint/949.wgsl.expected.msl b/test/tint/bug/tint/949.wgsl.expected.msl
index 779b99b..fb8ec0f 100644
--- a/test/tint/bug/tint/949.wgsl.expected.msl
+++ b/test/tint/bug/tint/949.wgsl.expected.msl
@@ -14,6 +14,17 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  float u_Float;
+  float3 u_Color;
+  float2 vMainuv;
+  float4 v_output1;
+  bool gl_FrontFacing;
+  float2 v_uv;
+  float4 v_output2;
+  float4 glFragColor;
+};
+
 struct LeftOver_tint_packed_vec3 {
   /* 0x0000 */ float4x4 u_World;
   /* 0x0040 */ float4x4 u_ViewProjection;
@@ -196,9 +207,7 @@
   return x_245;
 }
 
-void main_1(thread float2* const tint_symbol_7, texture2d<float, access::sample> tint_symbol_8, sampler tint_symbol_9, const constant LeftOver_tint_packed_vec3* const tint_symbol_10, thread float4* const tint_symbol_11, thread bool* const tint_symbol_12, thread float2* const tint_symbol_13, thread float4* const tint_symbol_14, texture2d<float, access::sample> tint_symbol_15, sampler tint_symbol_16, const constant Light0_tint_packed_vec3* const tint_symbol_17, thread float4* const tint_symbol_18) {
-  thread float tint_symbol_5 = 0.0f;
-  thread float3 tint_symbol_6 = 0.0f;
+void main_1(thread tint_private_vars_struct* const tint_private_vars, texture2d<float, access::sample> tint_symbol_5, sampler tint_symbol_6, const constant LeftOver_tint_packed_vec3* const tint_symbol_7, texture2d<float, access::sample> tint_symbol_8, sampler tint_symbol_9, const constant Light0_tint_packed_vec3* const tint_symbol_10) {
   float4 tempTextureRead = 0.0f;
   float3 rgb = 0.0f;
   float3 output5 = 0.0f;
@@ -252,39 +261,39 @@
   float3 diffuseOutput = 0.0f;
   float3 specularOutput = 0.0f;
   float3 output3 = 0.0f;
-  tint_symbol_5 = 100.0f;
-  tint_symbol_6 = float3(0.5f);
-  float2 const x_261 = *(tint_symbol_7);
-  float4 const x_262 = tint_symbol_8.sample(tint_symbol_9, x_261);
+  (*(tint_private_vars)).u_Float = 100.0f;
+  (*(tint_private_vars)).u_Color = float3(0.5f);
+  float2 const x_261 = (*(tint_private_vars)).vMainuv;
+  float4 const x_262 = tint_symbol_5.sample(tint_symbol_6, x_261);
   tempTextureRead = x_262;
   float4 const x_264 = tempTextureRead;
-  float const x_273 = (*(tint_symbol_10)).textureInfoName;
+  float const x_273 = (*(tint_symbol_7)).textureInfoName;
   rgb = (float3(x_264[0], x_264[1], x_264[2]) * x_273);
-  float3 const x_279 = float3((*(tint_symbol_10)).u_cameraPosition);
-  float4 const x_282 = *(tint_symbol_11);
+  float3 const x_279 = float3((*(tint_symbol_7)).u_cameraPosition);
+  float4 const x_282 = (*(tint_private_vars)).v_output1;
   output5 = normalize((x_279 - float3(x_282[0], x_282[1], x_282[2])));
   output4 = float4(0.0f);
   uvOffset = float2(0.0f);
-  float const x_292 = (*(tint_symbol_10)).u_bumpStrength;
+  float const x_292 = (*(tint_symbol_7)).u_bumpStrength;
   normalScale = (1.0f / x_292);
-  bool const x_298 = *(tint_symbol_12);
+  bool const x_298 = (*(tint_private_vars)).gl_FrontFacing;
   if (x_298) {
-    float2 const x_303 = *(tint_symbol_13);
+    float2 const x_303 = (*(tint_private_vars)).v_uv;
     x_299 = x_303;
   } else {
-    float2 const x_305 = *(tint_symbol_13);
+    float2 const x_305 = (*(tint_private_vars)).v_uv;
     x_299 = -(x_305);
   }
   float2 const x_307 = x_299;
   TBNUV = x_307;
-  float4 const x_310 = *(tint_symbol_14);
+  float4 const x_310 = (*(tint_private_vars)).v_output2;
   float const x_312 = normalScale;
   param_3 = (float3(x_310[0], x_310[1], x_310[2]) * x_312);
-  float4 const x_317 = *(tint_symbol_11);
+  float4 const x_317 = (*(tint_private_vars)).v_output1;
   param_4 = float3(x_317[0], x_317[1], x_317[2]);
   float2 const x_320 = TBNUV;
   param_5 = x_320;
-  float2 const x_324 = (*(tint_symbol_10)).tangentSpaceParameter0;
+  float2 const x_324 = (*(tint_symbol_7)).tangentSpaceParameter0;
   param_6 = x_324;
   float3x3 const x_325 = cotangent_frame_vf3_vf3_vf2_vf2_(&(param_3), &(param_4), &(param_5), &(param_6));
   TBN = x_325;
@@ -298,7 +307,7 @@
   float3x3 const x_337 = invTBN;
   float3 const x_338 = output5;
   parallaxLimit = (length(float2(x_334[0], x_334[1])) / ((x_337 * -(x_338)))[2]);
-  float const x_345 = (*(tint_symbol_10)).u_parallaxScale;
+  float const x_345 = (*(tint_symbol_7)).u_parallaxScale;
   float const x_346 = parallaxLimit;
   parallaxLimit = (x_346 * x_345);
   float3x3 const x_349 = invTBN;
@@ -311,7 +320,7 @@
   float3x3 const x_361 = invTBN;
   float3 const x_362 = output5;
   float3x3 const x_365 = invTBN;
-  float4 const x_366 = *(tint_symbol_14);
+  float4 const x_366 = (*(tint_private_vars)).v_output2;
   numSamples = (15.0f + (dot((x_361 * -(x_362)), (x_365 * float3(x_366[0], x_366[1], x_366[2]))) * -11.0f));
   float const x_374 = numSamples;
   stepSize = (1.0f / x_374);
@@ -327,7 +336,7 @@
     } else {
       break;
     }
-    float2 const x_394 = *(tint_symbol_13);
+    float2 const x_394 = (*(tint_private_vars)).v_uv;
     float2 const x_395 = vCurrOffset;
     float4 const x_397 = float4(0.0f);
     currSampledHeight = x_397[3];
@@ -373,10 +382,10 @@
   parallaxOcclusion_0 = x_444;
   float2 const x_445 = parallaxOcclusion_0;
   uvOffset = x_445;
-  float2 const x_449 = *(tint_symbol_13);
+  float2 const x_449 = (*(tint_private_vars)).v_uv;
   float2 const x_450 = uvOffset;
-  float4 const x_452 = tint_symbol_8.sample(tint_symbol_9, (x_449 + x_450));
-  float const x_454 = (*(tint_symbol_10)).u_bumpStrength;
+  float4 const x_452 = tint_symbol_5.sample(tint_symbol_6, (x_449 + x_450));
+  float const x_454 = (*(tint_symbol_7)).u_bumpStrength;
   float3x3 const x_457 = TBN;
   param_8 = x_457;
   param_9 = float3(x_452[0], x_452[1], x_452[2]);
@@ -384,19 +393,19 @@
   float3 const x_461 = perturbNormal_mf33_vf3_f1_(&(param_8), &(param_9), &(param_10));
   float4 const x_462 = output4;
   output4 = float4(x_461[0], x_461[1], x_461[2], x_462[3]);
-  float2 const x_465 = *(tint_symbol_13);
+  float2 const x_465 = (*(tint_private_vars)).v_uv;
   float2 const x_466 = uvOffset;
   output6 = (x_465 + x_466);
   float2 const x_474 = output6;
-  float4 const x_475 = tint_symbol_15.sample(tint_symbol_16, x_474);
+  float4 const x_475 = tint_symbol_8.sample(tint_symbol_9, x_474);
   tempTextureRead1 = x_475;
   float4 const x_477 = tempTextureRead1;
   rgb1 = float3(x_477[0], x_477[1], x_477[2]);
-  float3 const x_481 = float3((*(tint_symbol_10)).u_cameraPosition);
-  float4 const x_482 = *(tint_symbol_11);
+  float3 const x_481 = float3((*(tint_symbol_7)).u_cameraPosition);
+  float4 const x_482 = (*(tint_private_vars)).v_output1;
   viewDirectionW_1 = normalize((x_481 - float3(x_482[0], x_482[1], x_482[2])));
   shadow = 1.0f;
-  float const x_488 = tint_symbol_5;
+  float const x_488 = (*(tint_private_vars)).u_Float;
   glossiness_1 = (1.0f * x_488);
   diffuseBase = float3(0.0f);
   specularBase = float3(0.0f);
@@ -406,13 +415,13 @@
   param_11 = x_501;
   float3 const x_503 = normalW;
   param_12 = x_503;
-  float4 const x_507 = (*(tint_symbol_17)).vLightData;
+  float4 const x_507 = (*(tint_symbol_10)).vLightData;
   param_13 = x_507;
-  float4 const x_510 = (*(tint_symbol_17)).vLightDiffuse;
+  float4 const x_510 = (*(tint_symbol_10)).vLightDiffuse;
   param_14 = float3(x_510[0], x_510[1], x_510[2]);
-  float4 const x_514 = (*(tint_symbol_17)).vLightSpecular;
+  float4 const x_514 = (*(tint_symbol_10)).vLightSpecular;
   param_15 = float3(x_514[0], x_514[1], x_514[2]);
-  float3 const x_518 = float3((*(tint_symbol_17)).vLightGround);
+  float3 const x_518 = float3((*(tint_symbol_10)).vLightGround);
   param_16 = x_518;
   float const x_520 = glossiness_1;
   param_17 = x_520;
@@ -431,13 +440,13 @@
   float3 const x_536 = rgb1;
   diffuseOutput = (x_535 * x_536);
   float3 const x_539 = specularBase;
-  float3 const x_540 = tint_symbol_6;
+  float3 const x_540 = (*(tint_private_vars)).u_Color;
   specularOutput = (x_539 * x_540);
   float3 const x_543 = diffuseOutput;
   float3 const x_544 = specularOutput;
   output3 = (x_543 + x_544);
   float3 const x_548 = output3;
-  *(tint_symbol_18) = float4(x_548[0], x_548[1], x_548[2], 1.0f);
+  (*(tint_private_vars)).glFragColor = float4(x_548[0], x_548[1], x_548[2], 1.0f);
   return;
 }
 
@@ -456,25 +465,20 @@
   float4 glFragColor_1 [[color(0)]];
 };
 
-main_out tint_symbol_inner(float2 vMainuv_param, float4 v_output1_param, bool gl_FrontFacing_param, float2 v_uv_param, float4 v_output2_param, thread float2* const tint_symbol_19, thread float4* const tint_symbol_20, thread bool* const tint_symbol_21, thread float2* const tint_symbol_22, thread float4* const tint_symbol_23, texture2d<float, access::sample> tint_symbol_24, sampler tint_symbol_25, const constant LeftOver_tint_packed_vec3* const tint_symbol_26, texture2d<float, access::sample> tint_symbol_27, sampler tint_symbol_28, const constant Light0_tint_packed_vec3* const tint_symbol_29, thread float4* const tint_symbol_30) {
-  *(tint_symbol_19) = vMainuv_param;
-  *(tint_symbol_20) = v_output1_param;
-  *(tint_symbol_21) = gl_FrontFacing_param;
-  *(tint_symbol_22) = v_uv_param;
-  *(tint_symbol_23) = v_output2_param;
-  main_1(tint_symbol_19, tint_symbol_24, tint_symbol_25, tint_symbol_26, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23, tint_symbol_27, tint_symbol_28, tint_symbol_29, tint_symbol_30);
-  main_out const tint_symbol_4 = {.glFragColor_1=*(tint_symbol_30)};
+main_out tint_symbol_inner(float2 vMainuv_param, float4 v_output1_param, bool gl_FrontFacing_param, float2 v_uv_param, float4 v_output2_param, thread tint_private_vars_struct* const tint_private_vars, texture2d<float, access::sample> tint_symbol_11, sampler tint_symbol_12, const constant LeftOver_tint_packed_vec3* const tint_symbol_13, texture2d<float, access::sample> tint_symbol_14, sampler tint_symbol_15, const constant Light0_tint_packed_vec3* const tint_symbol_16) {
+  (*(tint_private_vars)).vMainuv = vMainuv_param;
+  (*(tint_private_vars)).v_output1 = v_output1_param;
+  (*(tint_private_vars)).gl_FrontFacing = gl_FrontFacing_param;
+  (*(tint_private_vars)).v_uv = v_uv_param;
+  (*(tint_private_vars)).v_output2 = v_output2_param;
+  main_1(tint_private_vars, tint_symbol_11, tint_symbol_12, tint_symbol_13, tint_symbol_14, tint_symbol_15, tint_symbol_16);
+  main_out const tint_symbol_4 = {.glFragColor_1=(*(tint_private_vars)).glFragColor};
   return tint_symbol_4;
 }
 
-fragment tint_symbol_3 tint_symbol(texture2d<float, access::sample> tint_symbol_36 [[texture(0)]], sampler tint_symbol_37 [[sampler(0)]], const constant LeftOver_tint_packed_vec3* tint_symbol_38 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_39 [[texture(1)]], sampler tint_symbol_40 [[sampler(1)]], const constant Light0_tint_packed_vec3* tint_symbol_41 [[buffer(1)]], bool gl_FrontFacing_param [[front_facing]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
-  thread float2 tint_symbol_31 = 0.0f;
-  thread float4 tint_symbol_32 = 0.0f;
-  thread bool tint_symbol_33 = false;
-  thread float2 tint_symbol_34 = 0.0f;
-  thread float4 tint_symbol_35 = 0.0f;
-  thread float4 tint_symbol_42 = 0.0f;
-  main_out const inner_result = tint_symbol_inner(tint_symbol_1.vMainuv_param, tint_symbol_1.v_output1_param, gl_FrontFacing_param, tint_symbol_1.v_uv_param, tint_symbol_1.v_output2_param, &(tint_symbol_31), &(tint_symbol_32), &(tint_symbol_33), &(tint_symbol_34), &(tint_symbol_35), tint_symbol_36, tint_symbol_37, tint_symbol_38, tint_symbol_39, tint_symbol_40, tint_symbol_41, &(tint_symbol_42));
+fragment tint_symbol_3 tint_symbol(texture2d<float, access::sample> tint_symbol_17 [[texture(0)]], sampler tint_symbol_18 [[sampler(0)]], const constant LeftOver_tint_packed_vec3* tint_symbol_19 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_20 [[texture(1)]], sampler tint_symbol_21 [[sampler(1)]], const constant Light0_tint_packed_vec3* tint_symbol_22 [[buffer(1)]], bool gl_FrontFacing_param [[front_facing]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_out const inner_result = tint_symbol_inner(tint_symbol_1.vMainuv_param, tint_symbol_1.v_output1_param, gl_FrontFacing_param, tint_symbol_1.v_uv_param, tint_symbol_1.v_output2_param, &(tint_private_vars), tint_symbol_17, tint_symbol_18, tint_symbol_19, tint_symbol_20, tint_symbol_21, tint_symbol_22);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.glFragColor_1 = inner_result.glFragColor_1;
   return wrapper_result;
diff --git a/test/tint/bug/tint/977.spvasm.expected.msl b/test/tint/bug/tint/977.spvasm.expected.msl
index 83b2b6c..8ecff85 100644
--- a/test/tint/bug/tint/977.spvasm.expected.msl
+++ b/test/tint/bug/tint/977.spvasm.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint3 gl_GlobalInvocationID;
+};
+
 struct ResultMatrix {
   /* 0x0000 */ tint_array<float, 1> numbers;
 };
@@ -53,30 +57,30 @@
   return x_41;
 }
 
-void main_1(thread uint3* const tint_symbol_2, device ResultMatrix* const tint_symbol_3) {
+void main_1(thread tint_private_vars_struct* const tint_private_vars, device ResultMatrix* const tint_symbol_2) {
   int index = 0;
   int a_1 = 0;
   float param = 0.0f;
   float param_1 = 0.0f;
-  uint const x_54 = (*(tint_symbol_2))[0];
+  uint const x_54 = (*(tint_private_vars)).gl_GlobalInvocationID[0];
   index = as_type<int>(x_54);
   a_1 = -10;
   int const x_63 = index;
   param = -4.0f;
   param_1 = -3.0f;
   float const x_68 = binaryOperation_f1_f1_(&(param), &(param_1));
-  (*(tint_symbol_3)).numbers[x_63] = x_68;
+  (*(tint_symbol_2)).numbers[x_63] = x_68;
   return;
 }
 
-void tint_symbol_1_inner(uint3 gl_GlobalInvocationID_param, thread uint3* const tint_symbol_4, device ResultMatrix* const tint_symbol_5) {
-  *(tint_symbol_4) = gl_GlobalInvocationID_param;
-  main_1(tint_symbol_4, tint_symbol_5);
+void tint_symbol_1_inner(uint3 gl_GlobalInvocationID_param, thread tint_private_vars_struct* const tint_private_vars, device ResultMatrix* const tint_symbol_3) {
+  (*(tint_private_vars)).gl_GlobalInvocationID = gl_GlobalInvocationID_param;
+  main_1(tint_private_vars, tint_symbol_3);
 }
 
-kernel void tint_symbol_1(device ResultMatrix* tint_symbol_7 [[buffer(0)]], uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]]) {
-  thread uint3 tint_symbol_6 = 0u;
-  tint_symbol_1_inner(gl_GlobalInvocationID_param, &(tint_symbol_6), tint_symbol_7);
+kernel void tint_symbol_1(device ResultMatrix* tint_symbol_4 [[buffer(0)]], uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_symbol_1_inner(gl_GlobalInvocationID_param, &(tint_private_vars), tint_symbol_4);
   return;
 }
 
diff --git a/test/tint/bug/tint/998.wgsl.expected.msl b/test/tint/bug/tint/998.wgsl.expected.msl
index c9dd773..89d43d5 100644
--- a/test/tint/bug/tint/998.wgsl.expected.msl
+++ b/test/tint/bug/tint/998.wgsl.expected.msl
@@ -14,6 +14,14 @@
     T elements[N];
 };
 
+struct S {
+  tint_array<uint, 3> data;
+};
+
+struct tint_private_vars_struct {
+  S s;
+};
+
 struct Constants {
   /* 0x0000 */ uint zero;
 };
@@ -22,13 +30,9 @@
   uint value;
 };
 
-struct S {
-  tint_array<uint, 3> data;
-};
-
-kernel void tint_symbol(const constant Constants* tint_symbol_2 [[buffer(0)]]) {
-  thread S tint_symbol_1 = {};
-  tint_symbol_1.data[(*(tint_symbol_2)).zero] = 0u;
+kernel void tint_symbol(const constant Constants* tint_symbol_1 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.s.data[(*(tint_symbol_1)).zero] = 0u;
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl
index e7a3bfe..25c4b42 100644
--- a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 uint tint_div(uint lhs, uint rhs) {
   return (lhs / select(rhs, 1u, (rhs == 0u)));
 }
@@ -44,28 +48,28 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_2) {
-  uint const x_57 = *(tint_symbol_1);
-  compute_main_inner(x_57, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_1) {
+  uint const x_57 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_57, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_2) {
   for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) {
     uint const i = (idx_1 / 2u);
     uint const i_1 = (idx_1 % 2u);
     uint const i_2 = (idx_1 % 1u);
-    atomic_store_explicit(&((*(tint_symbol_3))[i][i_1][i_2]), 0u, memory_order_relaxed);
+    atomic_store_explicit(&((*(tint_symbol_2))[i][i_1][i_2]), 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3> tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3> tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/array/array.spvasm.expected.msl b/test/tint/builtins/atomicStore/array/array.spvasm.expected.msl
index a4eb243..196bf9c 100644
--- a/test/tint/builtins/atomicStore/array/array.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/array/array.spvasm.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void compute_main_inner(uint local_invocation_index_2, threadgroup tint_array<atomic_uint, 4>* const tint_symbol) {
   uint idx = 0u;
   idx = local_invocation_index_2;
@@ -34,26 +38,26 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array<atomic_uint, 4>* const tint_symbol_2) {
-  uint const x_47 = *(tint_symbol_1);
-  compute_main_inner(x_47, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<atomic_uint, 4>* const tint_symbol_1) {
+  uint const x_47 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_47, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array<atomic_uint, 4>* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<atomic_uint, 4>* const tint_symbol_2) {
   for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 4u); idx_1 = (idx_1 + 1u)) {
     uint const i = idx_1;
-    atomic_store_explicit(&((*(tint_symbol_3))[i]), 0u, memory_order_relaxed);
+    atomic_store_explicit(&((*(tint_symbol_2))[i]), 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup tint_array<atomic_uint, 4> tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup tint_array<atomic_uint, 4> tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl
index e7a3bfe..25c4b42 100644
--- a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 uint tint_div(uint lhs, uint rhs) {
   return (lhs / select(rhs, 1u, (rhs == 0u)));
 }
@@ -44,28 +48,28 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_2) {
-  uint const x_57 = *(tint_symbol_1);
-  compute_main_inner(x_57, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_1) {
+  uint const x_57 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_57, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3>* const tint_symbol_2) {
   for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) {
     uint const i = (idx_1 / 2u);
     uint const i_1 = (idx_1 % 2u);
     uint const i_2 = (idx_1 % 1u);
-    atomic_store_explicit(&((*(tint_symbol_3))[i][i_1][i_2]), 0u, memory_order_relaxed);
+    atomic_store_explicit(&((*(tint_symbol_2))[i][i_1][i_2]), 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3> tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup tint_array<tint_array<tint_array<atomic_uint, 1>, 2>, 3> tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl
index f9bac41..91a23ba 100644
--- a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct S_atomic {
   int x;
   atomic_uint a;
@@ -48,28 +52,28 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array<S_atomic, 10>* const tint_symbol_2) {
-  uint const x_53 = *(tint_symbol_1);
-  compute_main_inner(x_53, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<S_atomic, 10>* const tint_symbol_1) {
+  uint const x_53 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_53, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array<S_atomic, 10>* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup tint_array<S_atomic, 10>* const tint_symbol_2) {
   for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) {
     uint const i = idx_1;
-    (*(tint_symbol_3))[i].x = 0;
-    atomic_store_explicit(&((*(tint_symbol_3))[i].a), 0u, memory_order_relaxed);
-    (*(tint_symbol_3))[i].y = 0u;
+    (*(tint_symbol_2))[i].x = 0;
+    atomic_store_explicit(&((*(tint_symbol_2))[i].a), 0u, memory_order_relaxed);
+    (*(tint_symbol_2))[i].y = 0u;
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup tint_array<S_atomic, 10> tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup tint_array<S_atomic, 10> tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl
index 9ff385d..b109f31 100644
--- a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct S_atomic {
   int x;
   atomic_uint a;
@@ -23,27 +27,27 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) {
-  uint const x_39 = *(tint_symbol_1);
-  compute_main_inner(x_39, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_1) {
+  uint const x_39 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_39, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_2) {
   {
-    (*(tint_symbol_3)).x = 0;
-    atomic_store_explicit(&((*(tint_symbol_3)).a), 0u, memory_order_relaxed);
-    atomic_store_explicit(&((*(tint_symbol_3)).b), 0u, memory_order_relaxed);
+    (*(tint_symbol_2)).x = 0;
+    atomic_store_explicit(&((*(tint_symbol_2)).a), 0u, memory_order_relaxed);
+    atomic_store_explicit(&((*(tint_symbol_2)).b), 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup S_atomic tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup S_atomic tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl
index 7e1b7dc..49df29f 100644
--- a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct S_atomic {
   int x;
   atomic_uint a;
@@ -22,27 +26,27 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) {
-  uint const x_35 = *(tint_symbol_1);
-  compute_main_inner(x_35, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_1) {
+  uint const x_35 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_35, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_2) {
   {
-    (*(tint_symbol_3)).x = 0;
-    atomic_store_explicit(&((*(tint_symbol_3)).a), 0u, memory_order_relaxed);
-    (*(tint_symbol_3)).y = 0u;
+    (*(tint_symbol_2)).x = 0;
+    atomic_store_explicit(&((*(tint_symbol_2)).a), 0u, memory_order_relaxed);
+    (*(tint_symbol_2)).y = 0u;
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup S_atomic tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup S_atomic tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl
index 0e4963c..8eafbbb 100644
--- a/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct S0_atomic {
   int x;
   atomic_uint a;
@@ -59,34 +63,34 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup S2_atomic* const tint_symbol_2) {
-  uint const x_44 = *(tint_symbol_1);
-  compute_main_inner(x_44, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup S2_atomic* const tint_symbol_1) {
+  uint const x_44 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_44, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S2_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup S2_atomic* const tint_symbol_2) {
   {
-    (*(tint_symbol_3)).x = 0;
-    (*(tint_symbol_3)).y = 0;
-    (*(tint_symbol_3)).z = 0;
-    (*(tint_symbol_3)).a.x = 0;
-    (*(tint_symbol_3)).a.a.x = 0;
-    atomic_store_explicit(&((*(tint_symbol_3)).a.a.a), 0u, memory_order_relaxed);
-    (*(tint_symbol_3)).a.a.y = 0;
-    (*(tint_symbol_3)).a.a.z = 0;
-    (*(tint_symbol_3)).a.y = 0;
-    (*(tint_symbol_3)).a.z = 0;
+    (*(tint_symbol_2)).x = 0;
+    (*(tint_symbol_2)).y = 0;
+    (*(tint_symbol_2)).z = 0;
+    (*(tint_symbol_2)).a.x = 0;
+    (*(tint_symbol_2)).a.a.x = 0;
+    atomic_store_explicit(&((*(tint_symbol_2)).a.a.a), 0u, memory_order_relaxed);
+    (*(tint_symbol_2)).a.a.y = 0;
+    (*(tint_symbol_2)).a.a.z = 0;
+    (*(tint_symbol_2)).a.y = 0;
+    (*(tint_symbol_2)).a.z = 0;
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup S2_atomic tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup S2_atomic tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl
index fc28533..46020d9 100644
--- a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct S_atomic {
   int x;
   tint_array<atomic_uint, 10> a;
@@ -48,30 +52,30 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) {
-  uint const x_53 = *(tint_symbol_1);
-  compute_main_inner(x_53, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_1) {
+  uint const x_53 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_53, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_2) {
   {
-    (*(tint_symbol_3)).x = 0;
-    (*(tint_symbol_3)).y = 0u;
+    (*(tint_symbol_2)).x = 0;
+    (*(tint_symbol_2)).y = 0u;
   }
   for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) {
     uint const i = idx_1;
-    atomic_store_explicit(&((*(tint_symbol_3)).a[i]), 0u, memory_order_relaxed);
+    atomic_store_explicit(&((*(tint_symbol_2)).a[i]), 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup S_atomic tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup S_atomic tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl
index 7e1b7dc..49df29f 100644
--- a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl
+++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct S_atomic {
   int x;
   atomic_uint a;
@@ -22,27 +26,27 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) {
-  uint const x_35 = *(tint_symbol_1);
-  compute_main_inner(x_35, tint_symbol_2);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_1) {
+  uint const x_35 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_35, tint_symbol_1);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_2) {
   {
-    (*(tint_symbol_3)).x = 0;
-    atomic_store_explicit(&((*(tint_symbol_3)).a), 0u, memory_order_relaxed);
-    (*(tint_symbol_3)).y = 0u;
+    (*(tint_symbol_2)).x = 0;
+    atomic_store_explicit(&((*(tint_symbol_2)).a), 0u, memory_order_relaxed);
+    (*(tint_symbol_2)).y = 0u;
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_4) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_4, tint_symbol_3);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_2);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup S_atomic tint_symbol_5;
-  thread uint tint_symbol_6 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup S_atomic tint_symbol_3;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_3));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl
index 5f8945f..c5a0ca2 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_add_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl
index 6dab262..75573c2 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_add_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl
index af7eadc..0efeff8 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAnd_45a819(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_and_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl
index 2da6bbd..d871f2e 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAnd_34edd3(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_and_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl
index 25e9db3..136bec8 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl
@@ -12,6 +12,10 @@
   return {old_value, exchanged};
 }
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct x__atomic_compare_exchange_resulti32 {
   int old_value;
   bool exchanged;
@@ -34,25 +38,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_int* const tint_symbol_5) {
-  uint const x_36 = *(tint_symbol_4);
-  compute_main_inner(x_36, tint_symbol_5);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_4) {
+  uint const x_36 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_36, tint_symbol_4);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_6, thread uint* const tint_symbol_7) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_5) {
   {
-    atomic_store_explicit(tint_symbol_6, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_5, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_7) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_7, tint_symbol_6);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_5);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_8;
-  thread uint tint_symbol_9 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_6;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_6));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl
index 287ea41..a704ffa 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl
@@ -12,6 +12,10 @@
   return {old_value, exchanged};
 }
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct x__atomic_compare_exchange_resultu32 {
   uint old_value;
   bool exchanged;
@@ -34,25 +38,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_uint* const tint_symbol_5) {
-  uint const x_35 = *(tint_symbol_4);
-  compute_main_inner(x_35, tint_symbol_5);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_4) {
+  uint const x_35 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_35, tint_symbol_4);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_6, thread uint* const tint_symbol_7) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_5) {
   {
-    atomic_store_explicit(tint_symbol_6, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_5, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_7) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_7, tint_symbol_6);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_5);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_8;
-  thread uint tint_symbol_9 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_6;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_6));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl
index d0b8f90..7f59ed0 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicExchange_e114ba(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_exchange_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl
index b562965..41db18a 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicExchange_0a5dca(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_exchange_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl
index 3f9bc5f..7c43ef3 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicLoad_afcc03(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_load_explicit(tint_symbol, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl
index c9f5cd3..dcc1980 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicLoad_361bf1(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_load_explicit(tint_symbol, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_29 = *(tint_symbol_2);
-  compute_main_inner(x_29, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_29 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_29, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl
index c309d8b..12ba18d 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMax_a89cc3(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_max_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl
index 8519e90..b26d432 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMax_beccfc(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_max_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl
index f82688a..58bb34e 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMin_278235(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_min_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl
index d03bb77..8ddcfb5 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMin_69d383(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_min_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl
index 980a7d6..1307bc7 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicOr_d09248(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_or_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl
index 1111dc3..1fcc8d8 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicOr_5e3d61(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_or_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl
index fbccdc4..a816570 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicStore_8bea94(threadgroup atomic_int* const tint_symbol) {
   atomic_store_explicit(tint_symbol, 1, memory_order_relaxed);
   return;
@@ -13,25 +17,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_29 = *(tint_symbol_2);
-  compute_main_inner(x_29, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_29 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_29, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl
index 33849ed..9764bb4 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicStore_726882(threadgroup atomic_uint* const tint_symbol) {
   atomic_store_explicit(tint_symbol, 1u, memory_order_relaxed);
   return;
@@ -13,25 +17,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_28 = *(tint_symbol_2);
-  compute_main_inner(x_28, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_28 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_28, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl
index fcc7910..555921f 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicSub_77883a(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_sub_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl
index a166d08..6768b6c 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicSub_0d26c2(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_sub_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl
index 70c0e42..7643cf0 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicXor_75dc95(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_xor_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl
index 784f870..61ab423 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicXor_c8e6be(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_xor_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl
index 6e646d5..1ec7d77 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_sub_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl
index 39ec3fd..bb60527 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_sub_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl
index 5f8945f..c5a0ca2 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_fetch_add_explicit(tint_symbol, 1, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl
index 6dab262..75573c2 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_fetch_add_explicit(tint_symbol, 1u, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl
index 19c4023..c9f879a 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl
index 9664a87..bbf5519 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl
index a319bdb..c55ddd6 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAnd_45a819(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl
index e6c7e39..890c186 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAnd_34edd3(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl
index ce8a6a0..412c26a 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl
@@ -12,6 +12,10 @@
   return {old_value, exchanged};
 }
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct x__atomic_compare_exchange_resulti32 {
   int old_value;
   bool exchanged;
@@ -40,25 +44,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_int* const tint_symbol_5) {
-  uint const x_41 = *(tint_symbol_4);
-  compute_main_inner(x_41, tint_symbol_5);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_4) {
+  uint const x_41 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_41, tint_symbol_4);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_6, thread uint* const tint_symbol_7) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_5) {
   {
-    atomic_store_explicit(tint_symbol_6, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_5, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_7) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_7, tint_symbol_6);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_5);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_8;
-  thread uint tint_symbol_9 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_6;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_6));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl
index 4590197..7984286 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl
@@ -12,6 +12,10 @@
   return {old_value, exchanged};
 }
 
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 struct x__atomic_compare_exchange_resultu32 {
   uint old_value;
   bool exchanged;
@@ -40,25 +44,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_uint* const tint_symbol_5) {
-  uint const x_40 = *(tint_symbol_4);
-  compute_main_inner(x_40, tint_symbol_5);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_4) {
+  uint const x_40 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_40, tint_symbol_4);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_6, thread uint* const tint_symbol_7) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_5) {
   {
-    atomic_store_explicit(tint_symbol_6, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_5, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_7) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_7, tint_symbol_6);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_5);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_8;
-  thread uint tint_symbol_9 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_6;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_6));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl
index bfb645d..bb77abe 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicExchange_e114ba(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl
index d805421..9ef0ae7 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicExchange_0a5dca(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl
index 3f9bc5f..7c43ef3 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicLoad_afcc03(threadgroup atomic_int* const tint_symbol) {
   int res = 0;
   int const x_11 = atomic_load_explicit(tint_symbol, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_30 = *(tint_symbol_2);
-  compute_main_inner(x_30, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_30 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_30, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl
index c9f5cd3..dcc1980 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicLoad_361bf1(threadgroup atomic_uint* const tint_symbol) {
   uint res = 0u;
   uint const x_10 = atomic_load_explicit(tint_symbol, memory_order_relaxed);
@@ -15,25 +19,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_29 = *(tint_symbol_2);
-  compute_main_inner(x_29, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_29 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_29, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl
index b026733..03d2bd6 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMax_a89cc3(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl
index e8951d4..ad5a3b8 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMax_beccfc(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl
index ca77a67..fadd0ba 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMin_278235(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl
index 4731075..aab02e1 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicMin_69d383(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl
index 1f405c7..529a691 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicOr_d09248(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl
index 5079e80..9dc2681 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicOr_5e3d61(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl
index ba6fa5a..cdd8348 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicStore_8bea94(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   arg_1 = 1;
@@ -16,25 +20,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl
index 1c721e4..1fa8744 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicStore_726882(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   arg_1 = 1u;
@@ -16,25 +20,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_31 = *(tint_symbol_2);
-  compute_main_inner(x_31, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_31 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_31, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl
index 7eb4abe..82e4aaf 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicSub_77883a(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl
index 11750e7..f9ce87a 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicSub_0d26c2(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl
index 7578844..da22ea0 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicXor_75dc95(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl
index 6c75f1e..2401067 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicXor_c8e6be(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -18,25 +22,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl
index 6c220f4..192b51e 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -17,25 +21,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl
index ca9e8e5..2d6d7a5 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -17,25 +21,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl
index d5ea965..174577b 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) {
   int arg_1 = 0;
   int res = 0;
@@ -17,25 +21,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) {
-  uint const x_33 = *(tint_symbol_2);
-  compute_main_inner(x_33, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_2) {
+  uint const x_33 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_33, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_int tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_int tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl
index 02a71ee..837094e 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint local_invocation_index_1;
+};
+
 void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -17,25 +21,25 @@
   return;
 }
 
-void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
-  uint const x_32 = *(tint_symbol_2);
-  compute_main_inner(x_32, tint_symbol_3);
+void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
+  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
+  compute_main_inner(x_32, tint_symbol_2);
   return;
 }
 
-void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
+void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
   {
-    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
+    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  *(tint_symbol_5) = local_invocation_index_1_param;
-  compute_main_1(tint_symbol_5, tint_symbol_4);
+  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
+  compute_main_1(tint_private_vars, tint_symbol_3);
 }
 
 kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
-  threadgroup atomic_uint tint_symbol_6;
-  thread uint tint_symbol_7 = 0u;
-  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  threadgroup atomic_uint tint_symbol_4;
+  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
   return;
 }
 
diff --git a/test/tint/builtins/textureDimensions/depth_ms.spvasm.expected.msl b/test/tint/builtins/textureDimensions/depth_ms.spvasm.expected.msl
index 865461f..5d29ed5 100644
--- a/test/tint/builtins/textureDimensions/depth_ms.spvasm.expected.msl
+++ b/test/tint/builtins/textureDimensions/depth_ms.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 tint_symbol_1;
+};
+
 void textureDimensions_f60bdb(depth2d_ms<float, access::read> tint_symbol_5) {
   int2 res = int2(0);
   int2 const x_16 = int2(uint2(tint_symbol_5.get_width(), tint_symbol_5.get_height()));
@@ -8,14 +12,14 @@
   return;
 }
 
-void tint_symbol_2(float4 tint_symbol, thread float4* const tint_symbol_6) {
-  *(tint_symbol_6) = tint_symbol;
+void tint_symbol_2(float4 tint_symbol, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).tint_symbol_1 = tint_symbol;
   return;
 }
 
-void vertex_main_1(depth2d_ms<float, access::read> tint_symbol_7, thread float4* const tint_symbol_8) {
-  textureDimensions_f60bdb(tint_symbol_7);
-  tint_symbol_2(float4(0.0f), tint_symbol_8);
+void vertex_main_1(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_6) {
+  textureDimensions_f60bdb(tint_symbol_6);
+  tint_symbol_2(float4(0.0f), tint_private_vars);
   return;
 }
 
@@ -27,37 +31,38 @@
   float4 tint_symbol_1_1 [[position]];
 };
 
-vertex_main_out vertex_main_inner(depth2d_ms<float, access::read> tint_symbol_9, thread float4* const tint_symbol_10) {
-  vertex_main_1(tint_symbol_9, tint_symbol_10);
-  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=*(tint_symbol_10)};
+vertex_main_out vertex_main_inner(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_7) {
+  vertex_main_1(tint_private_vars, tint_symbol_7);
+  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=(*(tint_private_vars)).tint_symbol_1};
   return tint_symbol_4;
 }
 
-vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_11 [[texture(0)]]) {
-  thread float4 tint_symbol_12 = float4(0.0f);
-  vertex_main_out const inner_result = vertex_main_inner(tint_symbol_11, &(tint_symbol_12));
+vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_8 [[texture(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_symbol_1 = float4(0.0f);
+  vertex_main_out const inner_result = vertex_main_inner(&(tint_private_vars), tint_symbol_8);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.tint_symbol_1_1 = inner_result.tint_symbol_1_1;
   return wrapper_result;
 }
 
-void fragment_main_1(depth2d_ms<float, access::read> tint_symbol_13) {
-  textureDimensions_f60bdb(tint_symbol_13);
+void fragment_main_1(depth2d_ms<float, access::read> tint_symbol_9) {
+  textureDimensions_f60bdb(tint_symbol_9);
   return;
 }
 
-fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_14 [[texture(0)]]) {
-  fragment_main_1(tint_symbol_14);
+fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_10 [[texture(0)]]) {
+  fragment_main_1(tint_symbol_10);
   return;
 }
 
-void compute_main_1(depth2d_ms<float, access::read> tint_symbol_15) {
-  textureDimensions_f60bdb(tint_symbol_15);
+void compute_main_1(depth2d_ms<float, access::read> tint_symbol_11) {
+  textureDimensions_f60bdb(tint_symbol_11);
   return;
 }
 
-kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_16 [[texture(0)]]) {
-  compute_main_1(tint_symbol_16);
+kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_12 [[texture(0)]]) {
+  compute_main_1(tint_symbol_12);
   return;
 }
 
diff --git a/test/tint/builtins/textureLoad/depth_ms.spvasm.expected.msl b/test/tint/builtins/textureLoad/depth_ms.spvasm.expected.msl
index 4fdc4b6..b34e2dc 100644
--- a/test/tint/builtins/textureLoad/depth_ms.spvasm.expected.msl
+++ b/test/tint/builtins/textureLoad/depth_ms.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 tint_symbol_1;
+};
+
 void textureLoad_6273b1(depth2d_ms<float, access::read> tint_symbol_5) {
   float res = 0.0f;
   float4 const x_17 = float4(tint_symbol_5.read(uint2(int2(0)), 1), 0.0f, 0.0f, 0.0f);
@@ -8,14 +12,14 @@
   return;
 }
 
-void tint_symbol_2(float4 tint_symbol, thread float4* const tint_symbol_6) {
-  *(tint_symbol_6) = tint_symbol;
+void tint_symbol_2(float4 tint_symbol, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).tint_symbol_1 = tint_symbol;
   return;
 }
 
-void vertex_main_1(depth2d_ms<float, access::read> tint_symbol_7, thread float4* const tint_symbol_8) {
-  textureLoad_6273b1(tint_symbol_7);
-  tint_symbol_2(float4(0.0f), tint_symbol_8);
+void vertex_main_1(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_6) {
+  textureLoad_6273b1(tint_symbol_6);
+  tint_symbol_2(float4(0.0f), tint_private_vars);
   return;
 }
 
@@ -27,37 +31,38 @@
   float4 tint_symbol_1_1 [[position]];
 };
 
-vertex_main_out vertex_main_inner(depth2d_ms<float, access::read> tint_symbol_9, thread float4* const tint_symbol_10) {
-  vertex_main_1(tint_symbol_9, tint_symbol_10);
-  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=*(tint_symbol_10)};
+vertex_main_out vertex_main_inner(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_7) {
+  vertex_main_1(tint_private_vars, tint_symbol_7);
+  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=(*(tint_private_vars)).tint_symbol_1};
   return tint_symbol_4;
 }
 
-vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_11 [[texture(0)]]) {
-  thread float4 tint_symbol_12 = float4(0.0f);
-  vertex_main_out const inner_result = vertex_main_inner(tint_symbol_11, &(tint_symbol_12));
+vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_8 [[texture(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_symbol_1 = float4(0.0f);
+  vertex_main_out const inner_result = vertex_main_inner(&(tint_private_vars), tint_symbol_8);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.tint_symbol_1_1 = inner_result.tint_symbol_1_1;
   return wrapper_result;
 }
 
-void fragment_main_1(depth2d_ms<float, access::read> tint_symbol_13) {
-  textureLoad_6273b1(tint_symbol_13);
+void fragment_main_1(depth2d_ms<float, access::read> tint_symbol_9) {
+  textureLoad_6273b1(tint_symbol_9);
   return;
 }
 
-fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_14 [[texture(0)]]) {
-  fragment_main_1(tint_symbol_14);
+fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_10 [[texture(0)]]) {
+  fragment_main_1(tint_symbol_10);
   return;
 }
 
-void compute_main_1(depth2d_ms<float, access::read> tint_symbol_15) {
-  textureLoad_6273b1(tint_symbol_15);
+void compute_main_1(depth2d_ms<float, access::read> tint_symbol_11) {
+  textureLoad_6273b1(tint_symbol_11);
   return;
 }
 
-kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_16 [[texture(0)]]) {
-  compute_main_1(tint_symbol_16);
+kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_12 [[texture(0)]]) {
+  compute_main_1(tint_symbol_12);
   return;
 }
 
diff --git a/test/tint/builtins/textureNumSamples/depth_ms.spvasm.expected.msl b/test/tint/builtins/textureNumSamples/depth_ms.spvasm.expected.msl
index cd3bb3b..0b23556 100644
--- a/test/tint/builtins/textureNumSamples/depth_ms.spvasm.expected.msl
+++ b/test/tint/builtins/textureNumSamples/depth_ms.spvasm.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 tint_symbol_1;
+};
+
 void textureNumSamples_a3c8a0(depth2d_ms<float, access::read> tint_symbol_5) {
   int res = 0;
   int const x_16 = int(tint_symbol_5.get_num_samples());
@@ -8,14 +12,14 @@
   return;
 }
 
-void tint_symbol_2(float4 tint_symbol, thread float4* const tint_symbol_6) {
-  *(tint_symbol_6) = tint_symbol;
+void tint_symbol_2(float4 tint_symbol, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).tint_symbol_1 = tint_symbol;
   return;
 }
 
-void vertex_main_1(depth2d_ms<float, access::read> tint_symbol_7, thread float4* const tint_symbol_8) {
-  textureNumSamples_a3c8a0(tint_symbol_7);
-  tint_symbol_2(float4(0.0f), tint_symbol_8);
+void vertex_main_1(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_6) {
+  textureNumSamples_a3c8a0(tint_symbol_6);
+  tint_symbol_2(float4(0.0f), tint_private_vars);
   return;
 }
 
@@ -27,37 +31,38 @@
   float4 tint_symbol_1_1 [[position]];
 };
 
-vertex_main_out vertex_main_inner(depth2d_ms<float, access::read> tint_symbol_9, thread float4* const tint_symbol_10) {
-  vertex_main_1(tint_symbol_9, tint_symbol_10);
-  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=*(tint_symbol_10)};
+vertex_main_out vertex_main_inner(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_7) {
+  vertex_main_1(tint_private_vars, tint_symbol_7);
+  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=(*(tint_private_vars)).tint_symbol_1};
   return tint_symbol_4;
 }
 
-vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_11 [[texture(0)]]) {
-  thread float4 tint_symbol_12 = float4(0.0f);
-  vertex_main_out const inner_result = vertex_main_inner(tint_symbol_11, &(tint_symbol_12));
+vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_8 [[texture(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_symbol_1 = float4(0.0f);
+  vertex_main_out const inner_result = vertex_main_inner(&(tint_private_vars), tint_symbol_8);
   tint_symbol_3 wrapper_result = {};
   wrapper_result.tint_symbol_1_1 = inner_result.tint_symbol_1_1;
   return wrapper_result;
 }
 
-void fragment_main_1(depth2d_ms<float, access::read> tint_symbol_13) {
-  textureNumSamples_a3c8a0(tint_symbol_13);
+void fragment_main_1(depth2d_ms<float, access::read> tint_symbol_9) {
+  textureNumSamples_a3c8a0(tint_symbol_9);
   return;
 }
 
-fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_14 [[texture(0)]]) {
-  fragment_main_1(tint_symbol_14);
+fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_10 [[texture(0)]]) {
+  fragment_main_1(tint_symbol_10);
   return;
 }
 
-void compute_main_1(depth2d_ms<float, access::read> tint_symbol_15) {
-  textureNumSamples_a3c8a0(tint_symbol_15);
+void compute_main_1(depth2d_ms<float, access::read> tint_symbol_11) {
+  textureNumSamples_a3c8a0(tint_symbol_11);
   return;
 }
 
-kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_16 [[texture(0)]]) {
-  compute_main_1(tint_symbol_16);
+kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_12 [[texture(0)]]) {
+  compute_main_1(tint_symbol_12);
   return;
 }
 
diff --git a/test/tint/expressions/swizzle/read/vec3/f16.wgsl.expected.msl b/test/tint/expressions/swizzle/read/vec3/f16.wgsl.expected.msl
index 4650bf0..d2ff2a1 100644
--- a/test/tint/expressions/swizzle/read/vec3/f16.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/read/vec3/f16.wgsl.expected.msl
@@ -5,128 +5,131 @@
   half3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  half3 v = tint_symbol.v;
-  half x = tint_symbol.v[0];
-  half y = tint_symbol.v[1];
-  half z = tint_symbol.v[2];
-  half2 xx = tint_symbol.v.xx;
-  half2 xy = tint_symbol.v.xy;
-  half2 xz = tint_symbol.v.xz;
-  half2 yx = tint_symbol.v.yx;
-  half2 yy = tint_symbol.v.yy;
-  half2 yz = tint_symbol.v.yz;
-  half2 zx = tint_symbol.v.zx;
-  half2 zy = tint_symbol.v.zy;
-  half2 zz = tint_symbol.v.zz;
-  half3 xxx = tint_symbol.v.xxx;
-  half3 xxy = tint_symbol.v.xxy;
-  half3 xxz = tint_symbol.v.xxz;
-  half3 xyx = tint_symbol.v.xyx;
-  half3 xyy = tint_symbol.v.xyy;
-  half3 xyz = tint_symbol.v.xyz;
-  half3 xzx = tint_symbol.v.xzx;
-  half3 xzy = tint_symbol.v.xzy;
-  half3 xzz = tint_symbol.v.xzz;
-  half3 yxx = tint_symbol.v.yxx;
-  half3 yxy = tint_symbol.v.yxy;
-  half3 yxz = tint_symbol.v.yxz;
-  half3 yyx = tint_symbol.v.yyx;
-  half3 yyy = tint_symbol.v.yyy;
-  half3 yyz = tint_symbol.v.yyz;
-  half3 yzx = tint_symbol.v.yzx;
-  half3 yzy = tint_symbol.v.yzy;
-  half3 yzz = tint_symbol.v.yzz;
-  half3 zxx = tint_symbol.v.zxx;
-  half3 zxy = tint_symbol.v.zxy;
-  half3 zxz = tint_symbol.v.zxz;
-  half3 zyx = tint_symbol.v.zyx;
-  half3 zyy = tint_symbol.v.zyy;
-  half3 zyz = tint_symbol.v.zyz;
-  half3 zzx = tint_symbol.v.zzx;
-  half3 zzy = tint_symbol.v.zzy;
-  half3 zzz = tint_symbol.v.zzz;
-  half4 xxxx = tint_symbol.v.xxxx;
-  half4 xxxy = tint_symbol.v.xxxy;
-  half4 xxxz = tint_symbol.v.xxxz;
-  half4 xxyx = tint_symbol.v.xxyx;
-  half4 xxyy = tint_symbol.v.xxyy;
-  half4 xxyz = tint_symbol.v.xxyz;
-  half4 xxzx = tint_symbol.v.xxzx;
-  half4 xxzy = tint_symbol.v.xxzy;
-  half4 xxzz = tint_symbol.v.xxzz;
-  half4 xyxx = tint_symbol.v.xyxx;
-  half4 xyxy = tint_symbol.v.xyxy;
-  half4 xyxz = tint_symbol.v.xyxz;
-  half4 xyyx = tint_symbol.v.xyyx;
-  half4 xyyy = tint_symbol.v.xyyy;
-  half4 xyyz = tint_symbol.v.xyyz;
-  half4 xyzx = tint_symbol.v.xyzx;
-  half4 xyzy = tint_symbol.v.xyzy;
-  half4 xyzz = tint_symbol.v.xyzz;
-  half4 xzxx = tint_symbol.v.xzxx;
-  half4 xzxy = tint_symbol.v.xzxy;
-  half4 xzxz = tint_symbol.v.xzxz;
-  half4 xzyx = tint_symbol.v.xzyx;
-  half4 xzyy = tint_symbol.v.xzyy;
-  half4 xzyz = tint_symbol.v.xzyz;
-  half4 xzzx = tint_symbol.v.xzzx;
-  half4 xzzy = tint_symbol.v.xzzy;
-  half4 xzzz = tint_symbol.v.xzzz;
-  half4 yxxx = tint_symbol.v.yxxx;
-  half4 yxxy = tint_symbol.v.yxxy;
-  half4 yxxz = tint_symbol.v.yxxz;
-  half4 yxyx = tint_symbol.v.yxyx;
-  half4 yxyy = tint_symbol.v.yxyy;
-  half4 yxyz = tint_symbol.v.yxyz;
-  half4 yxzx = tint_symbol.v.yxzx;
-  half4 yxzy = tint_symbol.v.yxzy;
-  half4 yxzz = tint_symbol.v.yxzz;
-  half4 yyxx = tint_symbol.v.yyxx;
-  half4 yyxy = tint_symbol.v.yyxy;
-  half4 yyxz = tint_symbol.v.yyxz;
-  half4 yyyx = tint_symbol.v.yyyx;
-  half4 yyyy = tint_symbol.v.yyyy;
-  half4 yyyz = tint_symbol.v.yyyz;
-  half4 yyzx = tint_symbol.v.yyzx;
-  half4 yyzy = tint_symbol.v.yyzy;
-  half4 yyzz = tint_symbol.v.yyzz;
-  half4 yzxx = tint_symbol.v.yzxx;
-  half4 yzxy = tint_symbol.v.yzxy;
-  half4 yzxz = tint_symbol.v.yzxz;
-  half4 yzyx = tint_symbol.v.yzyx;
-  half4 yzyy = tint_symbol.v.yzyy;
-  half4 yzyz = tint_symbol.v.yzyz;
-  half4 yzzx = tint_symbol.v.yzzx;
-  half4 yzzy = tint_symbol.v.yzzy;
-  half4 yzzz = tint_symbol.v.yzzz;
-  half4 zxxx = tint_symbol.v.zxxx;
-  half4 zxxy = tint_symbol.v.zxxy;
-  half4 zxxz = tint_symbol.v.zxxz;
-  half4 zxyx = tint_symbol.v.zxyx;
-  half4 zxyy = tint_symbol.v.zxyy;
-  half4 zxyz = tint_symbol.v.zxyz;
-  half4 zxzx = tint_symbol.v.zxzx;
-  half4 zxzy = tint_symbol.v.zxzy;
-  half4 zxzz = tint_symbol.v.zxzz;
-  half4 zyxx = tint_symbol.v.zyxx;
-  half4 zyxy = tint_symbol.v.zyxy;
-  half4 zyxz = tint_symbol.v.zyxz;
-  half4 zyyx = tint_symbol.v.zyyx;
-  half4 zyyy = tint_symbol.v.zyyy;
-  half4 zyyz = tint_symbol.v.zyyz;
-  half4 zyzx = tint_symbol.v.zyzx;
-  half4 zyzy = tint_symbol.v.zyzy;
-  half4 zyzz = tint_symbol.v.zyzz;
-  half4 zzxx = tint_symbol.v.zzxx;
-  half4 zzxy = tint_symbol.v.zzxy;
-  half4 zzxz = tint_symbol.v.zzxz;
-  half4 zzyx = tint_symbol.v.zzyx;
-  half4 zzyy = tint_symbol.v.zzyy;
-  half4 zzyz = tint_symbol.v.zzyz;
-  half4 zzzx = tint_symbol.v.zzzx;
-  half4 zzzy = tint_symbol.v.zzzy;
-  half4 zzzz = tint_symbol.v.zzzz;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 v = (*(tint_private_vars)).P.v;
+  half x = (*(tint_private_vars)).P.v[0];
+  half y = (*(tint_private_vars)).P.v[1];
+  half z = (*(tint_private_vars)).P.v[2];
+  half2 xx = (*(tint_private_vars)).P.v.xx;
+  half2 xy = (*(tint_private_vars)).P.v.xy;
+  half2 xz = (*(tint_private_vars)).P.v.xz;
+  half2 yx = (*(tint_private_vars)).P.v.yx;
+  half2 yy = (*(tint_private_vars)).P.v.yy;
+  half2 yz = (*(tint_private_vars)).P.v.yz;
+  half2 zx = (*(tint_private_vars)).P.v.zx;
+  half2 zy = (*(tint_private_vars)).P.v.zy;
+  half2 zz = (*(tint_private_vars)).P.v.zz;
+  half3 xxx = (*(tint_private_vars)).P.v.xxx;
+  half3 xxy = (*(tint_private_vars)).P.v.xxy;
+  half3 xxz = (*(tint_private_vars)).P.v.xxz;
+  half3 xyx = (*(tint_private_vars)).P.v.xyx;
+  half3 xyy = (*(tint_private_vars)).P.v.xyy;
+  half3 xyz = (*(tint_private_vars)).P.v.xyz;
+  half3 xzx = (*(tint_private_vars)).P.v.xzx;
+  half3 xzy = (*(tint_private_vars)).P.v.xzy;
+  half3 xzz = (*(tint_private_vars)).P.v.xzz;
+  half3 yxx = (*(tint_private_vars)).P.v.yxx;
+  half3 yxy = (*(tint_private_vars)).P.v.yxy;
+  half3 yxz = (*(tint_private_vars)).P.v.yxz;
+  half3 yyx = (*(tint_private_vars)).P.v.yyx;
+  half3 yyy = (*(tint_private_vars)).P.v.yyy;
+  half3 yyz = (*(tint_private_vars)).P.v.yyz;
+  half3 yzx = (*(tint_private_vars)).P.v.yzx;
+  half3 yzy = (*(tint_private_vars)).P.v.yzy;
+  half3 yzz = (*(tint_private_vars)).P.v.yzz;
+  half3 zxx = (*(tint_private_vars)).P.v.zxx;
+  half3 zxy = (*(tint_private_vars)).P.v.zxy;
+  half3 zxz = (*(tint_private_vars)).P.v.zxz;
+  half3 zyx = (*(tint_private_vars)).P.v.zyx;
+  half3 zyy = (*(tint_private_vars)).P.v.zyy;
+  half3 zyz = (*(tint_private_vars)).P.v.zyz;
+  half3 zzx = (*(tint_private_vars)).P.v.zzx;
+  half3 zzy = (*(tint_private_vars)).P.v.zzy;
+  half3 zzz = (*(tint_private_vars)).P.v.zzz;
+  half4 xxxx = (*(tint_private_vars)).P.v.xxxx;
+  half4 xxxy = (*(tint_private_vars)).P.v.xxxy;
+  half4 xxxz = (*(tint_private_vars)).P.v.xxxz;
+  half4 xxyx = (*(tint_private_vars)).P.v.xxyx;
+  half4 xxyy = (*(tint_private_vars)).P.v.xxyy;
+  half4 xxyz = (*(tint_private_vars)).P.v.xxyz;
+  half4 xxzx = (*(tint_private_vars)).P.v.xxzx;
+  half4 xxzy = (*(tint_private_vars)).P.v.xxzy;
+  half4 xxzz = (*(tint_private_vars)).P.v.xxzz;
+  half4 xyxx = (*(tint_private_vars)).P.v.xyxx;
+  half4 xyxy = (*(tint_private_vars)).P.v.xyxy;
+  half4 xyxz = (*(tint_private_vars)).P.v.xyxz;
+  half4 xyyx = (*(tint_private_vars)).P.v.xyyx;
+  half4 xyyy = (*(tint_private_vars)).P.v.xyyy;
+  half4 xyyz = (*(tint_private_vars)).P.v.xyyz;
+  half4 xyzx = (*(tint_private_vars)).P.v.xyzx;
+  half4 xyzy = (*(tint_private_vars)).P.v.xyzy;
+  half4 xyzz = (*(tint_private_vars)).P.v.xyzz;
+  half4 xzxx = (*(tint_private_vars)).P.v.xzxx;
+  half4 xzxy = (*(tint_private_vars)).P.v.xzxy;
+  half4 xzxz = (*(tint_private_vars)).P.v.xzxz;
+  half4 xzyx = (*(tint_private_vars)).P.v.xzyx;
+  half4 xzyy = (*(tint_private_vars)).P.v.xzyy;
+  half4 xzyz = (*(tint_private_vars)).P.v.xzyz;
+  half4 xzzx = (*(tint_private_vars)).P.v.xzzx;
+  half4 xzzy = (*(tint_private_vars)).P.v.xzzy;
+  half4 xzzz = (*(tint_private_vars)).P.v.xzzz;
+  half4 yxxx = (*(tint_private_vars)).P.v.yxxx;
+  half4 yxxy = (*(tint_private_vars)).P.v.yxxy;
+  half4 yxxz = (*(tint_private_vars)).P.v.yxxz;
+  half4 yxyx = (*(tint_private_vars)).P.v.yxyx;
+  half4 yxyy = (*(tint_private_vars)).P.v.yxyy;
+  half4 yxyz = (*(tint_private_vars)).P.v.yxyz;
+  half4 yxzx = (*(tint_private_vars)).P.v.yxzx;
+  half4 yxzy = (*(tint_private_vars)).P.v.yxzy;
+  half4 yxzz = (*(tint_private_vars)).P.v.yxzz;
+  half4 yyxx = (*(tint_private_vars)).P.v.yyxx;
+  half4 yyxy = (*(tint_private_vars)).P.v.yyxy;
+  half4 yyxz = (*(tint_private_vars)).P.v.yyxz;
+  half4 yyyx = (*(tint_private_vars)).P.v.yyyx;
+  half4 yyyy = (*(tint_private_vars)).P.v.yyyy;
+  half4 yyyz = (*(tint_private_vars)).P.v.yyyz;
+  half4 yyzx = (*(tint_private_vars)).P.v.yyzx;
+  half4 yyzy = (*(tint_private_vars)).P.v.yyzy;
+  half4 yyzz = (*(tint_private_vars)).P.v.yyzz;
+  half4 yzxx = (*(tint_private_vars)).P.v.yzxx;
+  half4 yzxy = (*(tint_private_vars)).P.v.yzxy;
+  half4 yzxz = (*(tint_private_vars)).P.v.yzxz;
+  half4 yzyx = (*(tint_private_vars)).P.v.yzyx;
+  half4 yzyy = (*(tint_private_vars)).P.v.yzyy;
+  half4 yzyz = (*(tint_private_vars)).P.v.yzyz;
+  half4 yzzx = (*(tint_private_vars)).P.v.yzzx;
+  half4 yzzy = (*(tint_private_vars)).P.v.yzzy;
+  half4 yzzz = (*(tint_private_vars)).P.v.yzzz;
+  half4 zxxx = (*(tint_private_vars)).P.v.zxxx;
+  half4 zxxy = (*(tint_private_vars)).P.v.zxxy;
+  half4 zxxz = (*(tint_private_vars)).P.v.zxxz;
+  half4 zxyx = (*(tint_private_vars)).P.v.zxyx;
+  half4 zxyy = (*(tint_private_vars)).P.v.zxyy;
+  half4 zxyz = (*(tint_private_vars)).P.v.zxyz;
+  half4 zxzx = (*(tint_private_vars)).P.v.zxzx;
+  half4 zxzy = (*(tint_private_vars)).P.v.zxzy;
+  half4 zxzz = (*(tint_private_vars)).P.v.zxzz;
+  half4 zyxx = (*(tint_private_vars)).P.v.zyxx;
+  half4 zyxy = (*(tint_private_vars)).P.v.zyxy;
+  half4 zyxz = (*(tint_private_vars)).P.v.zyxz;
+  half4 zyyx = (*(tint_private_vars)).P.v.zyyx;
+  half4 zyyy = (*(tint_private_vars)).P.v.zyyy;
+  half4 zyyz = (*(tint_private_vars)).P.v.zyyz;
+  half4 zyzx = (*(tint_private_vars)).P.v.zyzx;
+  half4 zyzy = (*(tint_private_vars)).P.v.zyzy;
+  half4 zyzz = (*(tint_private_vars)).P.v.zyzz;
+  half4 zzxx = (*(tint_private_vars)).P.v.zzxx;
+  half4 zzxy = (*(tint_private_vars)).P.v.zzxy;
+  half4 zzxz = (*(tint_private_vars)).P.v.zzxz;
+  half4 zzyx = (*(tint_private_vars)).P.v.zzyx;
+  half4 zzyy = (*(tint_private_vars)).P.v.zzyy;
+  half4 zzyz = (*(tint_private_vars)).P.v.zzyz;
+  half4 zzzx = (*(tint_private_vars)).P.v.zzzx;
+  half4 zzzy = (*(tint_private_vars)).P.v.zzzy;
+  half4 zzzz = (*(tint_private_vars)).P.v.zzzz;
 }
 
diff --git a/test/tint/expressions/swizzle/read/vec3/f32.wgsl.expected.msl b/test/tint/expressions/swizzle/read/vec3/f32.wgsl.expected.msl
index eda312d..0d86f0d 100644
--- a/test/tint/expressions/swizzle/read/vec3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/read/vec3/f32.wgsl.expected.msl
@@ -5,128 +5,131 @@
   float3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  float3 v = tint_symbol.v;
-  float x = tint_symbol.v[0];
-  float y = tint_symbol.v[1];
-  float z = tint_symbol.v[2];
-  float2 xx = tint_symbol.v.xx;
-  float2 xy = tint_symbol.v.xy;
-  float2 xz = tint_symbol.v.xz;
-  float2 yx = tint_symbol.v.yx;
-  float2 yy = tint_symbol.v.yy;
-  float2 yz = tint_symbol.v.yz;
-  float2 zx = tint_symbol.v.zx;
-  float2 zy = tint_symbol.v.zy;
-  float2 zz = tint_symbol.v.zz;
-  float3 xxx = tint_symbol.v.xxx;
-  float3 xxy = tint_symbol.v.xxy;
-  float3 xxz = tint_symbol.v.xxz;
-  float3 xyx = tint_symbol.v.xyx;
-  float3 xyy = tint_symbol.v.xyy;
-  float3 xyz = tint_symbol.v.xyz;
-  float3 xzx = tint_symbol.v.xzx;
-  float3 xzy = tint_symbol.v.xzy;
-  float3 xzz = tint_symbol.v.xzz;
-  float3 yxx = tint_symbol.v.yxx;
-  float3 yxy = tint_symbol.v.yxy;
-  float3 yxz = tint_symbol.v.yxz;
-  float3 yyx = tint_symbol.v.yyx;
-  float3 yyy = tint_symbol.v.yyy;
-  float3 yyz = tint_symbol.v.yyz;
-  float3 yzx = tint_symbol.v.yzx;
-  float3 yzy = tint_symbol.v.yzy;
-  float3 yzz = tint_symbol.v.yzz;
-  float3 zxx = tint_symbol.v.zxx;
-  float3 zxy = tint_symbol.v.zxy;
-  float3 zxz = tint_symbol.v.zxz;
-  float3 zyx = tint_symbol.v.zyx;
-  float3 zyy = tint_symbol.v.zyy;
-  float3 zyz = tint_symbol.v.zyz;
-  float3 zzx = tint_symbol.v.zzx;
-  float3 zzy = tint_symbol.v.zzy;
-  float3 zzz = tint_symbol.v.zzz;
-  float4 xxxx = tint_symbol.v.xxxx;
-  float4 xxxy = tint_symbol.v.xxxy;
-  float4 xxxz = tint_symbol.v.xxxz;
-  float4 xxyx = tint_symbol.v.xxyx;
-  float4 xxyy = tint_symbol.v.xxyy;
-  float4 xxyz = tint_symbol.v.xxyz;
-  float4 xxzx = tint_symbol.v.xxzx;
-  float4 xxzy = tint_symbol.v.xxzy;
-  float4 xxzz = tint_symbol.v.xxzz;
-  float4 xyxx = tint_symbol.v.xyxx;
-  float4 xyxy = tint_symbol.v.xyxy;
-  float4 xyxz = tint_symbol.v.xyxz;
-  float4 xyyx = tint_symbol.v.xyyx;
-  float4 xyyy = tint_symbol.v.xyyy;
-  float4 xyyz = tint_symbol.v.xyyz;
-  float4 xyzx = tint_symbol.v.xyzx;
-  float4 xyzy = tint_symbol.v.xyzy;
-  float4 xyzz = tint_symbol.v.xyzz;
-  float4 xzxx = tint_symbol.v.xzxx;
-  float4 xzxy = tint_symbol.v.xzxy;
-  float4 xzxz = tint_symbol.v.xzxz;
-  float4 xzyx = tint_symbol.v.xzyx;
-  float4 xzyy = tint_symbol.v.xzyy;
-  float4 xzyz = tint_symbol.v.xzyz;
-  float4 xzzx = tint_symbol.v.xzzx;
-  float4 xzzy = tint_symbol.v.xzzy;
-  float4 xzzz = tint_symbol.v.xzzz;
-  float4 yxxx = tint_symbol.v.yxxx;
-  float4 yxxy = tint_symbol.v.yxxy;
-  float4 yxxz = tint_symbol.v.yxxz;
-  float4 yxyx = tint_symbol.v.yxyx;
-  float4 yxyy = tint_symbol.v.yxyy;
-  float4 yxyz = tint_symbol.v.yxyz;
-  float4 yxzx = tint_symbol.v.yxzx;
-  float4 yxzy = tint_symbol.v.yxzy;
-  float4 yxzz = tint_symbol.v.yxzz;
-  float4 yyxx = tint_symbol.v.yyxx;
-  float4 yyxy = tint_symbol.v.yyxy;
-  float4 yyxz = tint_symbol.v.yyxz;
-  float4 yyyx = tint_symbol.v.yyyx;
-  float4 yyyy = tint_symbol.v.yyyy;
-  float4 yyyz = tint_symbol.v.yyyz;
-  float4 yyzx = tint_symbol.v.yyzx;
-  float4 yyzy = tint_symbol.v.yyzy;
-  float4 yyzz = tint_symbol.v.yyzz;
-  float4 yzxx = tint_symbol.v.yzxx;
-  float4 yzxy = tint_symbol.v.yzxy;
-  float4 yzxz = tint_symbol.v.yzxz;
-  float4 yzyx = tint_symbol.v.yzyx;
-  float4 yzyy = tint_symbol.v.yzyy;
-  float4 yzyz = tint_symbol.v.yzyz;
-  float4 yzzx = tint_symbol.v.yzzx;
-  float4 yzzy = tint_symbol.v.yzzy;
-  float4 yzzz = tint_symbol.v.yzzz;
-  float4 zxxx = tint_symbol.v.zxxx;
-  float4 zxxy = tint_symbol.v.zxxy;
-  float4 zxxz = tint_symbol.v.zxxz;
-  float4 zxyx = tint_symbol.v.zxyx;
-  float4 zxyy = tint_symbol.v.zxyy;
-  float4 zxyz = tint_symbol.v.zxyz;
-  float4 zxzx = tint_symbol.v.zxzx;
-  float4 zxzy = tint_symbol.v.zxzy;
-  float4 zxzz = tint_symbol.v.zxzz;
-  float4 zyxx = tint_symbol.v.zyxx;
-  float4 zyxy = tint_symbol.v.zyxy;
-  float4 zyxz = tint_symbol.v.zyxz;
-  float4 zyyx = tint_symbol.v.zyyx;
-  float4 zyyy = tint_symbol.v.zyyy;
-  float4 zyyz = tint_symbol.v.zyyz;
-  float4 zyzx = tint_symbol.v.zyzx;
-  float4 zyzy = tint_symbol.v.zyzy;
-  float4 zyzz = tint_symbol.v.zyzz;
-  float4 zzxx = tint_symbol.v.zzxx;
-  float4 zzxy = tint_symbol.v.zzxy;
-  float4 zzxz = tint_symbol.v.zzxz;
-  float4 zzyx = tint_symbol.v.zzyx;
-  float4 zzyy = tint_symbol.v.zzyy;
-  float4 zzyz = tint_symbol.v.zzyz;
-  float4 zzzx = tint_symbol.v.zzzx;
-  float4 zzzy = tint_symbol.v.zzzy;
-  float4 zzzz = tint_symbol.v.zzzz;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 v = (*(tint_private_vars)).P.v;
+  float x = (*(tint_private_vars)).P.v[0];
+  float y = (*(tint_private_vars)).P.v[1];
+  float z = (*(tint_private_vars)).P.v[2];
+  float2 xx = (*(tint_private_vars)).P.v.xx;
+  float2 xy = (*(tint_private_vars)).P.v.xy;
+  float2 xz = (*(tint_private_vars)).P.v.xz;
+  float2 yx = (*(tint_private_vars)).P.v.yx;
+  float2 yy = (*(tint_private_vars)).P.v.yy;
+  float2 yz = (*(tint_private_vars)).P.v.yz;
+  float2 zx = (*(tint_private_vars)).P.v.zx;
+  float2 zy = (*(tint_private_vars)).P.v.zy;
+  float2 zz = (*(tint_private_vars)).P.v.zz;
+  float3 xxx = (*(tint_private_vars)).P.v.xxx;
+  float3 xxy = (*(tint_private_vars)).P.v.xxy;
+  float3 xxz = (*(tint_private_vars)).P.v.xxz;
+  float3 xyx = (*(tint_private_vars)).P.v.xyx;
+  float3 xyy = (*(tint_private_vars)).P.v.xyy;
+  float3 xyz = (*(tint_private_vars)).P.v.xyz;
+  float3 xzx = (*(tint_private_vars)).P.v.xzx;
+  float3 xzy = (*(tint_private_vars)).P.v.xzy;
+  float3 xzz = (*(tint_private_vars)).P.v.xzz;
+  float3 yxx = (*(tint_private_vars)).P.v.yxx;
+  float3 yxy = (*(tint_private_vars)).P.v.yxy;
+  float3 yxz = (*(tint_private_vars)).P.v.yxz;
+  float3 yyx = (*(tint_private_vars)).P.v.yyx;
+  float3 yyy = (*(tint_private_vars)).P.v.yyy;
+  float3 yyz = (*(tint_private_vars)).P.v.yyz;
+  float3 yzx = (*(tint_private_vars)).P.v.yzx;
+  float3 yzy = (*(tint_private_vars)).P.v.yzy;
+  float3 yzz = (*(tint_private_vars)).P.v.yzz;
+  float3 zxx = (*(tint_private_vars)).P.v.zxx;
+  float3 zxy = (*(tint_private_vars)).P.v.zxy;
+  float3 zxz = (*(tint_private_vars)).P.v.zxz;
+  float3 zyx = (*(tint_private_vars)).P.v.zyx;
+  float3 zyy = (*(tint_private_vars)).P.v.zyy;
+  float3 zyz = (*(tint_private_vars)).P.v.zyz;
+  float3 zzx = (*(tint_private_vars)).P.v.zzx;
+  float3 zzy = (*(tint_private_vars)).P.v.zzy;
+  float3 zzz = (*(tint_private_vars)).P.v.zzz;
+  float4 xxxx = (*(tint_private_vars)).P.v.xxxx;
+  float4 xxxy = (*(tint_private_vars)).P.v.xxxy;
+  float4 xxxz = (*(tint_private_vars)).P.v.xxxz;
+  float4 xxyx = (*(tint_private_vars)).P.v.xxyx;
+  float4 xxyy = (*(tint_private_vars)).P.v.xxyy;
+  float4 xxyz = (*(tint_private_vars)).P.v.xxyz;
+  float4 xxzx = (*(tint_private_vars)).P.v.xxzx;
+  float4 xxzy = (*(tint_private_vars)).P.v.xxzy;
+  float4 xxzz = (*(tint_private_vars)).P.v.xxzz;
+  float4 xyxx = (*(tint_private_vars)).P.v.xyxx;
+  float4 xyxy = (*(tint_private_vars)).P.v.xyxy;
+  float4 xyxz = (*(tint_private_vars)).P.v.xyxz;
+  float4 xyyx = (*(tint_private_vars)).P.v.xyyx;
+  float4 xyyy = (*(tint_private_vars)).P.v.xyyy;
+  float4 xyyz = (*(tint_private_vars)).P.v.xyyz;
+  float4 xyzx = (*(tint_private_vars)).P.v.xyzx;
+  float4 xyzy = (*(tint_private_vars)).P.v.xyzy;
+  float4 xyzz = (*(tint_private_vars)).P.v.xyzz;
+  float4 xzxx = (*(tint_private_vars)).P.v.xzxx;
+  float4 xzxy = (*(tint_private_vars)).P.v.xzxy;
+  float4 xzxz = (*(tint_private_vars)).P.v.xzxz;
+  float4 xzyx = (*(tint_private_vars)).P.v.xzyx;
+  float4 xzyy = (*(tint_private_vars)).P.v.xzyy;
+  float4 xzyz = (*(tint_private_vars)).P.v.xzyz;
+  float4 xzzx = (*(tint_private_vars)).P.v.xzzx;
+  float4 xzzy = (*(tint_private_vars)).P.v.xzzy;
+  float4 xzzz = (*(tint_private_vars)).P.v.xzzz;
+  float4 yxxx = (*(tint_private_vars)).P.v.yxxx;
+  float4 yxxy = (*(tint_private_vars)).P.v.yxxy;
+  float4 yxxz = (*(tint_private_vars)).P.v.yxxz;
+  float4 yxyx = (*(tint_private_vars)).P.v.yxyx;
+  float4 yxyy = (*(tint_private_vars)).P.v.yxyy;
+  float4 yxyz = (*(tint_private_vars)).P.v.yxyz;
+  float4 yxzx = (*(tint_private_vars)).P.v.yxzx;
+  float4 yxzy = (*(tint_private_vars)).P.v.yxzy;
+  float4 yxzz = (*(tint_private_vars)).P.v.yxzz;
+  float4 yyxx = (*(tint_private_vars)).P.v.yyxx;
+  float4 yyxy = (*(tint_private_vars)).P.v.yyxy;
+  float4 yyxz = (*(tint_private_vars)).P.v.yyxz;
+  float4 yyyx = (*(tint_private_vars)).P.v.yyyx;
+  float4 yyyy = (*(tint_private_vars)).P.v.yyyy;
+  float4 yyyz = (*(tint_private_vars)).P.v.yyyz;
+  float4 yyzx = (*(tint_private_vars)).P.v.yyzx;
+  float4 yyzy = (*(tint_private_vars)).P.v.yyzy;
+  float4 yyzz = (*(tint_private_vars)).P.v.yyzz;
+  float4 yzxx = (*(tint_private_vars)).P.v.yzxx;
+  float4 yzxy = (*(tint_private_vars)).P.v.yzxy;
+  float4 yzxz = (*(tint_private_vars)).P.v.yzxz;
+  float4 yzyx = (*(tint_private_vars)).P.v.yzyx;
+  float4 yzyy = (*(tint_private_vars)).P.v.yzyy;
+  float4 yzyz = (*(tint_private_vars)).P.v.yzyz;
+  float4 yzzx = (*(tint_private_vars)).P.v.yzzx;
+  float4 yzzy = (*(tint_private_vars)).P.v.yzzy;
+  float4 yzzz = (*(tint_private_vars)).P.v.yzzz;
+  float4 zxxx = (*(tint_private_vars)).P.v.zxxx;
+  float4 zxxy = (*(tint_private_vars)).P.v.zxxy;
+  float4 zxxz = (*(tint_private_vars)).P.v.zxxz;
+  float4 zxyx = (*(tint_private_vars)).P.v.zxyx;
+  float4 zxyy = (*(tint_private_vars)).P.v.zxyy;
+  float4 zxyz = (*(tint_private_vars)).P.v.zxyz;
+  float4 zxzx = (*(tint_private_vars)).P.v.zxzx;
+  float4 zxzy = (*(tint_private_vars)).P.v.zxzy;
+  float4 zxzz = (*(tint_private_vars)).P.v.zxzz;
+  float4 zyxx = (*(tint_private_vars)).P.v.zyxx;
+  float4 zyxy = (*(tint_private_vars)).P.v.zyxy;
+  float4 zyxz = (*(tint_private_vars)).P.v.zyxz;
+  float4 zyyx = (*(tint_private_vars)).P.v.zyyx;
+  float4 zyyy = (*(tint_private_vars)).P.v.zyyy;
+  float4 zyyz = (*(tint_private_vars)).P.v.zyyz;
+  float4 zyzx = (*(tint_private_vars)).P.v.zyzx;
+  float4 zyzy = (*(tint_private_vars)).P.v.zyzy;
+  float4 zyzz = (*(tint_private_vars)).P.v.zyzz;
+  float4 zzxx = (*(tint_private_vars)).P.v.zzxx;
+  float4 zzxy = (*(tint_private_vars)).P.v.zzxy;
+  float4 zzxz = (*(tint_private_vars)).P.v.zzxz;
+  float4 zzyx = (*(tint_private_vars)).P.v.zzyx;
+  float4 zzyy = (*(tint_private_vars)).P.v.zzyy;
+  float4 zzyz = (*(tint_private_vars)).P.v.zzyz;
+  float4 zzzx = (*(tint_private_vars)).P.v.zzzx;
+  float4 zzzy = (*(tint_private_vars)).P.v.zzzy;
+  float4 zzzz = (*(tint_private_vars)).P.v.zzzz;
 }
 
diff --git a/test/tint/expressions/swizzle/read/vec3/i32.wgsl.expected.msl b/test/tint/expressions/swizzle/read/vec3/i32.wgsl.expected.msl
index 9fd3e2f..ff90507 100644
--- a/test/tint/expressions/swizzle/read/vec3/i32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/read/vec3/i32.wgsl.expected.msl
@@ -5,128 +5,131 @@
   int3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  int3 v = tint_symbol.v;
-  int x = tint_symbol.v[0];
-  int y = tint_symbol.v[1];
-  int z = tint_symbol.v[2];
-  int2 xx = tint_symbol.v.xx;
-  int2 xy = tint_symbol.v.xy;
-  int2 xz = tint_symbol.v.xz;
-  int2 yx = tint_symbol.v.yx;
-  int2 yy = tint_symbol.v.yy;
-  int2 yz = tint_symbol.v.yz;
-  int2 zx = tint_symbol.v.zx;
-  int2 zy = tint_symbol.v.zy;
-  int2 zz = tint_symbol.v.zz;
-  int3 xxx = tint_symbol.v.xxx;
-  int3 xxy = tint_symbol.v.xxy;
-  int3 xxz = tint_symbol.v.xxz;
-  int3 xyx = tint_symbol.v.xyx;
-  int3 xyy = tint_symbol.v.xyy;
-  int3 xyz = tint_symbol.v.xyz;
-  int3 xzx = tint_symbol.v.xzx;
-  int3 xzy = tint_symbol.v.xzy;
-  int3 xzz = tint_symbol.v.xzz;
-  int3 yxx = tint_symbol.v.yxx;
-  int3 yxy = tint_symbol.v.yxy;
-  int3 yxz = tint_symbol.v.yxz;
-  int3 yyx = tint_symbol.v.yyx;
-  int3 yyy = tint_symbol.v.yyy;
-  int3 yyz = tint_symbol.v.yyz;
-  int3 yzx = tint_symbol.v.yzx;
-  int3 yzy = tint_symbol.v.yzy;
-  int3 yzz = tint_symbol.v.yzz;
-  int3 zxx = tint_symbol.v.zxx;
-  int3 zxy = tint_symbol.v.zxy;
-  int3 zxz = tint_symbol.v.zxz;
-  int3 zyx = tint_symbol.v.zyx;
-  int3 zyy = tint_symbol.v.zyy;
-  int3 zyz = tint_symbol.v.zyz;
-  int3 zzx = tint_symbol.v.zzx;
-  int3 zzy = tint_symbol.v.zzy;
-  int3 zzz = tint_symbol.v.zzz;
-  int4 xxxx = tint_symbol.v.xxxx;
-  int4 xxxy = tint_symbol.v.xxxy;
-  int4 xxxz = tint_symbol.v.xxxz;
-  int4 xxyx = tint_symbol.v.xxyx;
-  int4 xxyy = tint_symbol.v.xxyy;
-  int4 xxyz = tint_symbol.v.xxyz;
-  int4 xxzx = tint_symbol.v.xxzx;
-  int4 xxzy = tint_symbol.v.xxzy;
-  int4 xxzz = tint_symbol.v.xxzz;
-  int4 xyxx = tint_symbol.v.xyxx;
-  int4 xyxy = tint_symbol.v.xyxy;
-  int4 xyxz = tint_symbol.v.xyxz;
-  int4 xyyx = tint_symbol.v.xyyx;
-  int4 xyyy = tint_symbol.v.xyyy;
-  int4 xyyz = tint_symbol.v.xyyz;
-  int4 xyzx = tint_symbol.v.xyzx;
-  int4 xyzy = tint_symbol.v.xyzy;
-  int4 xyzz = tint_symbol.v.xyzz;
-  int4 xzxx = tint_symbol.v.xzxx;
-  int4 xzxy = tint_symbol.v.xzxy;
-  int4 xzxz = tint_symbol.v.xzxz;
-  int4 xzyx = tint_symbol.v.xzyx;
-  int4 xzyy = tint_symbol.v.xzyy;
-  int4 xzyz = tint_symbol.v.xzyz;
-  int4 xzzx = tint_symbol.v.xzzx;
-  int4 xzzy = tint_symbol.v.xzzy;
-  int4 xzzz = tint_symbol.v.xzzz;
-  int4 yxxx = tint_symbol.v.yxxx;
-  int4 yxxy = tint_symbol.v.yxxy;
-  int4 yxxz = tint_symbol.v.yxxz;
-  int4 yxyx = tint_symbol.v.yxyx;
-  int4 yxyy = tint_symbol.v.yxyy;
-  int4 yxyz = tint_symbol.v.yxyz;
-  int4 yxzx = tint_symbol.v.yxzx;
-  int4 yxzy = tint_symbol.v.yxzy;
-  int4 yxzz = tint_symbol.v.yxzz;
-  int4 yyxx = tint_symbol.v.yyxx;
-  int4 yyxy = tint_symbol.v.yyxy;
-  int4 yyxz = tint_symbol.v.yyxz;
-  int4 yyyx = tint_symbol.v.yyyx;
-  int4 yyyy = tint_symbol.v.yyyy;
-  int4 yyyz = tint_symbol.v.yyyz;
-  int4 yyzx = tint_symbol.v.yyzx;
-  int4 yyzy = tint_symbol.v.yyzy;
-  int4 yyzz = tint_symbol.v.yyzz;
-  int4 yzxx = tint_symbol.v.yzxx;
-  int4 yzxy = tint_symbol.v.yzxy;
-  int4 yzxz = tint_symbol.v.yzxz;
-  int4 yzyx = tint_symbol.v.yzyx;
-  int4 yzyy = tint_symbol.v.yzyy;
-  int4 yzyz = tint_symbol.v.yzyz;
-  int4 yzzx = tint_symbol.v.yzzx;
-  int4 yzzy = tint_symbol.v.yzzy;
-  int4 yzzz = tint_symbol.v.yzzz;
-  int4 zxxx = tint_symbol.v.zxxx;
-  int4 zxxy = tint_symbol.v.zxxy;
-  int4 zxxz = tint_symbol.v.zxxz;
-  int4 zxyx = tint_symbol.v.zxyx;
-  int4 zxyy = tint_symbol.v.zxyy;
-  int4 zxyz = tint_symbol.v.zxyz;
-  int4 zxzx = tint_symbol.v.zxzx;
-  int4 zxzy = tint_symbol.v.zxzy;
-  int4 zxzz = tint_symbol.v.zxzz;
-  int4 zyxx = tint_symbol.v.zyxx;
-  int4 zyxy = tint_symbol.v.zyxy;
-  int4 zyxz = tint_symbol.v.zyxz;
-  int4 zyyx = tint_symbol.v.zyyx;
-  int4 zyyy = tint_symbol.v.zyyy;
-  int4 zyyz = tint_symbol.v.zyyz;
-  int4 zyzx = tint_symbol.v.zyzx;
-  int4 zyzy = tint_symbol.v.zyzy;
-  int4 zyzz = tint_symbol.v.zyzz;
-  int4 zzxx = tint_symbol.v.zzxx;
-  int4 zzxy = tint_symbol.v.zzxy;
-  int4 zzxz = tint_symbol.v.zzxz;
-  int4 zzyx = tint_symbol.v.zzyx;
-  int4 zzyy = tint_symbol.v.zzyy;
-  int4 zzyz = tint_symbol.v.zzyz;
-  int4 zzzx = tint_symbol.v.zzzx;
-  int4 zzzy = tint_symbol.v.zzzy;
-  int4 zzzz = tint_symbol.v.zzzz;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 v = (*(tint_private_vars)).P.v;
+  int x = (*(tint_private_vars)).P.v[0];
+  int y = (*(tint_private_vars)).P.v[1];
+  int z = (*(tint_private_vars)).P.v[2];
+  int2 xx = (*(tint_private_vars)).P.v.xx;
+  int2 xy = (*(tint_private_vars)).P.v.xy;
+  int2 xz = (*(tint_private_vars)).P.v.xz;
+  int2 yx = (*(tint_private_vars)).P.v.yx;
+  int2 yy = (*(tint_private_vars)).P.v.yy;
+  int2 yz = (*(tint_private_vars)).P.v.yz;
+  int2 zx = (*(tint_private_vars)).P.v.zx;
+  int2 zy = (*(tint_private_vars)).P.v.zy;
+  int2 zz = (*(tint_private_vars)).P.v.zz;
+  int3 xxx = (*(tint_private_vars)).P.v.xxx;
+  int3 xxy = (*(tint_private_vars)).P.v.xxy;
+  int3 xxz = (*(tint_private_vars)).P.v.xxz;
+  int3 xyx = (*(tint_private_vars)).P.v.xyx;
+  int3 xyy = (*(tint_private_vars)).P.v.xyy;
+  int3 xyz = (*(tint_private_vars)).P.v.xyz;
+  int3 xzx = (*(tint_private_vars)).P.v.xzx;
+  int3 xzy = (*(tint_private_vars)).P.v.xzy;
+  int3 xzz = (*(tint_private_vars)).P.v.xzz;
+  int3 yxx = (*(tint_private_vars)).P.v.yxx;
+  int3 yxy = (*(tint_private_vars)).P.v.yxy;
+  int3 yxz = (*(tint_private_vars)).P.v.yxz;
+  int3 yyx = (*(tint_private_vars)).P.v.yyx;
+  int3 yyy = (*(tint_private_vars)).P.v.yyy;
+  int3 yyz = (*(tint_private_vars)).P.v.yyz;
+  int3 yzx = (*(tint_private_vars)).P.v.yzx;
+  int3 yzy = (*(tint_private_vars)).P.v.yzy;
+  int3 yzz = (*(tint_private_vars)).P.v.yzz;
+  int3 zxx = (*(tint_private_vars)).P.v.zxx;
+  int3 zxy = (*(tint_private_vars)).P.v.zxy;
+  int3 zxz = (*(tint_private_vars)).P.v.zxz;
+  int3 zyx = (*(tint_private_vars)).P.v.zyx;
+  int3 zyy = (*(tint_private_vars)).P.v.zyy;
+  int3 zyz = (*(tint_private_vars)).P.v.zyz;
+  int3 zzx = (*(tint_private_vars)).P.v.zzx;
+  int3 zzy = (*(tint_private_vars)).P.v.zzy;
+  int3 zzz = (*(tint_private_vars)).P.v.zzz;
+  int4 xxxx = (*(tint_private_vars)).P.v.xxxx;
+  int4 xxxy = (*(tint_private_vars)).P.v.xxxy;
+  int4 xxxz = (*(tint_private_vars)).P.v.xxxz;
+  int4 xxyx = (*(tint_private_vars)).P.v.xxyx;
+  int4 xxyy = (*(tint_private_vars)).P.v.xxyy;
+  int4 xxyz = (*(tint_private_vars)).P.v.xxyz;
+  int4 xxzx = (*(tint_private_vars)).P.v.xxzx;
+  int4 xxzy = (*(tint_private_vars)).P.v.xxzy;
+  int4 xxzz = (*(tint_private_vars)).P.v.xxzz;
+  int4 xyxx = (*(tint_private_vars)).P.v.xyxx;
+  int4 xyxy = (*(tint_private_vars)).P.v.xyxy;
+  int4 xyxz = (*(tint_private_vars)).P.v.xyxz;
+  int4 xyyx = (*(tint_private_vars)).P.v.xyyx;
+  int4 xyyy = (*(tint_private_vars)).P.v.xyyy;
+  int4 xyyz = (*(tint_private_vars)).P.v.xyyz;
+  int4 xyzx = (*(tint_private_vars)).P.v.xyzx;
+  int4 xyzy = (*(tint_private_vars)).P.v.xyzy;
+  int4 xyzz = (*(tint_private_vars)).P.v.xyzz;
+  int4 xzxx = (*(tint_private_vars)).P.v.xzxx;
+  int4 xzxy = (*(tint_private_vars)).P.v.xzxy;
+  int4 xzxz = (*(tint_private_vars)).P.v.xzxz;
+  int4 xzyx = (*(tint_private_vars)).P.v.xzyx;
+  int4 xzyy = (*(tint_private_vars)).P.v.xzyy;
+  int4 xzyz = (*(tint_private_vars)).P.v.xzyz;
+  int4 xzzx = (*(tint_private_vars)).P.v.xzzx;
+  int4 xzzy = (*(tint_private_vars)).P.v.xzzy;
+  int4 xzzz = (*(tint_private_vars)).P.v.xzzz;
+  int4 yxxx = (*(tint_private_vars)).P.v.yxxx;
+  int4 yxxy = (*(tint_private_vars)).P.v.yxxy;
+  int4 yxxz = (*(tint_private_vars)).P.v.yxxz;
+  int4 yxyx = (*(tint_private_vars)).P.v.yxyx;
+  int4 yxyy = (*(tint_private_vars)).P.v.yxyy;
+  int4 yxyz = (*(tint_private_vars)).P.v.yxyz;
+  int4 yxzx = (*(tint_private_vars)).P.v.yxzx;
+  int4 yxzy = (*(tint_private_vars)).P.v.yxzy;
+  int4 yxzz = (*(tint_private_vars)).P.v.yxzz;
+  int4 yyxx = (*(tint_private_vars)).P.v.yyxx;
+  int4 yyxy = (*(tint_private_vars)).P.v.yyxy;
+  int4 yyxz = (*(tint_private_vars)).P.v.yyxz;
+  int4 yyyx = (*(tint_private_vars)).P.v.yyyx;
+  int4 yyyy = (*(tint_private_vars)).P.v.yyyy;
+  int4 yyyz = (*(tint_private_vars)).P.v.yyyz;
+  int4 yyzx = (*(tint_private_vars)).P.v.yyzx;
+  int4 yyzy = (*(tint_private_vars)).P.v.yyzy;
+  int4 yyzz = (*(tint_private_vars)).P.v.yyzz;
+  int4 yzxx = (*(tint_private_vars)).P.v.yzxx;
+  int4 yzxy = (*(tint_private_vars)).P.v.yzxy;
+  int4 yzxz = (*(tint_private_vars)).P.v.yzxz;
+  int4 yzyx = (*(tint_private_vars)).P.v.yzyx;
+  int4 yzyy = (*(tint_private_vars)).P.v.yzyy;
+  int4 yzyz = (*(tint_private_vars)).P.v.yzyz;
+  int4 yzzx = (*(tint_private_vars)).P.v.yzzx;
+  int4 yzzy = (*(tint_private_vars)).P.v.yzzy;
+  int4 yzzz = (*(tint_private_vars)).P.v.yzzz;
+  int4 zxxx = (*(tint_private_vars)).P.v.zxxx;
+  int4 zxxy = (*(tint_private_vars)).P.v.zxxy;
+  int4 zxxz = (*(tint_private_vars)).P.v.zxxz;
+  int4 zxyx = (*(tint_private_vars)).P.v.zxyx;
+  int4 zxyy = (*(tint_private_vars)).P.v.zxyy;
+  int4 zxyz = (*(tint_private_vars)).P.v.zxyz;
+  int4 zxzx = (*(tint_private_vars)).P.v.zxzx;
+  int4 zxzy = (*(tint_private_vars)).P.v.zxzy;
+  int4 zxzz = (*(tint_private_vars)).P.v.zxzz;
+  int4 zyxx = (*(tint_private_vars)).P.v.zyxx;
+  int4 zyxy = (*(tint_private_vars)).P.v.zyxy;
+  int4 zyxz = (*(tint_private_vars)).P.v.zyxz;
+  int4 zyyx = (*(tint_private_vars)).P.v.zyyx;
+  int4 zyyy = (*(tint_private_vars)).P.v.zyyy;
+  int4 zyyz = (*(tint_private_vars)).P.v.zyyz;
+  int4 zyzx = (*(tint_private_vars)).P.v.zyzx;
+  int4 zyzy = (*(tint_private_vars)).P.v.zyzy;
+  int4 zyzz = (*(tint_private_vars)).P.v.zyzz;
+  int4 zzxx = (*(tint_private_vars)).P.v.zzxx;
+  int4 zzxy = (*(tint_private_vars)).P.v.zzxy;
+  int4 zzxz = (*(tint_private_vars)).P.v.zzxz;
+  int4 zzyx = (*(tint_private_vars)).P.v.zzyx;
+  int4 zzyy = (*(tint_private_vars)).P.v.zzyy;
+  int4 zzyz = (*(tint_private_vars)).P.v.zzyz;
+  int4 zzzx = (*(tint_private_vars)).P.v.zzzx;
+  int4 zzzy = (*(tint_private_vars)).P.v.zzzy;
+  int4 zzzz = (*(tint_private_vars)).P.v.zzzz;
 }
 
diff --git a/test/tint/expressions/swizzle/read/vec3/u32.wgsl.expected.msl b/test/tint/expressions/swizzle/read/vec3/u32.wgsl.expected.msl
index e926493..e099478 100644
--- a/test/tint/expressions/swizzle/read/vec3/u32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/read/vec3/u32.wgsl.expected.msl
@@ -5,128 +5,131 @@
   uint3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  uint3 v = tint_symbol.v;
-  uint x = tint_symbol.v[0];
-  uint y = tint_symbol.v[1];
-  uint z = tint_symbol.v[2];
-  uint2 xx = tint_symbol.v.xx;
-  uint2 xy = tint_symbol.v.xy;
-  uint2 xz = tint_symbol.v.xz;
-  uint2 yx = tint_symbol.v.yx;
-  uint2 yy = tint_symbol.v.yy;
-  uint2 yz = tint_symbol.v.yz;
-  uint2 zx = tint_symbol.v.zx;
-  uint2 zy = tint_symbol.v.zy;
-  uint2 zz = tint_symbol.v.zz;
-  uint3 xxx = tint_symbol.v.xxx;
-  uint3 xxy = tint_symbol.v.xxy;
-  uint3 xxz = tint_symbol.v.xxz;
-  uint3 xyx = tint_symbol.v.xyx;
-  uint3 xyy = tint_symbol.v.xyy;
-  uint3 xyz = tint_symbol.v.xyz;
-  uint3 xzx = tint_symbol.v.xzx;
-  uint3 xzy = tint_symbol.v.xzy;
-  uint3 xzz = tint_symbol.v.xzz;
-  uint3 yxx = tint_symbol.v.yxx;
-  uint3 yxy = tint_symbol.v.yxy;
-  uint3 yxz = tint_symbol.v.yxz;
-  uint3 yyx = tint_symbol.v.yyx;
-  uint3 yyy = tint_symbol.v.yyy;
-  uint3 yyz = tint_symbol.v.yyz;
-  uint3 yzx = tint_symbol.v.yzx;
-  uint3 yzy = tint_symbol.v.yzy;
-  uint3 yzz = tint_symbol.v.yzz;
-  uint3 zxx = tint_symbol.v.zxx;
-  uint3 zxy = tint_symbol.v.zxy;
-  uint3 zxz = tint_symbol.v.zxz;
-  uint3 zyx = tint_symbol.v.zyx;
-  uint3 zyy = tint_symbol.v.zyy;
-  uint3 zyz = tint_symbol.v.zyz;
-  uint3 zzx = tint_symbol.v.zzx;
-  uint3 zzy = tint_symbol.v.zzy;
-  uint3 zzz = tint_symbol.v.zzz;
-  uint4 xxxx = tint_symbol.v.xxxx;
-  uint4 xxxy = tint_symbol.v.xxxy;
-  uint4 xxxz = tint_symbol.v.xxxz;
-  uint4 xxyx = tint_symbol.v.xxyx;
-  uint4 xxyy = tint_symbol.v.xxyy;
-  uint4 xxyz = tint_symbol.v.xxyz;
-  uint4 xxzx = tint_symbol.v.xxzx;
-  uint4 xxzy = tint_symbol.v.xxzy;
-  uint4 xxzz = tint_symbol.v.xxzz;
-  uint4 xyxx = tint_symbol.v.xyxx;
-  uint4 xyxy = tint_symbol.v.xyxy;
-  uint4 xyxz = tint_symbol.v.xyxz;
-  uint4 xyyx = tint_symbol.v.xyyx;
-  uint4 xyyy = tint_symbol.v.xyyy;
-  uint4 xyyz = tint_symbol.v.xyyz;
-  uint4 xyzx = tint_symbol.v.xyzx;
-  uint4 xyzy = tint_symbol.v.xyzy;
-  uint4 xyzz = tint_symbol.v.xyzz;
-  uint4 xzxx = tint_symbol.v.xzxx;
-  uint4 xzxy = tint_symbol.v.xzxy;
-  uint4 xzxz = tint_symbol.v.xzxz;
-  uint4 xzyx = tint_symbol.v.xzyx;
-  uint4 xzyy = tint_symbol.v.xzyy;
-  uint4 xzyz = tint_symbol.v.xzyz;
-  uint4 xzzx = tint_symbol.v.xzzx;
-  uint4 xzzy = tint_symbol.v.xzzy;
-  uint4 xzzz = tint_symbol.v.xzzz;
-  uint4 yxxx = tint_symbol.v.yxxx;
-  uint4 yxxy = tint_symbol.v.yxxy;
-  uint4 yxxz = tint_symbol.v.yxxz;
-  uint4 yxyx = tint_symbol.v.yxyx;
-  uint4 yxyy = tint_symbol.v.yxyy;
-  uint4 yxyz = tint_symbol.v.yxyz;
-  uint4 yxzx = tint_symbol.v.yxzx;
-  uint4 yxzy = tint_symbol.v.yxzy;
-  uint4 yxzz = tint_symbol.v.yxzz;
-  uint4 yyxx = tint_symbol.v.yyxx;
-  uint4 yyxy = tint_symbol.v.yyxy;
-  uint4 yyxz = tint_symbol.v.yyxz;
-  uint4 yyyx = tint_symbol.v.yyyx;
-  uint4 yyyy = tint_symbol.v.yyyy;
-  uint4 yyyz = tint_symbol.v.yyyz;
-  uint4 yyzx = tint_symbol.v.yyzx;
-  uint4 yyzy = tint_symbol.v.yyzy;
-  uint4 yyzz = tint_symbol.v.yyzz;
-  uint4 yzxx = tint_symbol.v.yzxx;
-  uint4 yzxy = tint_symbol.v.yzxy;
-  uint4 yzxz = tint_symbol.v.yzxz;
-  uint4 yzyx = tint_symbol.v.yzyx;
-  uint4 yzyy = tint_symbol.v.yzyy;
-  uint4 yzyz = tint_symbol.v.yzyz;
-  uint4 yzzx = tint_symbol.v.yzzx;
-  uint4 yzzy = tint_symbol.v.yzzy;
-  uint4 yzzz = tint_symbol.v.yzzz;
-  uint4 zxxx = tint_symbol.v.zxxx;
-  uint4 zxxy = tint_symbol.v.zxxy;
-  uint4 zxxz = tint_symbol.v.zxxz;
-  uint4 zxyx = tint_symbol.v.zxyx;
-  uint4 zxyy = tint_symbol.v.zxyy;
-  uint4 zxyz = tint_symbol.v.zxyz;
-  uint4 zxzx = tint_symbol.v.zxzx;
-  uint4 zxzy = tint_symbol.v.zxzy;
-  uint4 zxzz = tint_symbol.v.zxzz;
-  uint4 zyxx = tint_symbol.v.zyxx;
-  uint4 zyxy = tint_symbol.v.zyxy;
-  uint4 zyxz = tint_symbol.v.zyxz;
-  uint4 zyyx = tint_symbol.v.zyyx;
-  uint4 zyyy = tint_symbol.v.zyyy;
-  uint4 zyyz = tint_symbol.v.zyyz;
-  uint4 zyzx = tint_symbol.v.zyzx;
-  uint4 zyzy = tint_symbol.v.zyzy;
-  uint4 zyzz = tint_symbol.v.zyzz;
-  uint4 zzxx = tint_symbol.v.zzxx;
-  uint4 zzxy = tint_symbol.v.zzxy;
-  uint4 zzxz = tint_symbol.v.zzxz;
-  uint4 zzyx = tint_symbol.v.zzyx;
-  uint4 zzyy = tint_symbol.v.zzyy;
-  uint4 zzyz = tint_symbol.v.zzyz;
-  uint4 zzzx = tint_symbol.v.zzzx;
-  uint4 zzzy = tint_symbol.v.zzzy;
-  uint4 zzzz = tint_symbol.v.zzzz;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 v = (*(tint_private_vars)).P.v;
+  uint x = (*(tint_private_vars)).P.v[0];
+  uint y = (*(tint_private_vars)).P.v[1];
+  uint z = (*(tint_private_vars)).P.v[2];
+  uint2 xx = (*(tint_private_vars)).P.v.xx;
+  uint2 xy = (*(tint_private_vars)).P.v.xy;
+  uint2 xz = (*(tint_private_vars)).P.v.xz;
+  uint2 yx = (*(tint_private_vars)).P.v.yx;
+  uint2 yy = (*(tint_private_vars)).P.v.yy;
+  uint2 yz = (*(tint_private_vars)).P.v.yz;
+  uint2 zx = (*(tint_private_vars)).P.v.zx;
+  uint2 zy = (*(tint_private_vars)).P.v.zy;
+  uint2 zz = (*(tint_private_vars)).P.v.zz;
+  uint3 xxx = (*(tint_private_vars)).P.v.xxx;
+  uint3 xxy = (*(tint_private_vars)).P.v.xxy;
+  uint3 xxz = (*(tint_private_vars)).P.v.xxz;
+  uint3 xyx = (*(tint_private_vars)).P.v.xyx;
+  uint3 xyy = (*(tint_private_vars)).P.v.xyy;
+  uint3 xyz = (*(tint_private_vars)).P.v.xyz;
+  uint3 xzx = (*(tint_private_vars)).P.v.xzx;
+  uint3 xzy = (*(tint_private_vars)).P.v.xzy;
+  uint3 xzz = (*(tint_private_vars)).P.v.xzz;
+  uint3 yxx = (*(tint_private_vars)).P.v.yxx;
+  uint3 yxy = (*(tint_private_vars)).P.v.yxy;
+  uint3 yxz = (*(tint_private_vars)).P.v.yxz;
+  uint3 yyx = (*(tint_private_vars)).P.v.yyx;
+  uint3 yyy = (*(tint_private_vars)).P.v.yyy;
+  uint3 yyz = (*(tint_private_vars)).P.v.yyz;
+  uint3 yzx = (*(tint_private_vars)).P.v.yzx;
+  uint3 yzy = (*(tint_private_vars)).P.v.yzy;
+  uint3 yzz = (*(tint_private_vars)).P.v.yzz;
+  uint3 zxx = (*(tint_private_vars)).P.v.zxx;
+  uint3 zxy = (*(tint_private_vars)).P.v.zxy;
+  uint3 zxz = (*(tint_private_vars)).P.v.zxz;
+  uint3 zyx = (*(tint_private_vars)).P.v.zyx;
+  uint3 zyy = (*(tint_private_vars)).P.v.zyy;
+  uint3 zyz = (*(tint_private_vars)).P.v.zyz;
+  uint3 zzx = (*(tint_private_vars)).P.v.zzx;
+  uint3 zzy = (*(tint_private_vars)).P.v.zzy;
+  uint3 zzz = (*(tint_private_vars)).P.v.zzz;
+  uint4 xxxx = (*(tint_private_vars)).P.v.xxxx;
+  uint4 xxxy = (*(tint_private_vars)).P.v.xxxy;
+  uint4 xxxz = (*(tint_private_vars)).P.v.xxxz;
+  uint4 xxyx = (*(tint_private_vars)).P.v.xxyx;
+  uint4 xxyy = (*(tint_private_vars)).P.v.xxyy;
+  uint4 xxyz = (*(tint_private_vars)).P.v.xxyz;
+  uint4 xxzx = (*(tint_private_vars)).P.v.xxzx;
+  uint4 xxzy = (*(tint_private_vars)).P.v.xxzy;
+  uint4 xxzz = (*(tint_private_vars)).P.v.xxzz;
+  uint4 xyxx = (*(tint_private_vars)).P.v.xyxx;
+  uint4 xyxy = (*(tint_private_vars)).P.v.xyxy;
+  uint4 xyxz = (*(tint_private_vars)).P.v.xyxz;
+  uint4 xyyx = (*(tint_private_vars)).P.v.xyyx;
+  uint4 xyyy = (*(tint_private_vars)).P.v.xyyy;
+  uint4 xyyz = (*(tint_private_vars)).P.v.xyyz;
+  uint4 xyzx = (*(tint_private_vars)).P.v.xyzx;
+  uint4 xyzy = (*(tint_private_vars)).P.v.xyzy;
+  uint4 xyzz = (*(tint_private_vars)).P.v.xyzz;
+  uint4 xzxx = (*(tint_private_vars)).P.v.xzxx;
+  uint4 xzxy = (*(tint_private_vars)).P.v.xzxy;
+  uint4 xzxz = (*(tint_private_vars)).P.v.xzxz;
+  uint4 xzyx = (*(tint_private_vars)).P.v.xzyx;
+  uint4 xzyy = (*(tint_private_vars)).P.v.xzyy;
+  uint4 xzyz = (*(tint_private_vars)).P.v.xzyz;
+  uint4 xzzx = (*(tint_private_vars)).P.v.xzzx;
+  uint4 xzzy = (*(tint_private_vars)).P.v.xzzy;
+  uint4 xzzz = (*(tint_private_vars)).P.v.xzzz;
+  uint4 yxxx = (*(tint_private_vars)).P.v.yxxx;
+  uint4 yxxy = (*(tint_private_vars)).P.v.yxxy;
+  uint4 yxxz = (*(tint_private_vars)).P.v.yxxz;
+  uint4 yxyx = (*(tint_private_vars)).P.v.yxyx;
+  uint4 yxyy = (*(tint_private_vars)).P.v.yxyy;
+  uint4 yxyz = (*(tint_private_vars)).P.v.yxyz;
+  uint4 yxzx = (*(tint_private_vars)).P.v.yxzx;
+  uint4 yxzy = (*(tint_private_vars)).P.v.yxzy;
+  uint4 yxzz = (*(tint_private_vars)).P.v.yxzz;
+  uint4 yyxx = (*(tint_private_vars)).P.v.yyxx;
+  uint4 yyxy = (*(tint_private_vars)).P.v.yyxy;
+  uint4 yyxz = (*(tint_private_vars)).P.v.yyxz;
+  uint4 yyyx = (*(tint_private_vars)).P.v.yyyx;
+  uint4 yyyy = (*(tint_private_vars)).P.v.yyyy;
+  uint4 yyyz = (*(tint_private_vars)).P.v.yyyz;
+  uint4 yyzx = (*(tint_private_vars)).P.v.yyzx;
+  uint4 yyzy = (*(tint_private_vars)).P.v.yyzy;
+  uint4 yyzz = (*(tint_private_vars)).P.v.yyzz;
+  uint4 yzxx = (*(tint_private_vars)).P.v.yzxx;
+  uint4 yzxy = (*(tint_private_vars)).P.v.yzxy;
+  uint4 yzxz = (*(tint_private_vars)).P.v.yzxz;
+  uint4 yzyx = (*(tint_private_vars)).P.v.yzyx;
+  uint4 yzyy = (*(tint_private_vars)).P.v.yzyy;
+  uint4 yzyz = (*(tint_private_vars)).P.v.yzyz;
+  uint4 yzzx = (*(tint_private_vars)).P.v.yzzx;
+  uint4 yzzy = (*(tint_private_vars)).P.v.yzzy;
+  uint4 yzzz = (*(tint_private_vars)).P.v.yzzz;
+  uint4 zxxx = (*(tint_private_vars)).P.v.zxxx;
+  uint4 zxxy = (*(tint_private_vars)).P.v.zxxy;
+  uint4 zxxz = (*(tint_private_vars)).P.v.zxxz;
+  uint4 zxyx = (*(tint_private_vars)).P.v.zxyx;
+  uint4 zxyy = (*(tint_private_vars)).P.v.zxyy;
+  uint4 zxyz = (*(tint_private_vars)).P.v.zxyz;
+  uint4 zxzx = (*(tint_private_vars)).P.v.zxzx;
+  uint4 zxzy = (*(tint_private_vars)).P.v.zxzy;
+  uint4 zxzz = (*(tint_private_vars)).P.v.zxzz;
+  uint4 zyxx = (*(tint_private_vars)).P.v.zyxx;
+  uint4 zyxy = (*(tint_private_vars)).P.v.zyxy;
+  uint4 zyxz = (*(tint_private_vars)).P.v.zyxz;
+  uint4 zyyx = (*(tint_private_vars)).P.v.zyyx;
+  uint4 zyyy = (*(tint_private_vars)).P.v.zyyy;
+  uint4 zyyz = (*(tint_private_vars)).P.v.zyyz;
+  uint4 zyzx = (*(tint_private_vars)).P.v.zyzx;
+  uint4 zyzy = (*(tint_private_vars)).P.v.zyzy;
+  uint4 zyzz = (*(tint_private_vars)).P.v.zyzz;
+  uint4 zzxx = (*(tint_private_vars)).P.v.zzxx;
+  uint4 zzxy = (*(tint_private_vars)).P.v.zzxy;
+  uint4 zzxz = (*(tint_private_vars)).P.v.zzxz;
+  uint4 zzyx = (*(tint_private_vars)).P.v.zzyx;
+  uint4 zzyy = (*(tint_private_vars)).P.v.zzyy;
+  uint4 zzyz = (*(tint_private_vars)).P.v.zzyz;
+  uint4 zzzx = (*(tint_private_vars)).P.v.zzzx;
+  uint4 zzzy = (*(tint_private_vars)).P.v.zzzy;
+  uint4 zzzz = (*(tint_private_vars)).P.v.zzzz;
 }
 
diff --git a/test/tint/expressions/swizzle/write/vec3/f16.wgsl.expected.msl b/test/tint/expressions/swizzle/write/vec3/f16.wgsl.expected.msl
index 87ad75d..b792a3a 100644
--- a/test/tint/expressions/swizzle/write/vec3/f16.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/write/vec3/f16.wgsl.expected.msl
@@ -5,11 +5,14 @@
   half3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  tint_symbol.v = half3(1.0h, 2.0h, 3.0h);
-  tint_symbol.v[0] = 1.0h;
-  tint_symbol.v[1] = 2.0h;
-  tint_symbol.v[2] = 3.0h;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.v = half3(1.0h, 2.0h, 3.0h);
+  (*(tint_private_vars)).P.v[0] = 1.0h;
+  (*(tint_private_vars)).P.v[1] = 2.0h;
+  (*(tint_private_vars)).P.v[2] = 3.0h;
 }
 
diff --git a/test/tint/expressions/swizzle/write/vec3/f32.wgsl.expected.msl b/test/tint/expressions/swizzle/write/vec3/f32.wgsl.expected.msl
index 7122f54..1868a06 100644
--- a/test/tint/expressions/swizzle/write/vec3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/write/vec3/f32.wgsl.expected.msl
@@ -5,11 +5,14 @@
   float3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  tint_symbol.v = float3(1.0f, 2.0f, 3.0f);
-  tint_symbol.v[0] = 1.0f;
-  tint_symbol.v[1] = 2.0f;
-  tint_symbol.v[2] = 3.0f;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.v = float3(1.0f, 2.0f, 3.0f);
+  (*(tint_private_vars)).P.v[0] = 1.0f;
+  (*(tint_private_vars)).P.v[1] = 2.0f;
+  (*(tint_private_vars)).P.v[2] = 3.0f;
 }
 
diff --git a/test/tint/expressions/swizzle/write/vec3/i32.wgsl.expected.msl b/test/tint/expressions/swizzle/write/vec3/i32.wgsl.expected.msl
index 1e4aee1..c1d0b5b 100644
--- a/test/tint/expressions/swizzle/write/vec3/i32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/write/vec3/i32.wgsl.expected.msl
@@ -5,11 +5,14 @@
   int3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  tint_symbol.v = int3(1, 2, 3);
-  tint_symbol.v[0] = 1;
-  tint_symbol.v[1] = 2;
-  tint_symbol.v[2] = 3;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.v = int3(1, 2, 3);
+  (*(tint_private_vars)).P.v[0] = 1;
+  (*(tint_private_vars)).P.v[1] = 2;
+  (*(tint_private_vars)).P.v[2] = 3;
 }
 
diff --git a/test/tint/expressions/swizzle/write/vec3/u32.wgsl.expected.msl b/test/tint/expressions/swizzle/write/vec3/u32.wgsl.expected.msl
index 5b5f769..16866f9 100644
--- a/test/tint/expressions/swizzle/write/vec3/u32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/write/vec3/u32.wgsl.expected.msl
@@ -5,11 +5,14 @@
   uint3 v;
 };
 
-void f() {
-  thread S tint_symbol = {};
-  tint_symbol.v = uint3(1u, 2u, 3u);
-  tint_symbol.v[0] = 1u;
-  tint_symbol.v[1] = 2u;
-  tint_symbol.v[2] = 3u;
+struct tint_private_vars_struct {
+  S P;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.v = uint3(1u, 2u, 3u);
+  (*(tint_private_vars)).P.v[0] = 1u;
+  (*(tint_private_vars)).P.v[1] = 2u;
+  (*(tint_private_vars)).P.v[2] = 3u;
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x2/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x2/function/f16-f32.wgsl.expected.msl
index 90a846e..8a8da46 100644
--- a/test/tint/expressions/type_conv/mat2x2/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x2/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x2 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half2x2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half2x2(half2(1.0h, 2.0h), half2(3.0h, 4.0h));
 }
 
-void f() {
-  half2x2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x2 const tint_symbol = m(tint_private_vars);
   float2x2 v = float2x2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x2/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x2/function/f32-f16.wgsl.expected.msl
index f9159fb..0b8467b 100644
--- a/test/tint/expressions/type_conv/mat2x2/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x2/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x2 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float2x2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
 }
 
-void f() {
-  float2x2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x2 const tint_symbol = m(tint_private_vars);
   half2x2 v = half2x2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x2/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x2/literal/f16-f32.wgsl.expected.msl
index 466ceaa..bf0adb1 100644
--- a/test/tint/expressions/type_conv/mat2x2/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x2/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat2x2/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x2/literal/f32-f16.wgsl.expected.msl
index 466ceaa..c281e2d 100644
--- a/test/tint/expressions/type_conv/mat2x2/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x2/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat2x2/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x2/var/f16-f32.wgsl.expected.msl
index d27e57f..2f07134 100644
--- a/test/tint/expressions/type_conv/mat2x2/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x2/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half2x2 tint_symbol = half2x2(half2(1.0h, 2.0h), half2(3.0h, 4.0h));
-  float2x2 v = float2x2(tint_symbol);
+struct tint_private_vars_struct {
+  half2x2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x2 v = float2x2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x2/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x2/var/f32-f16.wgsl.expected.msl
index c7519dc..9c1e1b3 100644
--- a/test/tint/expressions/type_conv/mat2x2/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x2/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float2x2 tint_symbol = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
-  half2x2 v = half2x2(tint_symbol);
+struct tint_private_vars_struct {
+  float2x2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x2 v = half2x2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x3/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x3/function/f16-f32.wgsl.expected.msl
index 25500b4..7deafd4 100644
--- a/test/tint/expressions/type_conv/mat2x3/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x3/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x3 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half2x3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half2x3(half3(1.0h, 2.0h, 3.0h), half3(4.0h, 5.0h, 6.0h));
 }
 
-void f() {
-  half2x3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x3 const tint_symbol = m(tint_private_vars);
   float2x3 v = float2x3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x3/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x3/function/f32-f16.wgsl.expected.msl
index ffb559c..8980403 100644
--- a/test/tint/expressions/type_conv/mat2x3/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x3/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x3 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float2x3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float2x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f));
 }
 
-void f() {
-  float2x3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x3 const tint_symbol = m(tint_private_vars);
   half2x3 v = half2x3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x3/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x3/literal/f16-f32.wgsl.expected.msl
index 466ceaa..2b35f8b 100644
--- a/test/tint/expressions/type_conv/mat2x3/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x3/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat2x3/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x3/literal/f32-f16.wgsl.expected.msl
index 466ceaa..7b62235 100644
--- a/test/tint/expressions/type_conv/mat2x3/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x3/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat2x3/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x3/var/f16-f32.wgsl.expected.msl
index a263c8d..ebbfc4a 100644
--- a/test/tint/expressions/type_conv/mat2x3/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x3/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half2x3 tint_symbol = half2x3(half3(1.0h, 2.0h, 3.0h), half3(4.0h, 5.0h, 6.0h));
-  float2x3 v = float2x3(tint_symbol);
+struct tint_private_vars_struct {
+  half2x3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x3 v = float2x3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x3/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x3/var/f32-f16.wgsl.expected.msl
index 10585b8..31ba61b 100644
--- a/test/tint/expressions/type_conv/mat2x3/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x3/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float2x3 tint_symbol = float2x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f));
-  half2x3 v = half2x3(tint_symbol);
+struct tint_private_vars_struct {
+  float2x3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x3 v = half2x3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x4/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x4/function/f16-f32.wgsl.expected.msl
index f3c5d0f..472232a 100644
--- a/test/tint/expressions/type_conv/mat2x4/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x4/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x4 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half2x4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half2x4(half4(1.0h, 2.0h, 3.0h, 4.0h), half4(5.0h, 6.0h, 7.0h, 8.0h));
 }
 
-void f() {
-  half2x4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x4 const tint_symbol = m(tint_private_vars);
   float2x4 v = float2x4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x4/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x4/function/f32-f16.wgsl.expected.msl
index 1dd1032..1b49f60 100644
--- a/test/tint/expressions/type_conv/mat2x4/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x4/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x4 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float2x4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float2x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f));
 }
 
-void f() {
-  float2x4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x4 const tint_symbol = m(tint_private_vars);
   half2x4 v = half2x4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x4/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x4/literal/f16-f32.wgsl.expected.msl
index 466ceaa..57d08cd 100644
--- a/test/tint/expressions/type_conv/mat2x4/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x4/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat2x4/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x4/literal/f32-f16.wgsl.expected.msl
index 466ceaa..4720101 100644
--- a/test/tint/expressions/type_conv/mat2x4/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x4/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat2x4/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x4/var/f16-f32.wgsl.expected.msl
index c124957..8fed593 100644
--- a/test/tint/expressions/type_conv/mat2x4/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x4/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half2x4 tint_symbol = half2x4(half4(1.0h, 2.0h, 3.0h, 4.0h), half4(5.0h, 6.0h, 7.0h, 8.0h));
-  float2x4 v = float2x4(tint_symbol);
+struct tint_private_vars_struct {
+  half2x4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x4 v = float2x4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat2x4/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat2x4/var/f32-f16.wgsl.expected.msl
index 4573766..71eac19 100644
--- a/test/tint/expressions/type_conv/mat2x4/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat2x4/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float2x4 tint_symbol = float2x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f));
-  half2x4 v = half2x4(tint_symbol);
+struct tint_private_vars_struct {
+  float2x4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x4 v = half2x4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x2/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x2/function/f16-f32.wgsl.expected.msl
index 6a7d753..8e2cf79 100644
--- a/test/tint/expressions/type_conv/mat3x2/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x2/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x2 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half3x2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half3x2(half2(1.0h, 2.0h), half2(3.0h, 4.0h), half2(5.0h, 6.0h));
 }
 
-void f() {
-  half3x2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x2 const tint_symbol = m(tint_private_vars);
   float3x2 v = float3x2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x2/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x2/function/f32-f16.wgsl.expected.msl
index 2ad53ed..6cc4613 100644
--- a/test/tint/expressions/type_conv/mat3x2/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x2/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x2 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float3x2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float3x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f));
 }
 
-void f() {
-  float3x2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x2 const tint_symbol = m(tint_private_vars);
   half3x2 v = half3x2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x2/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x2/literal/f16-f32.wgsl.expected.msl
index 466ceaa..5c010eb 100644
--- a/test/tint/expressions/type_conv/mat3x2/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x2/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat3x2/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x2/literal/f32-f16.wgsl.expected.msl
index 466ceaa..261fca4 100644
--- a/test/tint/expressions/type_conv/mat3x2/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x2/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat3x2/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x2/var/f16-f32.wgsl.expected.msl
index 16aa3f7..dd854f9 100644
--- a/test/tint/expressions/type_conv/mat3x2/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x2/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half3x2 tint_symbol = half3x2(half2(1.0h, 2.0h), half2(3.0h, 4.0h), half2(5.0h, 6.0h));
-  float3x2 v = float3x2(tint_symbol);
+struct tint_private_vars_struct {
+  half3x2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x2 v = float3x2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x2/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x2/var/f32-f16.wgsl.expected.msl
index 1376800..16f1bec 100644
--- a/test/tint/expressions/type_conv/mat3x2/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x2/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float3x2 tint_symbol = float3x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f));
-  half3x2 v = half3x2(tint_symbol);
+struct tint_private_vars_struct {
+  float3x2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x2 v = half3x2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x3/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x3/function/f16-f32.wgsl.expected.msl
index 8428cb4..4bcc737 100644
--- a/test/tint/expressions/type_conv/mat3x3/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x3/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x3 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half3x3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half3x3(half3(1.0h, 2.0h, 3.0h), half3(4.0h, 5.0h, 6.0h), half3(7.0h, 8.0h, 9.0h));
 }
 
-void f() {
-  half3x3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x3 const tint_symbol = m(tint_private_vars);
   float3x3 v = float3x3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x3/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x3/function/f32-f16.wgsl.expected.msl
index e0a6c0c..a71e57e 100644
--- a/test/tint/expressions/type_conv/mat3x3/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x3/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x3 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float3x3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
 }
 
-void f() {
-  float3x3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x3 const tint_symbol = m(tint_private_vars);
   half3x3 v = half3x3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x3/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x3/literal/f16-f32.wgsl.expected.msl
index 466ceaa..000bdf2 100644
--- a/test/tint/expressions/type_conv/mat3x3/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x3/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat3x3/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x3/literal/f32-f16.wgsl.expected.msl
index 466ceaa..ddc4151 100644
--- a/test/tint/expressions/type_conv/mat3x3/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x3/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat3x3/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x3/var/f16-f32.wgsl.expected.msl
index dce7f33..848b635 100644
--- a/test/tint/expressions/type_conv/mat3x3/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x3/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half3x3 tint_symbol = half3x3(half3(1.0h, 2.0h, 3.0h), half3(4.0h, 5.0h, 6.0h), half3(7.0h, 8.0h, 9.0h));
-  float3x3 v = float3x3(tint_symbol);
+struct tint_private_vars_struct {
+  half3x3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x3 v = float3x3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x3/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x3/var/f32-f16.wgsl.expected.msl
index 1b4315b..29c2bcd 100644
--- a/test/tint/expressions/type_conv/mat3x3/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x3/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float3x3 tint_symbol = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
-  half3x3 v = half3x3(tint_symbol);
+struct tint_private_vars_struct {
+  float3x3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x3 v = half3x3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x4/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x4/function/f16-f32.wgsl.expected.msl
index 9112e8b..f10e9db 100644
--- a/test/tint/expressions/type_conv/mat3x4/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x4/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x4 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half3x4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half3x4(half4(1.0h, 2.0h, 3.0h, 4.0h), half4(5.0h, 6.0h, 7.0h, 8.0h), half4(9.0h, 10.0h, 11.0h, 12.0h));
 }
 
-void f() {
-  half3x4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x4 const tint_symbol = m(tint_private_vars);
   float3x4 v = float3x4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x4/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x4/function/f32-f16.wgsl.expected.msl
index fb93df0..72dbdd3 100644
--- a/test/tint/expressions/type_conv/mat3x4/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x4/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x4 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float3x4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float3x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f));
 }
 
-void f() {
-  float3x4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x4 const tint_symbol = m(tint_private_vars);
   half3x4 v = half3x4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x4/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x4/literal/f16-f32.wgsl.expected.msl
index 466ceaa..80df88a 100644
--- a/test/tint/expressions/type_conv/mat3x4/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x4/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat3x4/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x4/literal/f32-f16.wgsl.expected.msl
index 466ceaa..bb9538a 100644
--- a/test/tint/expressions/type_conv/mat3x4/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x4/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat3x4/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x4/var/f16-f32.wgsl.expected.msl
index 633908b..59d801e 100644
--- a/test/tint/expressions/type_conv/mat3x4/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x4/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half3x4 tint_symbol = half3x4(half4(1.0h, 2.0h, 3.0h, 4.0h), half4(5.0h, 6.0h, 7.0h, 8.0h), half4(9.0h, 10.0h, 11.0h, 12.0h));
-  float3x4 v = float3x4(tint_symbol);
+struct tint_private_vars_struct {
+  half3x4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x4 v = float3x4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat3x4/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat3x4/var/f32-f16.wgsl.expected.msl
index be9dd55..6096d07 100644
--- a/test/tint/expressions/type_conv/mat3x4/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat3x4/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float3x4 tint_symbol = float3x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f));
-  half3x4 v = half3x4(tint_symbol);
+struct tint_private_vars_struct {
+  float3x4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x4 v = half3x4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x2/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x2/function/f16-f32.wgsl.expected.msl
index 099f286..70e9e23 100644
--- a/test/tint/expressions/type_conv/mat4x2/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x2/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x2 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half4x2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half4x2(half2(1.0h, 2.0h), half2(3.0h, 4.0h), half2(5.0h, 6.0h), half2(7.0h, 8.0h));
 }
 
-void f() {
-  half4x2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x2 const tint_symbol = m(tint_private_vars);
   float4x2 v = float4x2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x2/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x2/function/f32-f16.wgsl.expected.msl
index 742a271..68fe80c 100644
--- a/test/tint/expressions/type_conv/mat4x2/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x2/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x2 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float4x2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float4x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f), float2(7.0f, 8.0f));
 }
 
-void f() {
-  float4x2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x2 const tint_symbol = m(tint_private_vars);
   half4x2 v = half4x2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x2/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x2/literal/f16-f32.wgsl.expected.msl
index 466ceaa..b625b71 100644
--- a/test/tint/expressions/type_conv/mat4x2/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x2/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat4x2/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x2/literal/f32-f16.wgsl.expected.msl
index 466ceaa..a17ab30 100644
--- a/test/tint/expressions/type_conv/mat4x2/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x2/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat4x2/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x2/var/f16-f32.wgsl.expected.msl
index ff77b1c..42305b1 100644
--- a/test/tint/expressions/type_conv/mat4x2/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x2/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half4x2 tint_symbol = half4x2(half2(1.0h, 2.0h), half2(3.0h, 4.0h), half2(5.0h, 6.0h), half2(7.0h, 8.0h));
-  float4x2 v = float4x2(tint_symbol);
+struct tint_private_vars_struct {
+  half4x2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x2 v = float4x2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x2/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x2/var/f32-f16.wgsl.expected.msl
index 556cab7..af6bdc9 100644
--- a/test/tint/expressions/type_conv/mat4x2/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x2/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float4x2 tint_symbol = float4x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f), float2(7.0f, 8.0f));
-  half4x2 v = half4x2(tint_symbol);
+struct tint_private_vars_struct {
+  float4x2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x2 v = half4x2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x3/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x3/function/f16-f32.wgsl.expected.msl
index 4af3c85..c09190a 100644
--- a/test/tint/expressions/type_conv/mat4x3/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x3/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x3 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half4x3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half4x3(half3(1.0h, 2.0h, 3.0h), half3(4.0h, 5.0h, 6.0h), half3(7.0h, 8.0h, 9.0h), half3(10.0h, 11.0h, 12.0h));
 }
 
-void f() {
-  half4x3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x3 const tint_symbol = m(tint_private_vars);
   float4x3 v = float4x3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x3/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x3/function/f32-f16.wgsl.expected.msl
index 3d3dc95..49ef01e 100644
--- a/test/tint/expressions/type_conv/mat4x3/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x3/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x3 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float4x3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float4x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), float3(10.0f, 11.0f, 12.0f));
 }
 
-void f() {
-  float4x3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x3 const tint_symbol = m(tint_private_vars);
   half4x3 v = half4x3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x3/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x3/literal/f16-f32.wgsl.expected.msl
index 466ceaa..9fc73e1 100644
--- a/test/tint/expressions/type_conv/mat4x3/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x3/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat4x3/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x3/literal/f32-f16.wgsl.expected.msl
index 466ceaa..8ad181f 100644
--- a/test/tint/expressions/type_conv/mat4x3/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x3/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat4x3/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x3/var/f16-f32.wgsl.expected.msl
index 75503fb..4132d79 100644
--- a/test/tint/expressions/type_conv/mat4x3/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x3/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half4x3 tint_symbol = half4x3(half3(1.0h, 2.0h, 3.0h), half3(4.0h, 5.0h, 6.0h), half3(7.0h, 8.0h, 9.0h), half3(10.0h, 11.0h, 12.0h));
-  float4x3 v = float4x3(tint_symbol);
+struct tint_private_vars_struct {
+  half4x3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x3 v = float4x3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x3/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x3/var/f32-f16.wgsl.expected.msl
index 1ba9e77..3a3e5c9 100644
--- a/test/tint/expressions/type_conv/mat4x3/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x3/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float4x3 tint_symbol = float4x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), float3(10.0f, 11.0f, 12.0f));
-  half4x3 v = half4x3(tint_symbol);
+struct tint_private_vars_struct {
+  float4x3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x3 v = half4x3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x4/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x4/function/f16-f32.wgsl.expected.msl
index 49e7311..c6c3b7d 100644
--- a/test/tint/expressions/type_conv/mat4x4/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x4/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x4 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = (tint_symbol_1 + 1.0h);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half4x4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0h);
   return half4x4(half4(1.0h, 2.0h, 3.0h, 4.0h), half4(5.0h, 6.0h, 7.0h, 8.0h), half4(9.0h, 10.0h, 11.0h, 12.0h), half4(13.0h, 14.0h, 15.0h, 16.0h));
 }
 
-void f() {
-  half4x4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x4 const tint_symbol = m(tint_private_vars);
   float4x4 v = float4x4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x4/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x4/function/f32-f16.wgsl.expected.msl
index 7a32b55..80f5652 100644
--- a/test/tint/expressions/type_conv/mat4x4/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x4/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x4 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = (tint_symbol_1 + 1.0f);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float4x4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = ((*(tint_private_vars)).t + 1.0f);
   return float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
 }
 
-void f() {
-  float4x4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x4 const tint_symbol = m(tint_private_vars);
   half4x4 v = half4x4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x4/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x4/literal/f16-f32.wgsl.expected.msl
index 466ceaa..995f4f2 100644
--- a/test/tint/expressions/type_conv/mat4x4/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x4/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat4x4/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x4/literal/f32-f16.wgsl.expected.msl
index 466ceaa..c148161 100644
--- a/test/tint/expressions/type_conv/mat4x4/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x4/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/mat4x4/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x4/var/f16-f32.wgsl.expected.msl
index 49daf03..2fd6ca2 100644
--- a/test/tint/expressions/type_conv/mat4x4/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x4/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half4x4 tint_symbol = half4x4(half4(1.0h, 2.0h, 3.0h, 4.0h), half4(5.0h, 6.0h, 7.0h, 8.0h), half4(9.0h, 10.0h, 11.0h, 12.0h), half4(13.0h, 14.0h, 15.0h, 16.0h));
-  float4x4 v = float4x4(tint_symbol);
+struct tint_private_vars_struct {
+  half4x4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x4 v = float4x4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/mat4x4/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/mat4x4/var/f32-f16.wgsl.expected.msl
index f9fcc86..67c793b 100644
--- a/test/tint/expressions/type_conv/mat4x4/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/mat4x4/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float4x4 tint_symbol = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
-  half4x4 v = half4x4(tint_symbol);
+struct tint_private_vars_struct {
+  float4x4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x4 v = half4x4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/bool-f16.wgsl.expected.msl
index 13e2076..f8adf7d 100644
--- a/test/tint/expressions/type_conv/scalar/function/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/bool-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const tint_symbol = m(tint_private_vars);
   half v = half(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/bool-f32.wgsl.expected.msl
index c6b5797..3e5574a 100644
--- a/test/tint/expressions/type_conv/scalar/function/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/bool-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const tint_symbol = m(tint_private_vars);
   float v = float(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/bool-i32.wgsl.expected.msl
index 7c99561..7efe663 100644
--- a/test/tint/expressions/type_conv/scalar/function/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/bool-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const tint_symbol = m(tint_private_vars);
   int v = int(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/bool-u32.wgsl.expected.msl
index 4a602ec..4592e1d 100644
--- a/test/tint/expressions/type_conv/scalar/function/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/bool-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const tint_symbol = m(tint_private_vars);
   uint v = uint(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f16-bool.wgsl.expected.msl
index 4d00356..08eaec1 100644
--- a/test/tint/expressions/type_conv/scalar/function/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f16-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half((*(tint_private_vars)).t);
 }
 
-void f() {
-  half const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const tint_symbol = m(tint_private_vars);
   bool v = bool(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f16-f32.wgsl.expected.msl
index 18a11d6..d95efeb 100644
--- a/test/tint/expressions/type_conv/scalar/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half((*(tint_private_vars)).t);
 }
 
-void f() {
-  half const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const tint_symbol = m(tint_private_vars);
   float v = float(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f16-i32.wgsl.expected.msl
index 44bc84b..a99a492 100644
--- a/test/tint/expressions/type_conv/scalar/function/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f16-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half((*(tint_private_vars)).t);
 }
 
-void f() {
-  half const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const tint_symbol = m(tint_private_vars);
   int v = int(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f16-u32.wgsl.expected.msl
index 5d8e34b..40191ab 100644
--- a/test/tint/expressions/type_conv/scalar/function/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f16-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half((*(tint_private_vars)).t);
 }
 
-void f() {
-  half const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const tint_symbol = m(tint_private_vars);
   uint v = uint(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f32-bool.wgsl.expected.msl
index 3a2a4b5..6f4ba1f 100644
--- a/test/tint/expressions/type_conv/scalar/function/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float((*(tint_private_vars)).t);
 }
 
-void f() {
-  float const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const tint_symbol = m(tint_private_vars);
   bool v = bool(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f32-f16.wgsl.expected.msl
index a65e586..90ce00b 100644
--- a/test/tint/expressions/type_conv/scalar/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float((*(tint_private_vars)).t);
 }
 
-void f() {
-  float const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const tint_symbol = m(tint_private_vars);
   half v = half(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f32-i32.wgsl.expected.msl
index fe4bcc0..d9e37b1 100644
--- a/test/tint/expressions/type_conv/scalar/function/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f32-i32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 int tint_ftoi(float v) {
   return select(2147483647, select(int(v), (-2147483647 - 1), (v < -2147483648.0f)), (v < 2147483520.0f));
 }
 
-float m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float(tint_symbol_1);
+float m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float((*(tint_private_vars)).t);
 }
 
-void f() {
-  float const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const tint_symbol = m(tint_private_vars);
   int v = tint_ftoi(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/f32-u32.wgsl.expected.msl
index a6a6b55..f99b9c9 100644
--- a/test/tint/expressions/type_conv/scalar/function/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/f32-u32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 uint tint_ftou(float v) {
   return select(4294967295u, select(uint(v), 0u, (v < 0.0f)), (v < 4294967040.0f));
 }
 
-float m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float(tint_symbol_1);
+float m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float((*(tint_private_vars)).t);
 }
 
-void f() {
-  float const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const tint_symbol = m(tint_private_vars);
   uint v = tint_ftou(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/i32-bool.wgsl.expected.msl
index cf82994..96f9e32 100644
--- a/test/tint/expressions/type_conv/scalar/function/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/i32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int((*(tint_private_vars)).t);
 }
 
-void f() {
-  int const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const tint_symbol = m(tint_private_vars);
   bool v = bool(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/i32-f16.wgsl.expected.msl
index cfccce0..58b0431 100644
--- a/test/tint/expressions/type_conv/scalar/function/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/i32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int((*(tint_private_vars)).t);
 }
 
-void f() {
-  int const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const tint_symbol = m(tint_private_vars);
   half v = half(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/i32-f32.wgsl.expected.msl
index a2b48e0..f8b151e 100644
--- a/test/tint/expressions/type_conv/scalar/function/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/i32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int((*(tint_private_vars)).t);
 }
 
-void f() {
-  int const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const tint_symbol = m(tint_private_vars);
   float v = float(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/i32-u32.wgsl.expected.msl
index f295700..8d21d45 100644
--- a/test/tint/expressions/type_conv/scalar/function/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/i32-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int((*(tint_private_vars)).t);
 }
 
-void f() {
-  int const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const tint_symbol = m(tint_private_vars);
   uint v = uint(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/u32-bool.wgsl.expected.msl
index 46cd474..428f2a1 100644
--- a/test/tint/expressions/type_conv/scalar/function/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/u32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const tint_symbol = m(tint_private_vars);
   bool v = bool(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/u32-f16.wgsl.expected.msl
index d609ec8..6302517 100644
--- a/test/tint/expressions/type_conv/scalar/function/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/u32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const tint_symbol = m(tint_private_vars);
   half v = half(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/u32-f32.wgsl.expected.msl
index 90b2f09..dc2024f 100644
--- a/test/tint/expressions/type_conv/scalar/function/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/u32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const tint_symbol = m(tint_private_vars);
   float v = float(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/function/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/function/u32-i32.wgsl.expected.msl
index 48e8bcd..6b73fd5 100644
--- a/test/tint/expressions/type_conv/scalar/function/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/function/u32-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const tint_symbol = m(tint_private_vars);
   int v = int(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/literal/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/bool-f16.wgsl.expected.msl
index 466ceaa..ab0a10f 100644
--- a/test/tint/expressions/type_conv/scalar/literal/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/bool-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/bool-f32.wgsl.expected.msl
index 466ceaa..527c64c 100644
--- a/test/tint/expressions/type_conv/scalar/literal/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/bool-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/bool-i32.wgsl.expected.msl
index 466ceaa..1d12087 100644
--- a/test/tint/expressions/type_conv/scalar/literal/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/bool-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/bool-u32.wgsl.expected.msl
index 466ceaa..05f1fec 100644
--- a/test/tint/expressions/type_conv/scalar/literal/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/bool-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f16-bool.wgsl.expected.msl
index 466ceaa..78c0f7d 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f16-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f16-f32.wgsl.expected.msl
index 466ceaa..527c64c 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f16-i32.wgsl.expected.msl
index 466ceaa..1d12087 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f16-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f16-u32.wgsl.expected.msl
index 466ceaa..05f1fec 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f16-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f32-bool.wgsl.expected.msl
index 466ceaa..78c0f7d 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f32-f16.wgsl.expected.msl
index 466ceaa..ab0a10f 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f32-i32.wgsl.expected.msl
index 466ceaa..1d12087 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/f32-u32.wgsl.expected.msl
index 466ceaa..05f1fec 100644
--- a/test/tint/expressions/type_conv/scalar/literal/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/f32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/i32-bool.wgsl.expected.msl
index 466ceaa..78c0f7d 100644
--- a/test/tint/expressions/type_conv/scalar/literal/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/i32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/i32-f16.wgsl.expected.msl
index 466ceaa..ab0a10f 100644
--- a/test/tint/expressions/type_conv/scalar/literal/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/i32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/i32-f32.wgsl.expected.msl
index 466ceaa..527c64c 100644
--- a/test/tint/expressions/type_conv/scalar/literal/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/i32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/i32-u32.wgsl.expected.msl
index 466ceaa..05f1fec 100644
--- a/test/tint/expressions/type_conv/scalar/literal/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/i32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/u32-bool.wgsl.expected.msl
index 466ceaa..78c0f7d 100644
--- a/test/tint/expressions/type_conv/scalar/literal/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/u32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/u32-f16.wgsl.expected.msl
index 466ceaa..ab0a10f 100644
--- a/test/tint/expressions/type_conv/scalar/literal/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/u32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/u32-f32.wgsl.expected.msl
index 466ceaa..527c64c 100644
--- a/test/tint/expressions/type_conv/scalar/literal/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/u32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/literal/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/literal/u32-i32.wgsl.expected.msl
index 466ceaa..1d12087 100644
--- a/test/tint/expressions/type_conv/scalar/literal/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/literal/u32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int u;
+};
+
diff --git a/test/tint/expressions/type_conv/scalar/var/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/bool-f16.wgsl.expected.msl
index 6eee947..63dd49b 100644
--- a/test/tint/expressions/type_conv/scalar/var/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/bool-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool tint_symbol = true;
-  half const v = half(tint_symbol);
+struct tint_private_vars_struct {
+  bool u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const v = half((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/bool-f32.wgsl.expected.msl
index ce17ffc..ff3751f 100644
--- a/test/tint/expressions/type_conv/scalar/var/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/bool-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool tint_symbol = true;
-  float const v = float(tint_symbol);
+struct tint_private_vars_struct {
+  bool u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const v = float((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/bool-i32.wgsl.expected.msl
index fd91404..c13a77e 100644
--- a/test/tint/expressions/type_conv/scalar/var/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/bool-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool tint_symbol = true;
-  int const v = int(tint_symbol);
+struct tint_private_vars_struct {
+  bool u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const v = int((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/bool-u32.wgsl.expected.msl
index 6848120..93b0b35 100644
--- a/test/tint/expressions/type_conv/scalar/var/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/bool-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool tint_symbol = true;
-  uint const v = uint(tint_symbol);
+struct tint_private_vars_struct {
+  bool u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const v = uint((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f16-bool.wgsl.expected.msl
index 880b1c6..aceab0a 100644
--- a/test/tint/expressions/type_conv/scalar/var/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f16-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half tint_symbol = 1.0h;
-  bool const v = bool(tint_symbol);
+struct tint_private_vars_struct {
+  half u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const v = bool((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f16-f32.wgsl.expected.msl
index 1b283ad..799649e 100644
--- a/test/tint/expressions/type_conv/scalar/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half tint_symbol = 1.0h;
-  float const v = float(tint_symbol);
+struct tint_private_vars_struct {
+  half u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const v = float((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f16-i32.wgsl.expected.msl
index 52d4f2d..e5b766e 100644
--- a/test/tint/expressions/type_conv/scalar/var/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f16-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half tint_symbol = 1.0h;
-  int const v = int(tint_symbol);
+struct tint_private_vars_struct {
+  half u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const v = int((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f16-u32.wgsl.expected.msl
index c8d0827..b7e333a 100644
--- a/test/tint/expressions/type_conv/scalar/var/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f16-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half tint_symbol = 1.0h;
-  uint const v = uint(tint_symbol);
+struct tint_private_vars_struct {
+  half u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const v = uint((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f32-bool.wgsl.expected.msl
index 9c7f704..56f9662 100644
--- a/test/tint/expressions/type_conv/scalar/var/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float tint_symbol = 1.0f;
-  bool const v = bool(tint_symbol);
+struct tint_private_vars_struct {
+  float u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const v = bool((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f32-f16.wgsl.expected.msl
index 0889335..57dab55 100644
--- a/test/tint/expressions/type_conv/scalar/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float tint_symbol = 1.0f;
-  half const v = half(tint_symbol);
+struct tint_private_vars_struct {
+  float u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const v = half((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f32-i32.wgsl.expected.msl
index 8da1016..487685b 100644
--- a/test/tint/expressions/type_conv/scalar/var/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f32-i32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float u;
+};
+
 int tint_ftoi(float v) {
   return select(2147483647, select(int(v), (-2147483647 - 1), (v < -2147483648.0f)), (v < 2147483520.0f));
 }
 
-void f() {
-  thread float tint_symbol = 1.0f;
-  int const v = tint_ftoi(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const v = tint_ftoi((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/f32-u32.wgsl.expected.msl
index 1066099..c7b8e3d 100644
--- a/test/tint/expressions/type_conv/scalar/var/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/f32-u32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float u;
+};
+
 uint tint_ftou(float v) {
   return select(4294967295u, select(uint(v), 0u, (v < 0.0f)), (v < 4294967040.0f));
 }
 
-void f() {
-  thread float tint_symbol = 1.0f;
-  uint const v = tint_ftou(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const v = tint_ftou((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/i32-bool.wgsl.expected.msl
index 49b25d1d..d549f00 100644
--- a/test/tint/expressions/type_conv/scalar/var/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/i32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int tint_symbol = 1;
-  bool const v = bool(tint_symbol);
+struct tint_private_vars_struct {
+  int u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const v = bool((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/i32-f16.wgsl.expected.msl
index edce6bd..372a6bd 100644
--- a/test/tint/expressions/type_conv/scalar/var/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/i32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int tint_symbol = 1;
-  half const v = half(tint_symbol);
+struct tint_private_vars_struct {
+  int u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const v = half((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/i32-f32.wgsl.expected.msl
index b2a4096..b6243ef 100644
--- a/test/tint/expressions/type_conv/scalar/var/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/i32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int tint_symbol = 1;
-  float const v = float(tint_symbol);
+struct tint_private_vars_struct {
+  int u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const v = float((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/i32-u32.wgsl.expected.msl
index 1a40f99..b9cdde7 100644
--- a/test/tint/expressions/type_conv/scalar/var/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/i32-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int tint_symbol = 1;
-  uint const v = uint(tint_symbol);
+struct tint_private_vars_struct {
+  int u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint const v = uint((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/u32-bool.wgsl.expected.msl
index 55679d4..1d0fda1 100644
--- a/test/tint/expressions/type_conv/scalar/var/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/u32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint tint_symbol = 1u;
-  bool const v = bool(tint_symbol);
+struct tint_private_vars_struct {
+  uint u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool const v = bool((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/u32-f16.wgsl.expected.msl
index 5c3ef66..fd6c217 100644
--- a/test/tint/expressions/type_conv/scalar/var/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/u32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint tint_symbol = 1u;
-  half const v = half(tint_symbol);
+struct tint_private_vars_struct {
+  uint u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half const v = half((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/u32-f32.wgsl.expected.msl
index 4b942e2..9ba0684 100644
--- a/test/tint/expressions/type_conv/scalar/var/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/u32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint tint_symbol = 1u;
-  float const v = float(tint_symbol);
+struct tint_private_vars_struct {
+  uint u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float const v = float((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/scalar/var/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/scalar/var/u32-i32.wgsl.expected.msl
index 27c9c43..6a431a2 100644
--- a/test/tint/expressions/type_conv/scalar/var/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/scalar/var/u32-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint tint_symbol = 1u;
-  int const v = int(tint_symbol);
+struct tint_private_vars_struct {
+  uint u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int const v = int((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/bool-f16.wgsl.expected.msl
index 6c42347..fc874e8 100644
--- a/test/tint/expressions/type_conv/vec2/function/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/bool-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool2 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool2(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool2((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const tint_symbol = m(tint_private_vars);
   half2 v = half2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/bool-f32.wgsl.expected.msl
index eeb0bdb..3cf9b04 100644
--- a/test/tint/expressions/type_conv/vec2/function/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/bool-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool2 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool2(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool2((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const tint_symbol = m(tint_private_vars);
   float2 v = float2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/bool-i32.wgsl.expected.msl
index 0b09693..11465fb 100644
--- a/test/tint/expressions/type_conv/vec2/function/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/bool-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool2 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool2(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool2((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const tint_symbol = m(tint_private_vars);
   int2 v = int2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/bool-u32.wgsl.expected.msl
index 3e1872a..06db712 100644
--- a/test/tint/expressions/type_conv/vec2/function/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/bool-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool2 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool2(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool2((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const tint_symbol = m(tint_private_vars);
   uint2 v = uint2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f16-bool.wgsl.expected.msl
index 2004729..64e116f 100644
--- a/test/tint/expressions/type_conv/vec2/function/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f16-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half2(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half2((*(tint_private_vars)).t);
 }
 
-void f() {
-  half2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const tint_symbol = m(tint_private_vars);
   bool2 v = bool2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f16-f32.wgsl.expected.msl
index e055110..b36f5e9 100644
--- a/test/tint/expressions/type_conv/vec2/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half2(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half2((*(tint_private_vars)).t);
 }
 
-void f() {
-  half2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const tint_symbol = m(tint_private_vars);
   float2 v = float2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f16-i32.wgsl.expected.msl
index 33275d5..828c8a4 100644
--- a/test/tint/expressions/type_conv/vec2/function/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f16-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half2(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half2((*(tint_private_vars)).t);
 }
 
-void f() {
-  half2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const tint_symbol = m(tint_private_vars);
   int2 v = int2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f16-u32.wgsl.expected.msl
index 513e6c3..c3b8511 100644
--- a/test/tint/expressions/type_conv/vec2/function/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f16-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half2(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half2((*(tint_private_vars)).t);
 }
 
-void f() {
-  half2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const tint_symbol = m(tint_private_vars);
   uint2 v = uint2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f32-bool.wgsl.expected.msl
index d4ec1a9..a9f06c2 100644
--- a/test/tint/expressions/type_conv/vec2/function/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float2(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float2((*(tint_private_vars)).t);
 }
 
-void f() {
-  float2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const tint_symbol = m(tint_private_vars);
   bool2 v = bool2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f32-f16.wgsl.expected.msl
index 73cfab0..e8d5844 100644
--- a/test/tint/expressions/type_conv/vec2/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float2(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float2((*(tint_private_vars)).t);
 }
 
-void f() {
-  float2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const tint_symbol = m(tint_private_vars);
   half2 v = half2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f32-i32.wgsl.expected.msl
index 0a7e0fc..e33bfc1 100644
--- a/test/tint/expressions/type_conv/vec2/function/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f32-i32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 int2 tint_ftoi(float2 v) {
   return select(int2(2147483647), select(int2(v), int2((-2147483647 - 1)), (v < float2(-2147483648.0f))), (v < float2(2147483520.0f)));
 }
 
-float2 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float2(tint_symbol_1);
+float2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float2((*(tint_private_vars)).t);
 }
 
-void f() {
-  float2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const tint_symbol = m(tint_private_vars);
   int2 v = tint_ftoi(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/f32-u32.wgsl.expected.msl
index cd029ff..01ed808 100644
--- a/test/tint/expressions/type_conv/vec2/function/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/f32-u32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 uint2 tint_ftou(float2 v) {
   return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
 }
 
-float2 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float2(tint_symbol_1);
+float2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float2((*(tint_private_vars)).t);
 }
 
-void f() {
-  float2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const tint_symbol = m(tint_private_vars);
   uint2 v = tint_ftou(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/i32-bool.wgsl.expected.msl
index 1c14c71..b63ded5 100644
--- a/test/tint/expressions/type_conv/vec2/function/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/i32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int2 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int2(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int2((*(tint_private_vars)).t);
 }
 
-void f() {
-  int2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const tint_symbol = m(tint_private_vars);
   bool2 v = bool2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/i32-f16.wgsl.expected.msl
index 7b4fe5dd..fc7d6a5 100644
--- a/test/tint/expressions/type_conv/vec2/function/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/i32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int2 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int2(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int2((*(tint_private_vars)).t);
 }
 
-void f() {
-  int2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const tint_symbol = m(tint_private_vars);
   half2 v = half2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/i32-f32.wgsl.expected.msl
index da1158d..7609550 100644
--- a/test/tint/expressions/type_conv/vec2/function/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/i32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int2 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int2(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int2((*(tint_private_vars)).t);
 }
 
-void f() {
-  int2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const tint_symbol = m(tint_private_vars);
   float2 v = float2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/i32-u32.wgsl.expected.msl
index 8fdd642..e94ee20 100644
--- a/test/tint/expressions/type_conv/vec2/function/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/i32-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int2 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int2(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int2((*(tint_private_vars)).t);
 }
 
-void f() {
-  int2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const tint_symbol = m(tint_private_vars);
   uint2 v = uint2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/u32-bool.wgsl.expected.msl
index 7769587..16f0432 100644
--- a/test/tint/expressions/type_conv/vec2/function/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/u32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint2 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint2(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint2((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const tint_symbol = m(tint_private_vars);
   bool2 v = bool2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/u32-f16.wgsl.expected.msl
index 9084e89..c118ec6 100644
--- a/test/tint/expressions/type_conv/vec2/function/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/u32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint2 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint2(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint2((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const tint_symbol = m(tint_private_vars);
   half2 v = half2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/u32-f32.wgsl.expected.msl
index aa82be3..2b1dc45 100644
--- a/test/tint/expressions/type_conv/vec2/function/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/u32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint2 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint2(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint2((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const tint_symbol = m(tint_private_vars);
   float2 v = float2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/function/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/function/u32-i32.wgsl.expected.msl
index e756c24..d9aa022 100644
--- a/test/tint/expressions/type_conv/vec2/function/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/function/u32-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint2 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint2(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint2 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint2((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint2 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const tint_symbol = m(tint_private_vars);
   int2 v = int2(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/literal/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/bool-f16.wgsl.expected.msl
index 466ceaa..c821345 100644
--- a/test/tint/expressions/type_conv/vec2/literal/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/bool-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/bool-f32.wgsl.expected.msl
index 466ceaa..d1e4770 100644
--- a/test/tint/expressions/type_conv/vec2/literal/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/bool-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/bool-i32.wgsl.expected.msl
index 466ceaa..94fe4fe 100644
--- a/test/tint/expressions/type_conv/vec2/literal/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/bool-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/bool-u32.wgsl.expected.msl
index 466ceaa..35ee17b 100644
--- a/test/tint/expressions/type_conv/vec2/literal/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/bool-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f16-bool.wgsl.expected.msl
index 466ceaa..f5e7dd3 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f16-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f16-f32.wgsl.expected.msl
index 466ceaa..d1e4770 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f16-i32.wgsl.expected.msl
index 466ceaa..94fe4fe 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f16-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f16-u32.wgsl.expected.msl
index 466ceaa..35ee17b 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f16-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f32-bool.wgsl.expected.msl
index 466ceaa..f5e7dd3 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f32-f16.wgsl.expected.msl
index 466ceaa..c821345 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f32-i32.wgsl.expected.msl
index 466ceaa..94fe4fe 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/f32-u32.wgsl.expected.msl
index 466ceaa..35ee17b 100644
--- a/test/tint/expressions/type_conv/vec2/literal/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/f32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/i32-bool.wgsl.expected.msl
index 466ceaa..f5e7dd3 100644
--- a/test/tint/expressions/type_conv/vec2/literal/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/i32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/i32-f16.wgsl.expected.msl
index 466ceaa..c821345 100644
--- a/test/tint/expressions/type_conv/vec2/literal/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/i32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/i32-f32.wgsl.expected.msl
index 466ceaa..d1e4770 100644
--- a/test/tint/expressions/type_conv/vec2/literal/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/i32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/i32-u32.wgsl.expected.msl
index 466ceaa..35ee17b 100644
--- a/test/tint/expressions/type_conv/vec2/literal/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/i32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/u32-bool.wgsl.expected.msl
index 466ceaa..f5e7dd3 100644
--- a/test/tint/expressions/type_conv/vec2/literal/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/u32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/u32-f16.wgsl.expected.msl
index 466ceaa..c821345 100644
--- a/test/tint/expressions/type_conv/vec2/literal/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/u32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/u32-f32.wgsl.expected.msl
index 466ceaa..d1e4770 100644
--- a/test/tint/expressions/type_conv/vec2/literal/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/u32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/literal/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/literal/u32-i32.wgsl.expected.msl
index 466ceaa..94fe4fe 100644
--- a/test/tint/expressions/type_conv/vec2/literal/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/literal/u32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int2 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec2/var/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/bool-f16.wgsl.expected.msl
index 50b8a45..f291eeb 100644
--- a/test/tint/expressions/type_conv/vec2/var/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/bool-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool2 tint_symbol = bool2(true);
-  half2 const v = half2(tint_symbol);
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const v = half2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/bool-f32.wgsl.expected.msl
index 5c9d60f..1fae680 100644
--- a/test/tint/expressions/type_conv/vec2/var/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/bool-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool2 tint_symbol = bool2(true);
-  float2 const v = float2(tint_symbol);
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const v = float2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/bool-i32.wgsl.expected.msl
index 991f2e2..c855442 100644
--- a/test/tint/expressions/type_conv/vec2/var/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/bool-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool2 tint_symbol = bool2(true);
-  int2 const v = int2(tint_symbol);
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const v = int2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/bool-u32.wgsl.expected.msl
index 9f059ba..f245de0 100644
--- a/test/tint/expressions/type_conv/vec2/var/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/bool-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool2 tint_symbol = bool2(true);
-  uint2 const v = uint2(tint_symbol);
+struct tint_private_vars_struct {
+  bool2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const v = uint2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f16-bool.wgsl.expected.msl
index 037cd2a..221c448 100644
--- a/test/tint/expressions/type_conv/vec2/var/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f16-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half2 tint_symbol = half2(1.0h);
-  bool2 const v = bool2(tint_symbol);
+struct tint_private_vars_struct {
+  half2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const v = bool2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f16-f32.wgsl.expected.msl
index 05fbb7b..84edd7b 100644
--- a/test/tint/expressions/type_conv/vec2/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half2 tint_symbol = half2(1.0h);
-  float2 const v = float2(tint_symbol);
+struct tint_private_vars_struct {
+  half2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const v = float2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f16-i32.wgsl.expected.msl
index 29983d2..e631481 100644
--- a/test/tint/expressions/type_conv/vec2/var/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f16-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half2 tint_symbol = half2(1.0h);
-  int2 const v = int2(tint_symbol);
+struct tint_private_vars_struct {
+  half2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const v = int2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f16-u32.wgsl.expected.msl
index a1fa18b..8205a36 100644
--- a/test/tint/expressions/type_conv/vec2/var/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f16-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half2 tint_symbol = half2(1.0h);
-  uint2 const v = uint2(tint_symbol);
+struct tint_private_vars_struct {
+  half2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const v = uint2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f32-bool.wgsl.expected.msl
index 3d5f21b..1382eca 100644
--- a/test/tint/expressions/type_conv/vec2/var/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float2 tint_symbol = float2(1.0f);
-  bool2 const v = bool2(tint_symbol);
+struct tint_private_vars_struct {
+  float2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const v = bool2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f32-f16.wgsl.expected.msl
index d2b64ff..24b6342 100644
--- a/test/tint/expressions/type_conv/vec2/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float2 tint_symbol = float2(1.0f);
-  half2 const v = half2(tint_symbol);
+struct tint_private_vars_struct {
+  float2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const v = half2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f32-i32.wgsl.expected.msl
index 4475d07..0b65c82 100644
--- a/test/tint/expressions/type_conv/vec2/var/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f32-i32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 u;
+};
+
 int2 tint_ftoi(float2 v) {
   return select(int2(2147483647), select(int2(v), int2((-2147483647 - 1)), (v < float2(-2147483648.0f))), (v < float2(2147483520.0f)));
 }
 
-void f() {
-  thread float2 tint_symbol = float2(1.0f);
-  int2 const v = tint_ftoi(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const v = tint_ftoi((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/f32-u32.wgsl.expected.msl
index 86a4038..dc1cf0f 100644
--- a/test/tint/expressions/type_conv/vec2/var/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/f32-u32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 u;
+};
+
 uint2 tint_ftou(float2 v) {
   return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
 }
 
-void f() {
-  thread float2 tint_symbol = float2(1.0f);
-  uint2 const v = tint_ftou(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const v = tint_ftou((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/i32-bool.wgsl.expected.msl
index c5ca441..ad05fce 100644
--- a/test/tint/expressions/type_conv/vec2/var/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/i32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int2 tint_symbol = int2(1);
-  bool2 const v = bool2(tint_symbol);
+struct tint_private_vars_struct {
+  int2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const v = bool2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/i32-f16.wgsl.expected.msl
index 04719bc..451b032 100644
--- a/test/tint/expressions/type_conv/vec2/var/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/i32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int2 tint_symbol = int2(1);
-  half2 const v = half2(tint_symbol);
+struct tint_private_vars_struct {
+  int2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const v = half2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/i32-f32.wgsl.expected.msl
index 8a2b0e0..d75729e 100644
--- a/test/tint/expressions/type_conv/vec2/var/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/i32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int2 tint_symbol = int2(1);
-  float2 const v = float2(tint_symbol);
+struct tint_private_vars_struct {
+  int2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const v = float2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/i32-u32.wgsl.expected.msl
index 5d396c1..d9a90e5 100644
--- a/test/tint/expressions/type_conv/vec2/var/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/i32-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int2 tint_symbol = int2(1);
-  uint2 const v = uint2(tint_symbol);
+struct tint_private_vars_struct {
+  int2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint2 const v = uint2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/u32-bool.wgsl.expected.msl
index 50cd6d8..1159c919 100644
--- a/test/tint/expressions/type_conv/vec2/var/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/u32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint2 tint_symbol = uint2(1u);
-  bool2 const v = bool2(tint_symbol);
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool2 const v = bool2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/u32-f16.wgsl.expected.msl
index 9caedc8..319f8b4 100644
--- a/test/tint/expressions/type_conv/vec2/var/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/u32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint2 tint_symbol = uint2(1u);
-  half2 const v = half2(tint_symbol);
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2 const v = half2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/u32-f32.wgsl.expected.msl
index 17e895b..61d06b8 100644
--- a/test/tint/expressions/type_conv/vec2/var/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/u32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint2 tint_symbol = uint2(1u);
-  float2 const v = float2(tint_symbol);
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2 const v = float2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec2/var/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec2/var/u32-i32.wgsl.expected.msl
index f5357b7..2db80cd 100644
--- a/test/tint/expressions/type_conv/vec2/var/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec2/var/u32-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint2 tint_symbol = uint2(1u);
-  int2 const v = int2(tint_symbol);
+struct tint_private_vars_struct {
+  uint2 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int2 const v = int2((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/bool-f16.wgsl.expected.msl
index 395f628..020bf09 100644
--- a/test/tint/expressions/type_conv/vec3/function/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/bool-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool3 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool3(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool3((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const tint_symbol = m(tint_private_vars);
   half3 v = half3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/bool-f32.wgsl.expected.msl
index 62f5fd8..f25f8b4 100644
--- a/test/tint/expressions/type_conv/vec3/function/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/bool-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool3 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool3(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool3((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const tint_symbol = m(tint_private_vars);
   float3 v = float3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/bool-i32.wgsl.expected.msl
index 09909de..a1ced99 100644
--- a/test/tint/expressions/type_conv/vec3/function/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/bool-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool3 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool3(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool3((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const tint_symbol = m(tint_private_vars);
   int3 v = int3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/bool-u32.wgsl.expected.msl
index 5bbce2f..c1d21d0 100644
--- a/test/tint/expressions/type_conv/vec3/function/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/bool-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool3 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool3(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool3((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const tint_symbol = m(tint_private_vars);
   uint3 v = uint3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f16-bool.wgsl.expected.msl
index da20e42..170fe5f 100644
--- a/test/tint/expressions/type_conv/vec3/function/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f16-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half3(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half3((*(tint_private_vars)).t);
 }
 
-void f() {
-  half3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const tint_symbol = m(tint_private_vars);
   bool3 v = bool3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f16-f32.wgsl.expected.msl
index 5dabf99..6cb6edb 100644
--- a/test/tint/expressions/type_conv/vec3/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half3(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half3((*(tint_private_vars)).t);
 }
 
-void f() {
-  half3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const tint_symbol = m(tint_private_vars);
   float3 v = float3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f16-i32.wgsl.expected.msl
index c4314ec..6b1cbe4 100644
--- a/test/tint/expressions/type_conv/vec3/function/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f16-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half3(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half3((*(tint_private_vars)).t);
 }
 
-void f() {
-  half3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const tint_symbol = m(tint_private_vars);
   int3 v = int3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f16-u32.wgsl.expected.msl
index 5922e4a..e1efb91 100644
--- a/test/tint/expressions/type_conv/vec3/function/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f16-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half3(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half3((*(tint_private_vars)).t);
 }
 
-void f() {
-  half3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const tint_symbol = m(tint_private_vars);
   uint3 v = uint3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f32-bool.wgsl.expected.msl
index d12e499..1cf0740 100644
--- a/test/tint/expressions/type_conv/vec3/function/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float3(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float3((*(tint_private_vars)).t);
 }
 
-void f() {
-  float3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const tint_symbol = m(tint_private_vars);
   bool3 v = bool3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f32-f16.wgsl.expected.msl
index 3e39af3..f449802 100644
--- a/test/tint/expressions/type_conv/vec3/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float3(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float3((*(tint_private_vars)).t);
 }
 
-void f() {
-  float3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const tint_symbol = m(tint_private_vars);
   half3 v = half3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f32-i32.wgsl.expected.msl
index 17b35db..345e554 100644
--- a/test/tint/expressions/type_conv/vec3/function/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f32-i32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 int3 tint_ftoi(float3 v) {
   return select(int3(2147483647), select(int3(v), int3((-2147483647 - 1)), (v < float3(-2147483648.0f))), (v < float3(2147483520.0f)));
 }
 
-float3 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float3(tint_symbol_1);
+float3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float3((*(tint_private_vars)).t);
 }
 
-void f() {
-  float3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const tint_symbol = m(tint_private_vars);
   int3 v = tint_ftoi(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/f32-u32.wgsl.expected.msl
index f5e5a53..fc37190 100644
--- a/test/tint/expressions/type_conv/vec3/function/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/f32-u32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 uint3 tint_ftou(float3 v) {
   return select(uint3(4294967295u), select(uint3(v), uint3(0u), (v < float3(0.0f))), (v < float3(4294967040.0f)));
 }
 
-float3 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float3(tint_symbol_1);
+float3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float3((*(tint_private_vars)).t);
 }
 
-void f() {
-  float3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const tint_symbol = m(tint_private_vars);
   uint3 v = tint_ftou(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/i32-bool.wgsl.expected.msl
index 2f3ed22..1b7cf6f 100644
--- a/test/tint/expressions/type_conv/vec3/function/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/i32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int3 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int3(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int3((*(tint_private_vars)).t);
 }
 
-void f() {
-  int3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const tint_symbol = m(tint_private_vars);
   bool3 v = bool3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/i32-f16.wgsl.expected.msl
index 4ae6a3f..070fee8 100644
--- a/test/tint/expressions/type_conv/vec3/function/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/i32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int3 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int3(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int3((*(tint_private_vars)).t);
 }
 
-void f() {
-  int3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const tint_symbol = m(tint_private_vars);
   half3 v = half3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/i32-f32.wgsl.expected.msl
index 3c0bdd9..a758f87 100644
--- a/test/tint/expressions/type_conv/vec3/function/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/i32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int3 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int3(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int3((*(tint_private_vars)).t);
 }
 
-void f() {
-  int3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const tint_symbol = m(tint_private_vars);
   float3 v = float3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/i32-u32.wgsl.expected.msl
index cf18af6..72ba097 100644
--- a/test/tint/expressions/type_conv/vec3/function/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/i32-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int3 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int3(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int3((*(tint_private_vars)).t);
 }
 
-void f() {
-  int3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const tint_symbol = m(tint_private_vars);
   uint3 v = uint3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/u32-bool.wgsl.expected.msl
index 41a8184..a68a703 100644
--- a/test/tint/expressions/type_conv/vec3/function/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/u32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint3 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint3(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint3((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const tint_symbol = m(tint_private_vars);
   bool3 v = bool3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/u32-f16.wgsl.expected.msl
index f48f91e..aa74044 100644
--- a/test/tint/expressions/type_conv/vec3/function/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/u32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint3 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint3(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint3((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const tint_symbol = m(tint_private_vars);
   half3 v = half3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/u32-f32.wgsl.expected.msl
index 33b31ab..f67422d 100644
--- a/test/tint/expressions/type_conv/vec3/function/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/u32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint3 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint3(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint3((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const tint_symbol = m(tint_private_vars);
   float3 v = float3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/function/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/function/u32-i32.wgsl.expected.msl
index 13a2070..a48f41c 100644
--- a/test/tint/expressions/type_conv/vec3/function/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/function/u32-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint3 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint3(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint3 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint3((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint3 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const tint_symbol = m(tint_private_vars);
   int3 v = int3(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/literal/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/bool-f16.wgsl.expected.msl
index 466ceaa..c4a75c5 100644
--- a/test/tint/expressions/type_conv/vec3/literal/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/bool-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/bool-f32.wgsl.expected.msl
index 466ceaa..3c10853 100644
--- a/test/tint/expressions/type_conv/vec3/literal/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/bool-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/bool-i32.wgsl.expected.msl
index 466ceaa..16f636c 100644
--- a/test/tint/expressions/type_conv/vec3/literal/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/bool-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/bool-u32.wgsl.expected.msl
index 466ceaa..b718a23 100644
--- a/test/tint/expressions/type_conv/vec3/literal/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/bool-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f16-bool.wgsl.expected.msl
index 466ceaa..bd5fbf6 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f16-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f16-f32.wgsl.expected.msl
index 466ceaa..3c10853 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f16-i32.wgsl.expected.msl
index 466ceaa..16f636c 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f16-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f16-u32.wgsl.expected.msl
index 466ceaa..b718a23 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f16-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f32-bool.wgsl.expected.msl
index 466ceaa..bd5fbf6 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f32-f16.wgsl.expected.msl
index 466ceaa..c4a75c5 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f32-i32.wgsl.expected.msl
index 466ceaa..16f636c 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/f32-u32.wgsl.expected.msl
index 466ceaa..b718a23 100644
--- a/test/tint/expressions/type_conv/vec3/literal/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/f32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/i32-bool.wgsl.expected.msl
index 466ceaa..bd5fbf6 100644
--- a/test/tint/expressions/type_conv/vec3/literal/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/i32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/i32-f16.wgsl.expected.msl
index 466ceaa..c4a75c5 100644
--- a/test/tint/expressions/type_conv/vec3/literal/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/i32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/i32-f32.wgsl.expected.msl
index 466ceaa..3c10853 100644
--- a/test/tint/expressions/type_conv/vec3/literal/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/i32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/i32-u32.wgsl.expected.msl
index 466ceaa..b718a23 100644
--- a/test/tint/expressions/type_conv/vec3/literal/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/i32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/u32-bool.wgsl.expected.msl
index 466ceaa..bd5fbf6 100644
--- a/test/tint/expressions/type_conv/vec3/literal/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/u32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/u32-f16.wgsl.expected.msl
index 466ceaa..c4a75c5 100644
--- a/test/tint/expressions/type_conv/vec3/literal/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/u32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/u32-f32.wgsl.expected.msl
index 466ceaa..3c10853 100644
--- a/test/tint/expressions/type_conv/vec3/literal/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/u32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/literal/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/literal/u32-i32.wgsl.expected.msl
index 466ceaa..16f636c 100644
--- a/test/tint/expressions/type_conv/vec3/literal/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/literal/u32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec3/var/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/bool-f16.wgsl.expected.msl
index ca02857..73102e5 100644
--- a/test/tint/expressions/type_conv/vec3/var/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/bool-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool3 tint_symbol = bool3(true);
-  half3 const v = half3(tint_symbol);
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const v = half3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/bool-f32.wgsl.expected.msl
index c21cd03..21f6c61 100644
--- a/test/tint/expressions/type_conv/vec3/var/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/bool-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool3 tint_symbol = bool3(true);
-  float3 const v = float3(tint_symbol);
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const v = float3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/bool-i32.wgsl.expected.msl
index 145181c..04cd586 100644
--- a/test/tint/expressions/type_conv/vec3/var/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/bool-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool3 tint_symbol = bool3(true);
-  int3 const v = int3(tint_symbol);
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const v = int3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/bool-u32.wgsl.expected.msl
index c277b52..cb5afa2 100644
--- a/test/tint/expressions/type_conv/vec3/var/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/bool-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool3 tint_symbol = bool3(true);
-  uint3 const v = uint3(tint_symbol);
+struct tint_private_vars_struct {
+  bool3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const v = uint3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f16-bool.wgsl.expected.msl
index 53fa36a..b77e0e1 100644
--- a/test/tint/expressions/type_conv/vec3/var/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f16-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half3 tint_symbol = half3(1.0h);
-  bool3 const v = bool3(tint_symbol);
+struct tint_private_vars_struct {
+  half3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const v = bool3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f16-f32.wgsl.expected.msl
index 020ca0a..51e8463 100644
--- a/test/tint/expressions/type_conv/vec3/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half3 tint_symbol = half3(1.0h);
-  float3 const v = float3(tint_symbol);
+struct tint_private_vars_struct {
+  half3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const v = float3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f16-i32.wgsl.expected.msl
index 197a3ce..0c1fe29 100644
--- a/test/tint/expressions/type_conv/vec3/var/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f16-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half3 tint_symbol = half3(1.0h);
-  int3 const v = int3(tint_symbol);
+struct tint_private_vars_struct {
+  half3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const v = int3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f16-u32.wgsl.expected.msl
index d299b78..f7691df 100644
--- a/test/tint/expressions/type_conv/vec3/var/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f16-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half3 tint_symbol = half3(1.0h);
-  uint3 const v = uint3(tint_symbol);
+struct tint_private_vars_struct {
+  half3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const v = uint3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f32-bool.wgsl.expected.msl
index 3d33f82..20fd309 100644
--- a/test/tint/expressions/type_conv/vec3/var/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float3 tint_symbol = float3(1.0f);
-  bool3 const v = bool3(tint_symbol);
+struct tint_private_vars_struct {
+  float3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const v = bool3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f32-f16.wgsl.expected.msl
index f79e5ac..adddf81 100644
--- a/test/tint/expressions/type_conv/vec3/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float3 tint_symbol = float3(1.0f);
-  half3 const v = half3(tint_symbol);
+struct tint_private_vars_struct {
+  float3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const v = half3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f32-i32.wgsl.expected.msl
index 1a4621f..217ec91 100644
--- a/test/tint/expressions/type_conv/vec3/var/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f32-i32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 u;
+};
+
 int3 tint_ftoi(float3 v) {
   return select(int3(2147483647), select(int3(v), int3((-2147483647 - 1)), (v < float3(-2147483648.0f))), (v < float3(2147483520.0f)));
 }
 
-void f() {
-  thread float3 tint_symbol = float3(1.0f);
-  int3 const v = tint_ftoi(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const v = tint_ftoi((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/f32-u32.wgsl.expected.msl
index bf292cb..df43faf 100644
--- a/test/tint/expressions/type_conv/vec3/var/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/f32-u32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 u;
+};
+
 uint3 tint_ftou(float3 v) {
   return select(uint3(4294967295u), select(uint3(v), uint3(0u), (v < float3(0.0f))), (v < float3(4294967040.0f)));
 }
 
-void f() {
-  thread float3 tint_symbol = float3(1.0f);
-  uint3 const v = tint_ftou(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const v = tint_ftou((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/i32-bool.wgsl.expected.msl
index d173df6..b99917d 100644
--- a/test/tint/expressions/type_conv/vec3/var/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/i32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int3 tint_symbol = int3(1);
-  bool3 const v = bool3(tint_symbol);
+struct tint_private_vars_struct {
+  int3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const v = bool3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/i32-f16.wgsl.expected.msl
index 0dd85c1..8a3151a 100644
--- a/test/tint/expressions/type_conv/vec3/var/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/i32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int3 tint_symbol = int3(1);
-  half3 const v = half3(tint_symbol);
+struct tint_private_vars_struct {
+  int3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const v = half3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/i32-f32.wgsl.expected.msl
index d00b316..66d471a 100644
--- a/test/tint/expressions/type_conv/vec3/var/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/i32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int3 tint_symbol = int3(1);
-  float3 const v = float3(tint_symbol);
+struct tint_private_vars_struct {
+  int3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const v = float3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/i32-u32.wgsl.expected.msl
index 4b1d15a..200939a 100644
--- a/test/tint/expressions/type_conv/vec3/var/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/i32-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int3 tint_symbol = int3(1);
-  uint3 const v = uint3(tint_symbol);
+struct tint_private_vars_struct {
+  int3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint3 const v = uint3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/u32-bool.wgsl.expected.msl
index 9ed8565..5ef46b5 100644
--- a/test/tint/expressions/type_conv/vec3/var/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/u32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint3 tint_symbol = uint3(1u);
-  bool3 const v = bool3(tint_symbol);
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool3 const v = bool3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/u32-f16.wgsl.expected.msl
index d03edd8..338df17 100644
--- a/test/tint/expressions/type_conv/vec3/var/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/u32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint3 tint_symbol = uint3(1u);
-  half3 const v = half3(tint_symbol);
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3 const v = half3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/u32-f32.wgsl.expected.msl
index 462c81a..b94298d 100644
--- a/test/tint/expressions/type_conv/vec3/var/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/u32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint3 tint_symbol = uint3(1u);
-  float3 const v = float3(tint_symbol);
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3 const v = float3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec3/var/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec3/var/u32-i32.wgsl.expected.msl
index 7e8031a..1de4c2f 100644
--- a/test/tint/expressions/type_conv/vec3/var/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec3/var/u32-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint3 tint_symbol = uint3(1u);
-  int3 const v = int3(tint_symbol);
+struct tint_private_vars_struct {
+  uint3 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int3 const v = int3((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/bool-f16.wgsl.expected.msl
index 86e91cc..6835ee9 100644
--- a/test/tint/expressions/type_conv/vec4/function/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/bool-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool4 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool4(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool4((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const tint_symbol = m(tint_private_vars);
   half4 v = half4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/bool-f32.wgsl.expected.msl
index 432aff7..0b8f379 100644
--- a/test/tint/expressions/type_conv/vec4/function/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/bool-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool4 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool4(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool4((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const tint_symbol = m(tint_private_vars);
   float4 v = float4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/bool-i32.wgsl.expected.msl
index 015c285..a87ad0d 100644
--- a/test/tint/expressions/type_conv/vec4/function/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/bool-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool4 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool4(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool4((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const tint_symbol = m(tint_private_vars);
   int4 v = int4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/bool-u32.wgsl.expected.msl
index 11bedfb..54782df 100644
--- a/test/tint/expressions/type_conv/vec4/function/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/bool-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-bool4 m() {
-  thread bool tint_symbol_1 = false;
-  tint_symbol_1 = true;
-  return bool4(tint_symbol_1);
+struct tint_private_vars_struct {
+  bool t;
+};
+
+bool4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = true;
+  return bool4((*(tint_private_vars)).t);
 }
 
-void f() {
-  bool4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const tint_symbol = m(tint_private_vars);
   uint4 v = uint4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f16-bool.wgsl.expected.msl
index 5273225..a8b964c 100644
--- a/test/tint/expressions/type_conv/vec4/function/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f16-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half4(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half4((*(tint_private_vars)).t);
 }
 
-void f() {
-  half4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const tint_symbol = m(tint_private_vars);
   bool4 v = bool4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f16-f32.wgsl.expected.msl
index 30ca6fa..44725a3 100644
--- a/test/tint/expressions/type_conv/vec4/function/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f16-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half4(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half4((*(tint_private_vars)).t);
 }
 
-void f() {
-  half4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const tint_symbol = m(tint_private_vars);
   float4 v = float4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f16-i32.wgsl.expected.msl
index c0f8605..9def0a6 100644
--- a/test/tint/expressions/type_conv/vec4/function/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f16-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half4(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half4((*(tint_private_vars)).t);
 }
 
-void f() {
-  half4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const tint_symbol = m(tint_private_vars);
   int4 v = int4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f16-u32.wgsl.expected.msl
index cf49e39..4cdd782 100644
--- a/test/tint/expressions/type_conv/vec4/function/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f16-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4 m() {
-  thread half tint_symbol_1 = 0.0h;
-  tint_symbol_1 = 1.0h;
-  return half4(tint_symbol_1);
+struct tint_private_vars_struct {
+  half t;
+};
+
+half4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0h;
+  return half4((*(tint_private_vars)).t);
 }
 
-void f() {
-  half4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const tint_symbol = m(tint_private_vars);
   uint4 v = uint4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f32-bool.wgsl.expected.msl
index 469620b..92b581c 100644
--- a/test/tint/expressions/type_conv/vec4/function/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float4(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float4((*(tint_private_vars)).t);
 }
 
-void f() {
-  float4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const tint_symbol = m(tint_private_vars);
   bool4 v = bool4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f32-f16.wgsl.expected.msl
index 98a23c77..e31deb3 100644
--- a/test/tint/expressions/type_conv/vec4/function/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float4(tint_symbol_1);
+struct tint_private_vars_struct {
+  float t;
+};
+
+float4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float4((*(tint_private_vars)).t);
 }
 
-void f() {
-  float4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const tint_symbol = m(tint_private_vars);
   half4 v = half4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f32-i32.wgsl.expected.msl
index 1f04e5e..850c881 100644
--- a/test/tint/expressions/type_conv/vec4/function/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f32-i32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 int4 tint_ftoi(float4 v) {
   return select(int4(2147483647), select(int4(v), int4((-2147483647 - 1)), (v < float4(-2147483648.0f))), (v < float4(2147483520.0f)));
 }
 
-float4 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float4(tint_symbol_1);
+float4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float4((*(tint_private_vars)).t);
 }
 
-void f() {
-  float4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const tint_symbol = m(tint_private_vars);
   int4 v = tint_ftoi(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/f32-u32.wgsl.expected.msl
index e0cad92..f51511f 100644
--- a/test/tint/expressions/type_conv/vec4/function/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/f32-u32.wgsl.expected.msl
@@ -1,18 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float t;
+};
+
 uint4 tint_ftou(float4 v) {
   return select(uint4(4294967295u), select(uint4(v), uint4(0u), (v < float4(0.0f))), (v < float4(4294967040.0f)));
 }
 
-float4 m() {
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol_1 = 1.0f;
-  return float4(tint_symbol_1);
+float4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1.0f;
+  return float4((*(tint_private_vars)).t);
 }
 
-void f() {
-  float4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const tint_symbol = m(tint_private_vars);
   uint4 v = tint_ftou(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/i32-bool.wgsl.expected.msl
index 059bb99..58ad9bc 100644
--- a/test/tint/expressions/type_conv/vec4/function/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/i32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int4 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int4(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int4((*(tint_private_vars)).t);
 }
 
-void f() {
-  int4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const tint_symbol = m(tint_private_vars);
   bool4 v = bool4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/i32-f16.wgsl.expected.msl
index c501b92..b04029f 100644
--- a/test/tint/expressions/type_conv/vec4/function/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/i32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int4 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int4(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int4((*(tint_private_vars)).t);
 }
 
-void f() {
-  int4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const tint_symbol = m(tint_private_vars);
   half4 v = half4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/i32-f32.wgsl.expected.msl
index dba6670..74341b7 100644
--- a/test/tint/expressions/type_conv/vec4/function/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/i32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int4 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int4(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int4((*(tint_private_vars)).t);
 }
 
-void f() {
-  int4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const tint_symbol = m(tint_private_vars);
   float4 v = float4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/i32-u32.wgsl.expected.msl
index b9fd25d..f9377c6 100644
--- a/test/tint/expressions/type_conv/vec4/function/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/i32-u32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-int4 m() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 1;
-  return int4(tint_symbol_1);
+struct tint_private_vars_struct {
+  int t;
+};
+
+int4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1;
+  return int4((*(tint_private_vars)).t);
 }
 
-void f() {
-  int4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const tint_symbol = m(tint_private_vars);
   uint4 v = uint4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/u32-bool.wgsl.expected.msl
index 978a48d..24163cb 100644
--- a/test/tint/expressions/type_conv/vec4/function/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/u32-bool.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint4 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint4(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint4((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const tint_symbol = m(tint_private_vars);
   bool4 v = bool4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/u32-f16.wgsl.expected.msl
index 693069d..b9d347e 100644
--- a/test/tint/expressions/type_conv/vec4/function/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/u32-f16.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint4 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint4(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint4((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const tint_symbol = m(tint_private_vars);
   half4 v = half4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/u32-f32.wgsl.expected.msl
index 1d10727..0be0063 100644
--- a/test/tint/expressions/type_conv/vec4/function/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/u32-f32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint4 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint4(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint4((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const tint_symbol = m(tint_private_vars);
   float4 v = float4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/function/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/function/u32-i32.wgsl.expected.msl
index 3d01461..ba2afc9 100644
--- a/test/tint/expressions/type_conv/vec4/function/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/function/u32-i32.wgsl.expected.msl
@@ -1,14 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
-uint4 m() {
-  thread uint tint_symbol_1 = 0u;
-  tint_symbol_1 = 1u;
-  return uint4(tint_symbol_1);
+struct tint_private_vars_struct {
+  uint t;
+};
+
+uint4 m(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).t = 1u;
+  return uint4((*(tint_private_vars)).t);
 }
 
-void f() {
-  uint4 const tint_symbol = m();
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const tint_symbol = m(tint_private_vars);
   int4 v = int4(tint_symbol);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/literal/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/bool-f16.wgsl.expected.msl
index 466ceaa..d3163da 100644
--- a/test/tint/expressions/type_conv/vec4/literal/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/bool-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/bool-f32.wgsl.expected.msl
index 466ceaa..1384746 100644
--- a/test/tint/expressions/type_conv/vec4/literal/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/bool-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/bool-i32.wgsl.expected.msl
index 466ceaa..504a2c4 100644
--- a/test/tint/expressions/type_conv/vec4/literal/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/bool-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/bool-u32.wgsl.expected.msl
index 466ceaa..5c5cfc5 100644
--- a/test/tint/expressions/type_conv/vec4/literal/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/bool-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f16-bool.wgsl.expected.msl
index 466ceaa..13cccc1 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f16-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f16-f32.wgsl.expected.msl
index 466ceaa..1384746 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f16-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f16-i32.wgsl.expected.msl
index 466ceaa..504a2c4 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f16-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f16-u32.wgsl.expected.msl
index 466ceaa..5c5cfc5 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f16-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f32-bool.wgsl.expected.msl
index 466ceaa..13cccc1 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f32-f16.wgsl.expected.msl
index 466ceaa..d3163da 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f32-i32.wgsl.expected.msl
index 466ceaa..504a2c4 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/f32-u32.wgsl.expected.msl
index 466ceaa..5c5cfc5 100644
--- a/test/tint/expressions/type_conv/vec4/literal/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/f32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/i32-bool.wgsl.expected.msl
index 466ceaa..13cccc1 100644
--- a/test/tint/expressions/type_conv/vec4/literal/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/i32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/i32-f16.wgsl.expected.msl
index 466ceaa..d3163da 100644
--- a/test/tint/expressions/type_conv/vec4/literal/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/i32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/i32-f32.wgsl.expected.msl
index 466ceaa..1384746 100644
--- a/test/tint/expressions/type_conv/vec4/literal/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/i32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/i32-u32.wgsl.expected.msl
index 466ceaa..5c5cfc5 100644
--- a/test/tint/expressions/type_conv/vec4/literal/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/i32-u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/u32-bool.wgsl.expected.msl
index 466ceaa..13cccc1 100644
--- a/test/tint/expressions/type_conv/vec4/literal/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/u32-bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/u32-f16.wgsl.expected.msl
index 466ceaa..d3163da 100644
--- a/test/tint/expressions/type_conv/vec4/literal/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/u32-f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/u32-f32.wgsl.expected.msl
index 466ceaa..1384746 100644
--- a/test/tint/expressions/type_conv/vec4/literal/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/u32-f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/literal/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/literal/u32-i32.wgsl.expected.msl
index 466ceaa..504a2c4 100644
--- a/test/tint/expressions/type_conv/vec4/literal/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/literal/u32-i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int4 u;
+};
+
diff --git a/test/tint/expressions/type_conv/vec4/var/bool-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/bool-f16.wgsl.expected.msl
index 9b7a3f9..cc44530 100644
--- a/test/tint/expressions/type_conv/vec4/var/bool-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/bool-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool4 tint_symbol = bool4(true);
-  half4 const v = half4(tint_symbol);
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const v = half4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/bool-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/bool-f32.wgsl.expected.msl
index a8141a0..6b51ff5 100644
--- a/test/tint/expressions/type_conv/vec4/var/bool-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/bool-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool4 tint_symbol = bool4(true);
-  float4 const v = float4(tint_symbol);
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const v = float4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/bool-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/bool-i32.wgsl.expected.msl
index 3cbb3bd..82ece55 100644
--- a/test/tint/expressions/type_conv/vec4/var/bool-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/bool-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool4 tint_symbol = bool4(true);
-  int4 const v = int4(tint_symbol);
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const v = int4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/bool-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/bool-u32.wgsl.expected.msl
index 027dc8b..bc849f1 100644
--- a/test/tint/expressions/type_conv/vec4/var/bool-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/bool-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread bool4 tint_symbol = bool4(true);
-  uint4 const v = uint4(tint_symbol);
+struct tint_private_vars_struct {
+  bool4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const v = uint4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f16-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f16-bool.wgsl.expected.msl
index 2f42908..e8fe94a 100644
--- a/test/tint/expressions/type_conv/vec4/var/f16-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f16-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half4 tint_symbol = half4(1.0h);
-  bool4 const v = bool4(tint_symbol);
+struct tint_private_vars_struct {
+  half4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const v = bool4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f16-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f16-f32.wgsl.expected.msl
index f3b5e74..66fb84e 100644
--- a/test/tint/expressions/type_conv/vec4/var/f16-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f16-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half4 tint_symbol = half4(1.0h);
-  float4 const v = float4(tint_symbol);
+struct tint_private_vars_struct {
+  half4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const v = float4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f16-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f16-i32.wgsl.expected.msl
index cf6ae1d..62d4b00 100644
--- a/test/tint/expressions/type_conv/vec4/var/f16-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f16-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half4 tint_symbol = half4(1.0h);
-  int4 const v = int4(tint_symbol);
+struct tint_private_vars_struct {
+  half4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const v = int4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f16-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f16-u32.wgsl.expected.msl
index 829e365..9fca44c 100644
--- a/test/tint/expressions/type_conv/vec4/var/f16-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f16-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread half4 tint_symbol = half4(1.0h);
-  uint4 const v = uint4(tint_symbol);
+struct tint_private_vars_struct {
+  half4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const v = uint4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f32-bool.wgsl.expected.msl
index a394670..bb1e1bd 100644
--- a/test/tint/expressions/type_conv/vec4/var/f32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float4 tint_symbol = float4(1.0f);
-  bool4 const v = bool4(tint_symbol);
+struct tint_private_vars_struct {
+  float4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const v = bool4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f32-f16.wgsl.expected.msl
index fddac9c..2a2f1aa 100644
--- a/test/tint/expressions/type_conv/vec4/var/f32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread float4 tint_symbol = float4(1.0f);
-  half4 const v = half4(tint_symbol);
+struct tint_private_vars_struct {
+  float4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const v = half4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f32-i32.wgsl.expected.msl
index f9824a4..e0ef880 100644
--- a/test/tint/expressions/type_conv/vec4/var/f32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f32-i32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 u;
+};
+
 int4 tint_ftoi(float4 v) {
   return select(int4(2147483647), select(int4(v), int4((-2147483647 - 1)), (v < float4(-2147483648.0f))), (v < float4(2147483520.0f)));
 }
 
-void f() {
-  thread float4 tint_symbol = float4(1.0f);
-  int4 const v = tint_ftoi(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const v = tint_ftoi((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/f32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/f32-u32.wgsl.expected.msl
index 8586cef..3097856 100644
--- a/test/tint/expressions/type_conv/vec4/var/f32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/f32-u32.wgsl.expected.msl
@@ -1,12 +1,15 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 u;
+};
+
 uint4 tint_ftou(float4 v) {
   return select(uint4(4294967295u), select(uint4(v), uint4(0u), (v < float4(0.0f))), (v < float4(4294967040.0f)));
 }
 
-void f() {
-  thread float4 tint_symbol = float4(1.0f);
-  uint4 const v = tint_ftou(tint_symbol);
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const v = tint_ftou((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/i32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/i32-bool.wgsl.expected.msl
index 30c90bc..18b1f89 100644
--- a/test/tint/expressions/type_conv/vec4/var/i32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/i32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int4 tint_symbol = int4(1);
-  bool4 const v = bool4(tint_symbol);
+struct tint_private_vars_struct {
+  int4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const v = bool4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/i32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/i32-f16.wgsl.expected.msl
index 88675aa..87ea031 100644
--- a/test/tint/expressions/type_conv/vec4/var/i32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/i32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int4 tint_symbol = int4(1);
-  half4 const v = half4(tint_symbol);
+struct tint_private_vars_struct {
+  int4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const v = half4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/i32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/i32-f32.wgsl.expected.msl
index ccbcd16..42a6dd8 100644
--- a/test/tint/expressions/type_conv/vec4/var/i32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/i32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int4 tint_symbol = int4(1);
-  float4 const v = float4(tint_symbol);
+struct tint_private_vars_struct {
+  int4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const v = float4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/i32-u32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/i32-u32.wgsl.expected.msl
index 3836150..00c64b4 100644
--- a/test/tint/expressions/type_conv/vec4/var/i32-u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/i32-u32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int4 tint_symbol = int4(1);
-  uint4 const v = uint4(tint_symbol);
+struct tint_private_vars_struct {
+  int4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  uint4 const v = uint4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/u32-bool.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/u32-bool.wgsl.expected.msl
index 7ae3843..5227146 100644
--- a/test/tint/expressions/type_conv/vec4/var/u32-bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/u32-bool.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint4 tint_symbol = uint4(1u);
-  bool4 const v = bool4(tint_symbol);
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  bool4 const v = bool4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/u32-f16.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/u32-f16.wgsl.expected.msl
index 1590b32..b349ee3 100644
--- a/test/tint/expressions/type_conv/vec4/var/u32-f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/u32-f16.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint4 tint_symbol = uint4(1u);
-  half4 const v = half4(tint_symbol);
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4 const v = half4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/u32-f32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/u32-f32.wgsl.expected.msl
index 6a2d33e..7b2ae2b 100644
--- a/test/tint/expressions/type_conv/vec4/var/u32-f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/u32-f32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint4 tint_symbol = uint4(1u);
-  float4 const v = float4(tint_symbol);
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4 const v = float4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_conv/vec4/var/u32-i32.wgsl.expected.msl b/test/tint/expressions/type_conv/vec4/var/u32-i32.wgsl.expected.msl
index 48c5733..67a3394 100644
--- a/test/tint/expressions/type_conv/vec4/var/u32-i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_conv/vec4/var/u32-i32.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread uint4 tint_symbol = uint4(1u);
-  int4 const v = int4(tint_symbol);
+struct tint_private_vars_struct {
+  uint4 u;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int4 const v = int4((*(tint_private_vars)).u);
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/abstract.wgsl.expected.msl
index 948a0e3..21cea11 100644
--- a/test/tint/expressions/type_ctor/array/explicit/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float, 2> tint_symbol = tint_array<float, 2>{1.0f, 2.0f};
-  tint_array<float, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/array/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/array/abstract.wgsl.expected.msl
index 78574d3..1ed086b 100644
--- a/test/tint/expressions/type_ctor/array/explicit/array/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/array/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<tint_array<float, 2>, 2> tint_symbol = tint_array<tint_array<float, 2>, 2>{tint_array<float, 2>{1.0f, 2.0f}, tint_array<float, 2>{3.0f, 4.0f}};
-  tint_array<tint_array<float, 2>, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<tint_array<float, 2>, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<tint_array<float, 2>, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/array/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/array/f32.wgsl.expected.msl
index 78574d3..1ed086b 100644
--- a/test/tint/expressions/type_ctor/array/explicit/array/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/array/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<tint_array<float, 2>, 2> tint_symbol = tint_array<tint_array<float, 2>, 2>{tint_array<float, 2>{1.0f, 2.0f}, tint_array<float, 2>{3.0f, 4.0f}};
-  tint_array<tint_array<float, 2>, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<tint_array<float, 2>, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<tint_array<float, 2>, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/f32.wgsl.expected.msl
index 948a0e3..21cea11 100644
--- a/test/tint/expressions/type_ctor/array/explicit/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float, 2> tint_symbol = tint_array<float, 2>{1.0f, 2.0f};
-  tint_array<float, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/i32.wgsl.expected.msl
index b25f389..e0a3c9b 100644
--- a/test/tint/expressions/type_ctor/array/explicit/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/i32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<int, 2> tint_symbol = tint_array<int, 2>{1, 2};
-  tint_array<int, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<int, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<int, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/mat2x2/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/mat2x2/abstract.wgsl.expected.msl
index fc7a396..217837d 100644
--- a/test/tint/expressions/type_ctor/array/explicit/mat2x2/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/mat2x2/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2x2, 2> tint_symbol = tint_array<float2x2, 2>{float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)), float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f))};
-  tint_array<float2x2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2x2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2x2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/mat2x2/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/mat2x2/f32.wgsl.expected.msl
index fc7a396..217837d 100644
--- a/test/tint/expressions/type_ctor/array/explicit/mat2x2/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/mat2x2/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2x2, 2> tint_symbol = tint_array<float2x2, 2>{float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)), float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f))};
-  tint_array<float2x2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2x2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2x2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/u32.wgsl.expected.msl
index ae65b6a..5b98962 100644
--- a/test/tint/expressions/type_ctor/array/explicit/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/u32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<uint, 2> tint_symbol = tint_array<uint, 2>{1u, 2u};
-  tint_array<uint, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<uint, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<uint, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/vec2/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/vec2/abstract.wgsl.expected.msl
index 6965cc2..869902f 100644
--- a/test/tint/expressions/type_ctor/array/explicit/vec2/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/vec2/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2, 2> tint_symbol = tint_array<float2, 2>{float2(1.0f), float2(2.0f)};
-  tint_array<float2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/vec2/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/vec2/f32.wgsl.expected.msl
index 6965cc2..869902f 100644
--- a/test/tint/expressions/type_ctor/array/explicit/vec2/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/vec2/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2, 2> tint_symbol = tint_array<float2, 2>{float2(1.0f), float2(2.0f)};
-  tint_array<float2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/vec2/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/vec2/i32.wgsl.expected.msl
index d6e6202..6b7e104 100644
--- a/test/tint/expressions/type_ctor/array/explicit/vec2/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/vec2/i32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<int2, 2> tint_symbol = tint_array<int2, 2>{int2(1), int2(2)};
-  tint_array<int2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<int2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<int2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/explicit/vec2/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/explicit/vec2/u32.wgsl.expected.msl
index 53c875d..93e5466 100644
--- a/test/tint/expressions/type_ctor/array/explicit/vec2/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/explicit/vec2/u32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<uint2, 2> tint_symbol = tint_array<uint2, 2>{uint2(1u), uint2(2u)};
-  tint_array<uint2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<uint2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<uint2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/abstract.wgsl.expected.msl
index b25f389..e0a3c9b 100644
--- a/test/tint/expressions/type_ctor/array/inferred/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<int, 2> tint_symbol = tint_array<int, 2>{1, 2};
-  tint_array<int, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<int, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<int, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/array/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/array/abstract.wgsl.expected.msl
index 1782585..0733628 100644
--- a/test/tint/expressions/type_ctor/array/inferred/array/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/array/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<tint_array<int, 2>, 2> tint_symbol = tint_array<tint_array<int, 2>, 2>{tint_array<int, 2>{1, 2}, tint_array<int, 2>{3, 4}};
-  tint_array<tint_array<int, 2>, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<tint_array<int, 2>, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<tint_array<int, 2>, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/array/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/array/f32.wgsl.expected.msl
index 78574d3..1ed086b 100644
--- a/test/tint/expressions/type_ctor/array/inferred/array/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/array/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<tint_array<float, 2>, 2> tint_symbol = tint_array<tint_array<float, 2>, 2>{tint_array<float, 2>{1.0f, 2.0f}, tint_array<float, 2>{3.0f, 4.0f}};
-  tint_array<tint_array<float, 2>, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<tint_array<float, 2>, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<tint_array<float, 2>, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/f32.wgsl.expected.msl
index 948a0e3..21cea11 100644
--- a/test/tint/expressions/type_ctor/array/inferred/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float, 2> tint_symbol = tint_array<float, 2>{1.0f, 2.0f};
-  tint_array<float, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/i32.wgsl.expected.msl
index b25f389..e0a3c9b 100644
--- a/test/tint/expressions/type_ctor/array/inferred/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/i32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<int, 2> tint_symbol = tint_array<int, 2>{1, 2};
-  tint_array<int, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<int, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<int, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/mat2x2/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/mat2x2/abstract.wgsl.expected.msl
index fc7a396..217837d 100644
--- a/test/tint/expressions/type_ctor/array/inferred/mat2x2/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/mat2x2/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2x2, 2> tint_symbol = tint_array<float2x2, 2>{float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)), float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f))};
-  tint_array<float2x2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2x2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2x2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/mat2x2/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/mat2x2/f32.wgsl.expected.msl
index fc7a396..217837d 100644
--- a/test/tint/expressions/type_ctor/array/inferred/mat2x2/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/mat2x2/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2x2, 2> tint_symbol = tint_array<float2x2, 2>{float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)), float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f))};
-  tint_array<float2x2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2x2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2x2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/u32.wgsl.expected.msl
index ae65b6a..5b98962 100644
--- a/test/tint/expressions/type_ctor/array/inferred/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/u32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<uint, 2> tint_symbol = tint_array<uint, 2>{1u, 2u};
-  tint_array<uint, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<uint, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<uint, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/vec2/abstract.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/vec2/abstract.wgsl.expected.msl
index 6965cc2..869902f 100644
--- a/test/tint/expressions/type_ctor/array/inferred/vec2/abstract.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/vec2/abstract.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2, 2> tint_symbol = tint_array<float2, 2>{float2(1.0f), float2(2.0f)};
-  tint_array<float2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/vec2/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/vec2/f32.wgsl.expected.msl
index 6965cc2..869902f 100644
--- a/test/tint/expressions/type_ctor/array/inferred/vec2/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/vec2/f32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<float2, 2> tint_symbol = tint_array<float2, 2>{float2(1.0f), float2(2.0f)};
-  tint_array<float2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<float2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<float2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/vec2/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/vec2/i32.wgsl.expected.msl
index d6e6202..6b7e104 100644
--- a/test/tint/expressions/type_ctor/array/inferred/vec2/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/vec2/i32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<int2, 2> tint_symbol = tint_array<int2, 2>{int2(1), int2(2)};
-  tint_array<int2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<int2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<int2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/array/inferred/vec2/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/array/inferred/vec2/u32.wgsl.expected.msl
index 53c875d..93e5466 100644
--- a/test/tint/expressions/type_ctor/array/inferred/vec2/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/array/inferred/vec2/u32.wgsl.expected.msl
@@ -14,8 +14,11 @@
     T elements[N];
 };
 
-void f() {
-  thread tint_array<uint2, 2> tint_symbol = tint_array<uint2, 2>{uint2(1u), uint2(2u)};
-  tint_array<uint2, 2> v = tint_symbol;
+struct tint_private_vars_struct {
+  tint_array<uint2, 2> arr;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  tint_array<uint2, 2> v = (*(tint_private_vars)).arr;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f16.wgsl.expected.msl
index e4fadc8..83d200f 100644
--- a/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x2 f() {
-  thread half2x2 tint_symbol = half2x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h));
-  half2x2 const m_1 = half2x2(tint_symbol);
+struct tint_private_vars_struct {
+  half2x2 m;
+};
+
+half2x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x2 const m_1 = half2x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f32.wgsl.expected.msl
index dcbe1b0..c317697 100644
--- a/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x2 f() {
-  thread float2x2 tint_symbol = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
-  float2x2 const m_1 = float2x2(tint_symbol);
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
+float2x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x2 const m_1 = float2x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..37b7060 100644
--- a/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..c97a144 100644
--- a/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..37b7060 100644
--- a/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..c97a144 100644
--- a/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f16.wgsl.expected.msl
index e4fadc8..83d200f 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x2 f() {
-  thread half2x2 tint_symbol = half2x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h));
-  half2x2 const m_1 = half2x2(tint_symbol);
+struct tint_private_vars_struct {
+  half2x2 m;
+};
+
+half2x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x2 const m_1 = half2x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f32.wgsl.expected.msl
index dcbe1b0..c317697 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x2 f() {
-  thread float2x2 tint_symbol = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
-  float2x2 const m_1 = float2x2(tint_symbol);
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
+float2x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x2 const m_1 = float2x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..c97a144 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..37b7060 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..c97a144 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..c97a144 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..37b7060 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..c97a144 100644
--- a/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/zero/f16.wgsl.expected.msl
index 466ceaa..37b7060 100644
--- a/test/tint/expressions/type_ctor/mat2x2/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x2/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x2/zero/f32.wgsl.expected.msl
index 466ceaa..c97a144 100644
--- a/test/tint/expressions/type_ctor/mat2x2/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x2/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f16.wgsl.expected.msl
index 30f8cc7..afa405d 100644
--- a/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x3 f() {
-  thread half2x3 tint_symbol = half2x3(half3(0.0h, 1.0h, 2.0h), half3(3.0h, 4.0h, 5.0h));
-  half2x3 const m_1 = half2x3(tint_symbol);
+struct tint_private_vars_struct {
+  half2x3 m;
+};
+
+half2x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x3 const m_1 = half2x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f32.wgsl.expected.msl
index 03b6fd7..0c95534 100644
--- a/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x3 f() {
-  thread float2x3 tint_symbol = float2x3(float3(0.0f, 1.0f, 2.0f), float3(3.0f, 4.0f, 5.0f));
-  float2x3 const m_1 = float2x3(tint_symbol);
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
+float2x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x3 const m_1 = float2x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..12a2c58 100644
--- a/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..f0ad3c1 100644
--- a/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..12a2c58 100644
--- a/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..f0ad3c1 100644
--- a/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f16.wgsl.expected.msl
index 30f8cc7..afa405d 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x3 f() {
-  thread half2x3 tint_symbol = half2x3(half3(0.0h, 1.0h, 2.0h), half3(3.0h, 4.0h, 5.0h));
-  half2x3 const m_1 = half2x3(tint_symbol);
+struct tint_private_vars_struct {
+  half2x3 m;
+};
+
+half2x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x3 const m_1 = half2x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f32.wgsl.expected.msl
index 03b6fd7..0c95534 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x3 f() {
-  thread float2x3 tint_symbol = float2x3(float3(0.0f, 1.0f, 2.0f), float3(3.0f, 4.0f, 5.0f));
-  float2x3 const m_1 = float2x3(tint_symbol);
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
+float2x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x3 const m_1 = float2x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..f0ad3c1 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..12a2c58 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..f0ad3c1 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..f0ad3c1 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..12a2c58 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..f0ad3c1 100644
--- a/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/zero/f16.wgsl.expected.msl
index 466ceaa..12a2c58 100644
--- a/test/tint/expressions/type_ctor/mat2x3/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x3/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x3/zero/f32.wgsl.expected.msl
index 466ceaa..f0ad3c1 100644
--- a/test/tint/expressions/type_ctor/mat2x3/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x3/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f16.wgsl.expected.msl
index ce986af..3bc8b99 100644
--- a/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x4 f() {
-  thread half2x4 tint_symbol = half2x4(half4(0.0h, 1.0h, 2.0h, 3.0h), half4(4.0h, 5.0h, 6.0h, 7.0h));
-  half2x4 const m_1 = half2x4(tint_symbol);
+struct tint_private_vars_struct {
+  half2x4 m;
+};
+
+half2x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x4 const m_1 = half2x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f32.wgsl.expected.msl
index 63b4e2a..8d39f84 100644
--- a/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x4 f() {
-  thread float2x4 tint_symbol = float2x4(float4(0.0f, 1.0f, 2.0f, 3.0f), float4(4.0f, 5.0f, 6.0f, 7.0f));
-  float2x4 const m_1 = float2x4(tint_symbol);
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
+float2x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x4 const m_1 = float2x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..88fa42b 100644
--- a/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..299bd66 100644
--- a/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..88fa42b 100644
--- a/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..299bd66 100644
--- a/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f16.wgsl.expected.msl
index ce986af..3bc8b99 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half2x4 f() {
-  thread half2x4 tint_symbol = half2x4(half4(0.0h, 1.0h, 2.0h, 3.0h), half4(4.0h, 5.0h, 6.0h, 7.0h));
-  half2x4 const m_1 = half2x4(tint_symbol);
+struct tint_private_vars_struct {
+  half2x4 m;
+};
+
+half2x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half2x4 const m_1 = half2x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f32.wgsl.expected.msl
index 63b4e2a..8d39f84 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float2x4 f() {
-  thread float2x4 tint_symbol = float2x4(float4(0.0f, 1.0f, 2.0f, 3.0f), float4(4.0f, 5.0f, 6.0f, 7.0f));
-  float2x4 const m_1 = float2x4(tint_symbol);
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
+float2x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float2x4 const m_1 = float2x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..299bd66 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..88fa42b 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..299bd66 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..299bd66 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..88fa42b 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..299bd66 100644
--- a/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/zero/f16.wgsl.expected.msl
index 466ceaa..88fa42b 100644
--- a/test/tint/expressions/type_ctor/mat2x4/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat2x4/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat2x4/zero/f32.wgsl.expected.msl
index 466ceaa..299bd66 100644
--- a/test/tint/expressions/type_ctor/mat2x4/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat2x4/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f16.wgsl.expected.msl
index f9d4d85..f2d3fbe 100644
--- a/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x2 f() {
-  thread half3x2 tint_symbol = half3x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(4.0h, 5.0h));
-  half3x2 const m_1 = half3x2(tint_symbol);
+struct tint_private_vars_struct {
+  half3x2 m;
+};
+
+half3x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x2 const m_1 = half3x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f32.wgsl.expected.msl
index 41fb71e..7c81698 100644
--- a/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x2 f() {
-  thread float3x2 tint_symbol = float3x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f), float2(4.0f, 5.0f));
-  float3x2 const m_1 = float3x2(tint_symbol);
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
+float3x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x2 const m_1 = float3x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..90a5391 100644
--- a/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..c62ec48 100644
--- a/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..90a5391 100644
--- a/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..c62ec48 100644
--- a/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f16.wgsl.expected.msl
index f9d4d85..f2d3fbe 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x2 f() {
-  thread half3x2 tint_symbol = half3x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(4.0h, 5.0h));
-  half3x2 const m_1 = half3x2(tint_symbol);
+struct tint_private_vars_struct {
+  half3x2 m;
+};
+
+half3x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x2 const m_1 = half3x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f32.wgsl.expected.msl
index 41fb71e..7c81698 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x2 f() {
-  thread float3x2 tint_symbol = float3x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f), float2(4.0f, 5.0f));
-  float3x2 const m_1 = float3x2(tint_symbol);
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
+float3x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x2 const m_1 = float3x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..c62ec48 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..90a5391 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..c62ec48 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..c62ec48 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..90a5391 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..c62ec48 100644
--- a/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/zero/f16.wgsl.expected.msl
index 466ceaa..90a5391 100644
--- a/test/tint/expressions/type_ctor/mat3x2/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x2/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x2/zero/f32.wgsl.expected.msl
index 466ceaa..c62ec48 100644
--- a/test/tint/expressions/type_ctor/mat3x2/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x2/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f16.wgsl.expected.msl
index 0e09b51..79dab0a 100644
--- a/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x3 f() {
-  thread half3x3 tint_symbol = half3x3(half3(0.0h, 1.0h, 2.0h), half3(3.0h, 4.0h, 5.0h), half3(6.0h, 7.0h, 8.0h));
-  half3x3 const m_1 = half3x3(tint_symbol);
+struct tint_private_vars_struct {
+  half3x3 m;
+};
+
+half3x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x3 const m_1 = half3x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f32.wgsl.expected.msl
index d19a026..301de24 100644
--- a/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x3 f() {
-  thread float3x3 tint_symbol = float3x3(float3(0.0f, 1.0f, 2.0f), float3(3.0f, 4.0f, 5.0f), float3(6.0f, 7.0f, 8.0f));
-  float3x3 const m_1 = float3x3(tint_symbol);
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
+float3x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x3 const m_1 = float3x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..f72a892 100644
--- a/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..98767cf 100644
--- a/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..f72a892 100644
--- a/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..98767cf 100644
--- a/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f16.wgsl.expected.msl
index 0e09b51..79dab0a 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x3 f() {
-  thread half3x3 tint_symbol = half3x3(half3(0.0h, 1.0h, 2.0h), half3(3.0h, 4.0h, 5.0h), half3(6.0h, 7.0h, 8.0h));
-  half3x3 const m_1 = half3x3(tint_symbol);
+struct tint_private_vars_struct {
+  half3x3 m;
+};
+
+half3x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x3 const m_1 = half3x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f32.wgsl.expected.msl
index d19a026..301de24 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x3 f() {
-  thread float3x3 tint_symbol = float3x3(float3(0.0f, 1.0f, 2.0f), float3(3.0f, 4.0f, 5.0f), float3(6.0f, 7.0f, 8.0f));
-  float3x3 const m_1 = float3x3(tint_symbol);
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
+float3x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x3 const m_1 = float3x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..98767cf 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..f72a892 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..98767cf 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..98767cf 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..f72a892 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..98767cf 100644
--- a/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/zero/f16.wgsl.expected.msl
index 466ceaa..f72a892 100644
--- a/test/tint/expressions/type_ctor/mat3x3/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x3/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x3/zero/f32.wgsl.expected.msl
index 466ceaa..98767cf 100644
--- a/test/tint/expressions/type_ctor/mat3x3/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x3/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f16.wgsl.expected.msl
index 28109d3..1018d4c 100644
--- a/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x4 f() {
-  thread half3x4 tint_symbol = half3x4(half4(0.0h, 1.0h, 2.0h, 3.0h), half4(4.0h, 5.0h, 6.0h, 7.0h), half4(8.0h, 9.0h, 10.0h, 11.0h));
-  half3x4 const m_1 = half3x4(tint_symbol);
+struct tint_private_vars_struct {
+  half3x4 m;
+};
+
+half3x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x4 const m_1 = half3x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f32.wgsl.expected.msl
index 9295b89..948eb5d 100644
--- a/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x4 f() {
-  thread float3x4 tint_symbol = float3x4(float4(0.0f, 1.0f, 2.0f, 3.0f), float4(4.0f, 5.0f, 6.0f, 7.0f), float4(8.0f, 9.0f, 10.0f, 11.0f));
-  float3x4 const m_1 = float3x4(tint_symbol);
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
+float3x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x4 const m_1 = float3x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..20a3a5f 100644
--- a/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..6d3618a 100644
--- a/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..20a3a5f 100644
--- a/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..6d3618a 100644
--- a/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f16.wgsl.expected.msl
index 28109d3..1018d4c 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half3x4 f() {
-  thread half3x4 tint_symbol = half3x4(half4(0.0h, 1.0h, 2.0h, 3.0h), half4(4.0h, 5.0h, 6.0h, 7.0h), half4(8.0h, 9.0h, 10.0h, 11.0h));
-  half3x4 const m_1 = half3x4(tint_symbol);
+struct tint_private_vars_struct {
+  half3x4 m;
+};
+
+half3x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half3x4 const m_1 = half3x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f32.wgsl.expected.msl
index 9295b89..948eb5d 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float3x4 f() {
-  thread float3x4 tint_symbol = float3x4(float4(0.0f, 1.0f, 2.0f, 3.0f), float4(4.0f, 5.0f, 6.0f, 7.0f), float4(8.0f, 9.0f, 10.0f, 11.0f));
-  float3x4 const m_1 = float3x4(tint_symbol);
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
+float3x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float3x4 const m_1 = float3x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..6d3618a 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..20a3a5f 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..6d3618a 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..6d3618a 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..20a3a5f 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..6d3618a 100644
--- a/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/zero/f16.wgsl.expected.msl
index 466ceaa..20a3a5f 100644
--- a/test/tint/expressions/type_ctor/mat3x4/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat3x4/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat3x4/zero/f32.wgsl.expected.msl
index 466ceaa..6d3618a 100644
--- a/test/tint/expressions/type_ctor/mat3x4/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat3x4/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f16.wgsl.expected.msl
index 35da177..20d0ed7 100644
--- a/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x2 f() {
-  thread half4x2 tint_symbol = half4x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(4.0h, 5.0h), half2(6.0h, 7.0h));
-  half4x2 const m_1 = half4x2(tint_symbol);
+struct tint_private_vars_struct {
+  half4x2 m;
+};
+
+half4x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x2 const m_1 = half4x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f32.wgsl.expected.msl
index 2114895..c229c26 100644
--- a/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x2 f() {
-  thread float4x2 tint_symbol = float4x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f), float2(4.0f, 5.0f), float2(6.0f, 7.0f));
-  float4x2 const m_1 = float4x2(tint_symbol);
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
+float4x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x2 const m_1 = float4x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..d6410a1 100644
--- a/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..3553bff 100644
--- a/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..d6410a1 100644
--- a/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..3553bff 100644
--- a/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f16.wgsl.expected.msl
index 35da177..20d0ed7 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x2 f() {
-  thread half4x2 tint_symbol = half4x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(4.0h, 5.0h), half2(6.0h, 7.0h));
-  half4x2 const m_1 = half4x2(tint_symbol);
+struct tint_private_vars_struct {
+  half4x2 m;
+};
+
+half4x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x2 const m_1 = half4x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f32.wgsl.expected.msl
index 2114895..c229c26 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x2 f() {
-  thread float4x2 tint_symbol = float4x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f), float2(4.0f, 5.0f), float2(6.0f, 7.0f));
-  float4x2 const m_1 = float4x2(tint_symbol);
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
+float4x2 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x2 const m_1 = float4x2((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..3553bff 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..d6410a1 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..3553bff 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..3553bff 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..d6410a1 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..3553bff 100644
--- a/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/zero/f16.wgsl.expected.msl
index 466ceaa..d6410a1 100644
--- a/test/tint/expressions/type_ctor/mat4x2/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x2/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x2/zero/f32.wgsl.expected.msl
index 466ceaa..3553bff 100644
--- a/test/tint/expressions/type_ctor/mat4x2/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x2/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x2 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f16.wgsl.expected.msl
index 21bccca..5374a3b 100644
--- a/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x3 f() {
-  thread half4x3 tint_symbol = half4x3(half3(0.0h, 1.0h, 2.0h), half3(3.0h, 4.0h, 5.0h), half3(6.0h, 7.0h, 8.0h), half3(9.0h, 10.0h, 11.0h));
-  half4x3 const m_1 = half4x3(tint_symbol);
+struct tint_private_vars_struct {
+  half4x3 m;
+};
+
+half4x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x3 const m_1 = half4x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f32.wgsl.expected.msl
index 7327219..9c054fd 100644
--- a/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x3 f() {
-  thread float4x3 tint_symbol = float4x3(float3(0.0f, 1.0f, 2.0f), float3(3.0f, 4.0f, 5.0f), float3(6.0f, 7.0f, 8.0f), float3(9.0f, 10.0f, 11.0f));
-  float4x3 const m_1 = float4x3(tint_symbol);
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
+float4x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x3 const m_1 = float4x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..7c59d76 100644
--- a/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..7438c62 100644
--- a/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..7c59d76 100644
--- a/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..7438c62 100644
--- a/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f16.wgsl.expected.msl
index 21bccca..5374a3b 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x3 f() {
-  thread half4x3 tint_symbol = half4x3(half3(0.0h, 1.0h, 2.0h), half3(3.0h, 4.0h, 5.0h), half3(6.0h, 7.0h, 8.0h), half3(9.0h, 10.0h, 11.0h));
-  half4x3 const m_1 = half4x3(tint_symbol);
+struct tint_private_vars_struct {
+  half4x3 m;
+};
+
+half4x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x3 const m_1 = half4x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f32.wgsl.expected.msl
index 7327219..9c054fd 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x3 f() {
-  thread float4x3 tint_symbol = float4x3(float3(0.0f, 1.0f, 2.0f), float3(3.0f, 4.0f, 5.0f), float3(6.0f, 7.0f, 8.0f), float3(9.0f, 10.0f, 11.0f));
-  float4x3 const m_1 = float4x3(tint_symbol);
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
+float4x3 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x3 const m_1 = float4x3((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..7438c62 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..7c59d76 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..7438c62 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..7438c62 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..7c59d76 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..7438c62 100644
--- a/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/zero/f16.wgsl.expected.msl
index 466ceaa..7c59d76 100644
--- a/test/tint/expressions/type_ctor/mat4x3/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x3/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x3/zero/f32.wgsl.expected.msl
index 466ceaa..7438c62 100644
--- a/test/tint/expressions/type_ctor/mat4x3/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x3/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x3 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f16.wgsl.expected.msl
index 178ef59..3271b7c 100644
--- a/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x4 f() {
-  thread half4x4 tint_symbol = half4x4(half4(0.0h, 1.0h, 2.0h, 3.0h), half4(4.0h, 5.0h, 6.0h, 7.0h), half4(8.0h, 9.0h, 10.0h, 11.0h), half4(12.0h, 13.0h, 14.0h, 15.0h));
-  half4x4 const m_1 = half4x4(tint_symbol);
+struct tint_private_vars_struct {
+  half4x4 m;
+};
+
+half4x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x4 const m_1 = half4x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f32.wgsl.expected.msl
index 71f0986..538ae08 100644
--- a/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/explicit/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x4 f() {
-  thread float4x4 tint_symbol = float4x4(float4(0.0f, 1.0f, 2.0f, 3.0f), float4(4.0f, 5.0f, 6.0f, 7.0f), float4(8.0f, 9.0f, 10.0f, 11.0f), float4(12.0f, 13.0f, 14.0f, 15.0f));
-  float4x4 const m_1 = float4x4(tint_symbol);
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
+float4x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x4 const m_1 = float4x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f16.wgsl.expected.msl
index 466ceaa..b9a8b98 100644
--- a/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f32.wgsl.expected.msl
index 466ceaa..ee88253 100644
--- a/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/explicit/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f16.wgsl.expected.msl
index 466ceaa..b9a8b98 100644
--- a/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f32.wgsl.expected.msl
index 466ceaa..ee88253 100644
--- a/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/explicit/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f16.wgsl.expected.msl
index 178ef59..3271b7c 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f16.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-half4x4 f() {
-  thread half4x4 tint_symbol = half4x4(half4(0.0h, 1.0h, 2.0h, 3.0h), half4(4.0h, 5.0h, 6.0h, 7.0h), half4(8.0h, 9.0h, 10.0h, 11.0h), half4(12.0h, 13.0h, 14.0h, 15.0h));
-  half4x4 const m_1 = half4x4(tint_symbol);
+struct tint_private_vars_struct {
+  half4x4 m;
+};
+
+half4x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  half4x4 const m_1 = half4x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f32.wgsl.expected.msl
index 71f0986..538ae08 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/identity/f32.wgsl.expected.msl
@@ -1,9 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-float4x4 f() {
-  thread float4x4 tint_symbol = float4x4(float4(0.0f, 1.0f, 2.0f, 3.0f), float4(4.0f, 5.0f, 6.0f, 7.0f), float4(8.0f, 9.0f, 10.0f, 11.0f), float4(12.0f, 13.0f, 14.0f, 15.0f));
-  float4x4 const m_1 = float4x4(tint_symbol);
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
+float4x4 f(thread tint_private_vars_struct* const tint_private_vars) {
+  float4x4 const m_1 = float4x4((*(tint_private_vars)).m);
   return m_1;
 }
 
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/abstract-float.wgsl.expected.msl
index 466ceaa..ee88253 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f16.wgsl.expected.msl
index 466ceaa..b9a8b98 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f32.wgsl.expected.msl
index 466ceaa..ee88253 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/scalars/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/abstract-float.wgsl.expected.msl
index 466ceaa..ee88253 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f16.wgsl.expected.msl
index 466ceaa..b9a8b98 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f32.wgsl.expected.msl
index 466ceaa..ee88253 100644
--- a/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/inferred/vectors/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/zero/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/zero/f16.wgsl.expected.msl
index 466ceaa..b9a8b98 100644
--- a/test/tint/expressions/type_ctor/mat4x4/zero/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/zero/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/mat4x4/zero/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/mat4x4/zero/f32.wgsl.expected.msl
index 466ceaa..ee88253 100644
--- a/test/tint/expressions/type_ctor/mat4x4/zero/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/mat4x4/zero/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4x4 m;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/explicit/bool.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/explicit/bool.wgsl.expected.msl
index 466ceaa..c067f40 100644
--- a/test/tint/expressions/type_ctor/vec2/explicit/bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/explicit/bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/explicit/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/explicit/f16.wgsl.expected.msl
index 466ceaa..73b9143 100644
--- a/test/tint/expressions/type_ctor/vec2/explicit/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/explicit/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/explicit/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/explicit/f32.wgsl.expected.msl
index 466ceaa..28c008f 100644
--- a/test/tint/expressions/type_ctor/vec2/explicit/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/explicit/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/explicit/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/explicit/i32.wgsl.expected.msl
index 466ceaa..41ad1aa 100644
--- a/test/tint/expressions/type_ctor/vec2/explicit/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/explicit/i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/explicit/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/explicit/u32.wgsl.expected.msl
index 466ceaa..498881f 100644
--- a/test/tint/expressions/type_ctor/vec2/explicit/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/explicit/u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/inferred/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/inferred/abstract-float.wgsl.expected.msl
index 466ceaa..28c008f 100644
--- a/test/tint/expressions/type_ctor/vec2/inferred/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/inferred/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/inferred/abstract-int.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/inferred/abstract-int.wgsl.expected.msl
index 466ceaa..41ad1aa 100644
--- a/test/tint/expressions/type_ctor/vec2/inferred/abstract-int.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/inferred/abstract-int.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/inferred/bool.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/inferred/bool.wgsl.expected.msl
index 466ceaa..c067f40 100644
--- a/test/tint/expressions/type_ctor/vec2/inferred/bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/inferred/bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/inferred/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/inferred/f16.wgsl.expected.msl
index 466ceaa..73b9143 100644
--- a/test/tint/expressions/type_ctor/vec2/inferred/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/inferred/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/inferred/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/inferred/f32.wgsl.expected.msl
index 466ceaa..28c008f 100644
--- a/test/tint/expressions/type_ctor/vec2/inferred/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/inferred/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/inferred/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/inferred/i32.wgsl.expected.msl
index 466ceaa..41ad1aa 100644
--- a/test/tint/expressions/type_ctor/vec2/inferred/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/inferred/i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec2/inferred/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec2/inferred/u32.wgsl.expected.msl
index 466ceaa..498881f 100644
--- a/test/tint/expressions/type_ctor/vec2/inferred/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec2/inferred/u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint2 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/explicit/bool.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/explicit/bool.wgsl.expected.msl
index 466ceaa..fa7091f 100644
--- a/test/tint/expressions/type_ctor/vec3/explicit/bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/explicit/bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/explicit/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/explicit/f16.wgsl.expected.msl
index 466ceaa..51886b6 100644
--- a/test/tint/expressions/type_ctor/vec3/explicit/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/explicit/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/explicit/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/explicit/f32.wgsl.expected.msl
index 466ceaa..9488f71 100644
--- a/test/tint/expressions/type_ctor/vec3/explicit/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/explicit/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/explicit/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/explicit/i32.wgsl.expected.msl
index 466ceaa..1bc8458 100644
--- a/test/tint/expressions/type_ctor/vec3/explicit/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/explicit/i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/explicit/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/explicit/u32.wgsl.expected.msl
index 466ceaa..427da62 100644
--- a/test/tint/expressions/type_ctor/vec3/explicit/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/explicit/u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/inferred/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/inferred/abstract-float.wgsl.expected.msl
index 466ceaa..9488f71 100644
--- a/test/tint/expressions/type_ctor/vec3/inferred/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/inferred/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/inferred/abstract-int.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/inferred/abstract-int.wgsl.expected.msl
index 466ceaa..1bc8458 100644
--- a/test/tint/expressions/type_ctor/vec3/inferred/abstract-int.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/inferred/abstract-int.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/inferred/bool.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/inferred/bool.wgsl.expected.msl
index 466ceaa..fa7091f 100644
--- a/test/tint/expressions/type_ctor/vec3/inferred/bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/inferred/bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/inferred/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/inferred/f16.wgsl.expected.msl
index 466ceaa..51886b6 100644
--- a/test/tint/expressions/type_ctor/vec3/inferred/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/inferred/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/inferred/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/inferred/f32.wgsl.expected.msl
index 466ceaa..9488f71 100644
--- a/test/tint/expressions/type_ctor/vec3/inferred/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/inferred/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/inferred/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/inferred/i32.wgsl.expected.msl
index 466ceaa..1bc8458 100644
--- a/test/tint/expressions/type_ctor/vec3/inferred/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/inferred/i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec3/inferred/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec3/inferred/u32.wgsl.expected.msl
index 466ceaa..427da62 100644
--- a/test/tint/expressions/type_ctor/vec3/inferred/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec3/inferred/u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint3 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/explicit/bool.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/explicit/bool.wgsl.expected.msl
index 466ceaa..1c9eebb 100644
--- a/test/tint/expressions/type_ctor/vec4/explicit/bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/explicit/bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/explicit/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/explicit/f16.wgsl.expected.msl
index 466ceaa..25ae88b 100644
--- a/test/tint/expressions/type_ctor/vec4/explicit/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/explicit/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/explicit/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/explicit/f32.wgsl.expected.msl
index 466ceaa..dc5fc0b 100644
--- a/test/tint/expressions/type_ctor/vec4/explicit/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/explicit/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/explicit/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/explicit/i32.wgsl.expected.msl
index 466ceaa..babf0f8 100644
--- a/test/tint/expressions/type_ctor/vec4/explicit/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/explicit/i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/explicit/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/explicit/u32.wgsl.expected.msl
index 466ceaa..3e1f10b 100644
--- a/test/tint/expressions/type_ctor/vec4/explicit/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/explicit/u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/inferred/abstract-float.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/inferred/abstract-float.wgsl.expected.msl
index 466ceaa..dc5fc0b 100644
--- a/test/tint/expressions/type_ctor/vec4/inferred/abstract-float.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/inferred/abstract-float.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/inferred/abstract-int.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/inferred/abstract-int.wgsl.expected.msl
index 466ceaa..babf0f8 100644
--- a/test/tint/expressions/type_ctor/vec4/inferred/abstract-int.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/inferred/abstract-int.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/inferred/bool.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/inferred/bool.wgsl.expected.msl
index 466ceaa..1c9eebb 100644
--- a/test/tint/expressions/type_ctor/vec4/inferred/bool.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/inferred/bool.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/inferred/f16.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/inferred/f16.wgsl.expected.msl
index 466ceaa..25ae88b 100644
--- a/test/tint/expressions/type_ctor/vec4/inferred/f16.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/inferred/f16.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  half4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/inferred/f32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/inferred/f32.wgsl.expected.msl
index 466ceaa..dc5fc0b 100644
--- a/test/tint/expressions/type_ctor/vec4/inferred/f32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/inferred/f32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/inferred/i32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/inferred/i32.wgsl.expected.msl
index 466ceaa..babf0f8 100644
--- a/test/tint/expressions/type_ctor/vec4/inferred/i32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/inferred/i32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int4 v;
+};
+
diff --git a/test/tint/expressions/type_ctor/vec4/inferred/u32.wgsl.expected.msl b/test/tint/expressions/type_ctor/vec4/inferred/u32.wgsl.expected.msl
index 466ceaa..3e1f10b 100644
--- a/test/tint/expressions/type_ctor/vec4/inferred/u32.wgsl.expected.msl
+++ b/test/tint/expressions/type_ctor/vec4/inferred/u32.wgsl.expected.msl
@@ -1,3 +1,7 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  uint4 v;
+};
+
diff --git a/test/tint/identifiers/underscore/double/var.wgsl.expected.msl b/test/tint/identifiers/underscore/double/var.wgsl.expected.msl
index 6d12124..03047e4 100644
--- a/test/tint/identifiers/underscore/double/var.wgsl.expected.msl
+++ b/test/tint/identifiers/underscore/double/var.wgsl.expected.msl
@@ -1,10 +1,13 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int tint_symbol = 1;
-  thread int tint_symbol_1 = 2;
-  int b = tint_symbol;
-  int b__ = tint_symbol_1;
+struct tint_private_vars_struct {
+  int a;
+  int a__;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int b = (*(tint_private_vars)).a;
+  int b__ = (*(tint_private_vars)).a__;
 }
 
diff --git a/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.msl b/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.msl
index d700a2a..e4dc3d9 100644
--- a/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.msl
+++ b/test/tint/identifiers/underscore/prefix/lower/var.wgsl.expected.msl
@@ -1,10 +1,13 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int tint_symbol = 1;
-  thread int tint_symbol_1 = 2;
-  int b = tint_symbol;
-  int _b = tint_symbol_1;
+struct tint_private_vars_struct {
+  int a;
+  int _a;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int b = (*(tint_private_vars)).a;
+  int _b = (*(tint_private_vars))._a;
 }
 
diff --git a/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.msl b/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.msl
index da05cb2..424118a 100644
--- a/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.msl
+++ b/test/tint/identifiers/underscore/prefix/upper/var.wgsl.expected.msl
@@ -1,10 +1,13 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void f() {
-  thread int tint_symbol = 1;
-  thread int tint_symbol_1 = 2;
-  int B = tint_symbol;
-  int _B = tint_symbol_1;
+struct tint_private_vars_struct {
+  int A;
+  int _A;
+};
+
+void f(thread tint_private_vars_struct* const tint_private_vars) {
+  int B = (*(tint_private_vars)).A;
+  int _B = (*(tint_private_vars))._A;
 }
 
diff --git a/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl b/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl
index 3baeea6..9c86d1b 100644
--- a/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl
+++ b/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl
@@ -14,9 +14,13 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<int, 4> A;
+};
+
 fragment void f() {
-  thread tint_array<int, 4> tint_symbol = {};
-  tint_symbol[0] = 1;
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.A[0] = 1;
   return;
 }
 
diff --git a/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl b/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl
index 19160b5..89dd743 100644
--- a/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl
+++ b/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl
@@ -18,10 +18,14 @@
   int m;
 };
 
+struct tint_private_vars_struct {
+  tint_array<S, 4> A;
+};
+
 fragment void f() {
-  thread tint_array<S, 4> tint_symbol_1 = {};
+  thread tint_private_vars_struct tint_private_vars = {};
   S const tint_symbol = S{.m=1};
-  tint_symbol_1[0] = tint_symbol;
+  tint_private_vars.A[0] = tint_symbol;
   return;
 }
 
diff --git a/test/tint/out_of_order_decls/func/var.wgsl.expected.msl b/test/tint/out_of_order_decls/func/var.wgsl.expected.msl
index 832e2eb..4ba3f02 100644
--- a/test/tint/out_of_order_decls/func/var.wgsl.expected.msl
+++ b/test/tint/out_of_order_decls/func/var.wgsl.expected.msl
@@ -1,9 +1,14 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int a;
+};
+
 fragment void f() {
-  thread int tint_symbol = 1;
-  int const b = tint_symbol;
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.a = 1;
+  int const b = tint_private_vars.a;
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/global/i32.spvasm.expected.msl b/test/tint/ptr_ref/load/global/i32.spvasm.expected.msl
index 7e3e102..b50a51a 100644
--- a/test/tint/ptr_ref/load/global/i32.spvasm.expected.msl
+++ b/test/tint/ptr_ref/load/global/i32.spvasm.expected.msl
@@ -1,15 +1,20 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void main_1() {
-  thread int tint_symbol_1 = 0;
-  int const x_9 = tint_symbol_1;
+struct tint_private_vars_struct {
+  int I;
+};
+
+void main_1(thread tint_private_vars_struct* const tint_private_vars) {
+  int const x_9 = (*(tint_private_vars)).I;
   int const x_11 = as_type<int>((as_type<uint>(x_9) + as_type<uint>(1)));
   return;
 }
 
 kernel void tint_symbol() {
-  main_1();
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.I = 0;
+  main_1(&(tint_private_vars));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/global/i32.wgsl.expected.msl b/test/tint/ptr_ref/load/global/i32.wgsl.expected.msl
index 9aa2253..101fada 100644
--- a/test/tint/ptr_ref/load/global/i32.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/global/i32.wgsl.expected.msl
@@ -1,9 +1,13 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int I;
+};
+
 kernel void tint_symbol() {
-  thread int tint_symbol_1 = 0;
-  int const i = tint_symbol_1;
+  thread tint_private_vars_struct tint_private_vars = {};
+  int const i = tint_private_vars.I;
   int const u = as_type<int>((as_type<uint>(i) + as_type<uint>(1)));
   return;
 }
diff --git a/test/tint/ptr_ref/load/global/struct_field.spvasm.expected.msl b/test/tint/ptr_ref/load/global/struct_field.spvasm.expected.msl
index 211485e..1f820c4 100644
--- a/test/tint/ptr_ref/load/global/struct_field.spvasm.expected.msl
+++ b/test/tint/ptr_ref/load/global/struct_field.spvasm.expected.msl
@@ -5,16 +5,20 @@
   int i;
 };
 
-void main_1() {
-  thread S tint_symbol_1 = {};
+struct tint_private_vars_struct {
+  S V;
+};
+
+void main_1(thread tint_private_vars_struct* const tint_private_vars) {
   int i = 0;
-  int const x_15 = tint_symbol_1.i;
+  int const x_15 = (*(tint_private_vars)).V.i;
   i = x_15;
   return;
 }
 
 kernel void tint_symbol() {
-  main_1();
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_1(&(tint_private_vars));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/global/struct_field.wgsl.expected.msl b/test/tint/ptr_ref/load/global/struct_field.wgsl.expected.msl
index 857a03e..4536b7a 100644
--- a/test/tint/ptr_ref/load/global/struct_field.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/global/struct_field.wgsl.expected.msl
@@ -5,9 +5,13 @@
   int i;
 };
 
+struct tint_private_vars_struct {
+  S V;
+};
+
 kernel void tint_symbol() {
-  thread S tint_symbol_1 = {};
-  int const i = tint_symbol_1.i;
+  thread tint_private_vars_struct tint_private_vars = {};
+  int const i = tint_private_vars.V.i;
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.msl b/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.msl
index 1b95dbc..0b8fded 100644
--- a/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/local/ptr_private.wgsl.expected.msl
@@ -1,9 +1,14 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int i;
+};
+
 kernel void tint_symbol() {
-  thread int tint_symbol_1 = 123;
-  int const u = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.i = 123;
+  int const u = as_type<int>((as_type<uint>(tint_private_vars.i) + as_type<uint>(1)));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/array_in_struct.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/array_in_struct.wgsl.expected.msl
index 86e77bc..8c49ab7 100644
--- a/test/tint/ptr_ref/load/param/private/array_in_struct.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/array_in_struct.wgsl.expected.msl
@@ -18,13 +18,17 @@
   tint_array<int, 4> arr;
 };
 
+struct tint_private_vars_struct {
+  str P;
+};
+
 tint_array<int, 4> func(thread tint_array<int, 4>* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread str tint_symbol_1 = {};
-  tint_array<int, 4> const r = func(&(tint_symbol_1.arr));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_array<int, 4> const r = func(&(tint_private_vars.P.arr));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/i32.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/i32.wgsl.expected.msl
index 7fa4197..52fc36e 100644
--- a/test/tint/ptr_ref/load/param/private/i32.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/i32.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int P;
+};
+
 int func(thread int* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread int tint_symbol_1 = 0;
-  int const r = func(&(tint_symbol_1));
+  thread tint_private_vars_struct tint_private_vars = {};
+  int const r = func(&(tint_private_vars.P));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/i32_in_struct.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/i32_in_struct.wgsl.expected.msl
index 8ab2385..831e614 100644
--- a/test/tint/ptr_ref/load/param/private/i32_in_struct.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/i32_in_struct.wgsl.expected.msl
@@ -5,13 +5,17 @@
   int i;
 };
 
+struct tint_private_vars_struct {
+  str P;
+};
+
 int func(thread int* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread str tint_symbol_1 = {};
-  int const r = func(&(tint_symbol_1.i));
+  thread tint_private_vars_struct tint_private_vars = {};
+  int const r = func(&(tint_private_vars.P.i));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/struct_in_array.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/struct_in_array.wgsl.expected.msl
index e3794a9..b3c9f59 100644
--- a/test/tint/ptr_ref/load/param/private/struct_in_array.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/struct_in_array.wgsl.expected.msl
@@ -18,13 +18,17 @@
   int i;
 };
 
+struct tint_private_vars_struct {
+  tint_array<str, 4> P;
+};
+
 str func(thread str* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread tint_array<str, 4> tint_symbol_1 = {};
-  str const r = func(&(tint_symbol_1[2]));
+  thread tint_private_vars_struct tint_private_vars = {};
+  str const r = func(&(tint_private_vars.P[2]));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl
index 27b7a26..a8e4484 100644
--- a/test/tint/ptr_ref/load/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 P;
+};
+
 float2 func(thread float2* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread float2x2 tint_symbol_1 = float2x2(0.0f);
-  float2 const r = func(&(tint_symbol_1[1]));
+  thread tint_private_vars_struct tint_private_vars = {};
+  float2 const r = func(&(tint_private_vars.P[1]));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/vec4_f32.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/vec4_f32.wgsl.expected.msl
index 5b17645..b0e65d9 100644
--- a/test/tint/ptr_ref/load/param/private/vec4_f32.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/vec4_f32.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 P;
+};
+
 float4 func(thread float4* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread float4 tint_symbol_1 = 0.0f;
-  float4 const r = func(&(tint_symbol_1));
+  thread tint_private_vars_struct tint_private_vars = {};
+  float4 const r = func(&(tint_private_vars.P));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl
index f2112e8..4e7885f 100644
--- a/test/tint/ptr_ref/load/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 P;
+};
+
 float4 func(thread float4* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread float2x4 tint_symbol_1 = float2x4(0.0f);
-  float4 const r = func(&(tint_symbol_1[1]));
+  thread tint_private_vars_struct tint_private_vars = {};
+  float4 const r = func(&(tint_private_vars.P[1]));
   return;
 }
 
diff --git a/test/tint/ptr_ref/load/param/private/vec4_f32_in_struct.wgsl.expected.msl b/test/tint/ptr_ref/load/param/private/vec4_f32_in_struct.wgsl.expected.msl
index 256f2a4..3fdab82 100644
--- a/test/tint/ptr_ref/load/param/private/vec4_f32_in_struct.wgsl.expected.msl
+++ b/test/tint/ptr_ref/load/param/private/vec4_f32_in_struct.wgsl.expected.msl
@@ -5,13 +5,17 @@
   float4 i;
 };
 
+struct tint_private_vars_struct {
+  str P;
+};
+
 float4 func(thread float4* const pointer) {
   return *(pointer);
 }
 
 kernel void tint_symbol() {
-  thread str tint_symbol_1 = {};
-  float4 const r = func(&(tint_symbol_1.i));
+  thread tint_private_vars_struct tint_private_vars = {};
+  float4 const r = func(&(tint_private_vars.P.i));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/global/i32.spvasm.expected.msl b/test/tint/ptr_ref/store/global/i32.spvasm.expected.msl
index 5325510..98bae1a 100644
--- a/test/tint/ptr_ref/store/global/i32.spvasm.expected.msl
+++ b/test/tint/ptr_ref/store/global/i32.spvasm.expected.msl
@@ -1,15 +1,20 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void main_1() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 123;
-  tint_symbol_1 = 123;
+struct tint_private_vars_struct {
+  int I;
+};
+
+void main_1(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).I = 123;
+  (*(tint_private_vars)).I = 123;
   return;
 }
 
 kernel void tint_symbol() {
-  main_1();
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.I = 0;
+  main_1(&(tint_private_vars));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/global/i32.wgsl.expected.msl b/test/tint/ptr_ref/store/global/i32.wgsl.expected.msl
index 7c4f8ee..9725b54 100644
--- a/test/tint/ptr_ref/store/global/i32.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/global/i32.wgsl.expected.msl
@@ -1,10 +1,14 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int I;
+};
+
 kernel void tint_symbol() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = 123;
-  tint_symbol_1 = 123;
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.I = 123;
+  tint_private_vars.I = 123;
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/global/struct_field.spvasm.expected.msl b/test/tint/ptr_ref/store/global/struct_field.spvasm.expected.msl
index 08486b5..2a1f4cd 100644
--- a/test/tint/ptr_ref/store/global/struct_field.spvasm.expected.msl
+++ b/test/tint/ptr_ref/store/global/struct_field.spvasm.expected.msl
@@ -5,14 +5,18 @@
   int i;
 };
 
-void main_1() {
-  thread S tint_symbol_1 = {};
-  tint_symbol_1.i = 5;
+struct tint_private_vars_struct {
+  S V;
+};
+
+void main_1(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).V.i = 5;
   return;
 }
 
 kernel void tint_symbol() {
-  main_1();
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_1(&(tint_private_vars));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/array_in_struct.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/array_in_struct.wgsl.expected.msl
index fbc443b..97c88bb 100644
--- a/test/tint/ptr_ref/store/param/private/array_in_struct.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/array_in_struct.wgsl.expected.msl
@@ -18,14 +18,18 @@
   tint_array<int, 4> arr;
 };
 
+struct tint_private_vars_struct {
+  str P;
+};
+
 void func(thread tint_array<int, 4>* const pointer) {
   tint_array<int, 4> const tint_symbol_1 = tint_array<int, 4>{};
   *(pointer) = tint_symbol_1;
 }
 
 kernel void tint_symbol() {
-  thread str tint_symbol_2 = {};
-  func(&(tint_symbol_2.arr));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P.arr));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/i32.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/i32.wgsl.expected.msl
index ead132a..595bb42 100644
--- a/test/tint/ptr_ref/store/param/private/i32.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/i32.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int P;
+};
+
 void func(thread int* const pointer) {
   *(pointer) = 42;
 }
 
 kernel void tint_symbol() {
-  thread int tint_symbol_1 = 0;
-  func(&(tint_symbol_1));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/i32_in_struct.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/i32_in_struct.wgsl.expected.msl
index bcc4591..afde805 100644
--- a/test/tint/ptr_ref/store/param/private/i32_in_struct.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/i32_in_struct.wgsl.expected.msl
@@ -5,13 +5,17 @@
   int i;
 };
 
+struct tint_private_vars_struct {
+  str P;
+};
+
 void func(thread int* const pointer) {
   *(pointer) = 42;
 }
 
 kernel void tint_symbol() {
-  thread str tint_symbol_1 = {};
-  func(&(tint_symbol_1.i));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P.i));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/struct_in_array.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/struct_in_array.wgsl.expected.msl
index d0f273b..5a30299 100644
--- a/test/tint/ptr_ref/store/param/private/struct_in_array.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/struct_in_array.wgsl.expected.msl
@@ -18,14 +18,18 @@
   int i;
 };
 
+struct tint_private_vars_struct {
+  tint_array<str, 4> P;
+};
+
 void func(thread str* const pointer) {
   str const tint_symbol_1 = str{};
   *(pointer) = tint_symbol_1;
 }
 
 kernel void tint_symbol() {
-  thread tint_array<str, 4> tint_symbol_2 = {};
-  func(&(tint_symbol_2[2]));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P[2]));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl
index 5ba30955..0c171d2 100644
--- a/test/tint/ptr_ref/store/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/vec2_f32_in_mat2x2.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x2 P;
+};
+
 void func(thread float2* const pointer) {
   *(pointer) = float2(0.0f);
 }
 
 kernel void tint_symbol() {
-  thread float2x2 tint_symbol_1 = float2x2(0.0f);
-  func(&(tint_symbol_1[1]));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P[1]));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/vec4_f32.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/vec4_f32.wgsl.expected.msl
index 1f3faf7..0fd7c46 100644
--- a/test/tint/ptr_ref/store/param/private/vec4_f32.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/vec4_f32.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float4 P;
+};
+
 void func(thread float4* const pointer) {
   *(pointer) = float4(0.0f);
 }
 
 kernel void tint_symbol() {
-  thread float4 tint_symbol_1 = 0.0f;
-  func(&(tint_symbol_1));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl
index cbc5a43..8a0bce7 100644
--- a/test/tint/ptr_ref/store/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/vec4_f32_in_mat2x4.wgsl.expected.msl
@@ -1,13 +1,17 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x4 P;
+};
+
 void func(thread float4* const pointer) {
   *(pointer) = float4(0.0f);
 }
 
 kernel void tint_symbol() {
-  thread float2x4 tint_symbol_1 = float2x4(0.0f);
-  func(&(tint_symbol_1[1]));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P[1]));
   return;
 }
 
diff --git a/test/tint/ptr_ref/store/param/private/vec4_f32_in_struct.wgsl.expected.msl b/test/tint/ptr_ref/store/param/private/vec4_f32_in_struct.wgsl.expected.msl
index 3185a65..f6f9502 100644
--- a/test/tint/ptr_ref/store/param/private/vec4_f32_in_struct.wgsl.expected.msl
+++ b/test/tint/ptr_ref/store/param/private/vec4_f32_in_struct.wgsl.expected.msl
@@ -5,13 +5,17 @@
   float4 i;
 };
 
+struct tint_private_vars_struct {
+  str P;
+};
+
 void func(thread float4* const pointer) {
   *(pointer) = float4(0.0f);
 }
 
 kernel void tint_symbol() {
-  thread str tint_symbol_1 = {};
-  func(&(tint_symbol_1.i));
+  thread tint_private_vars_struct tint_private_vars = {};
+  func(&(tint_private_vars.P.i));
   return;
 }
 
diff --git a/test/tint/samples/simple_vertex.spvasm.expected.msl b/test/tint/samples/simple_vertex.spvasm.expected.msl
index 27cb3a4..4119df0 100644
--- a/test/tint/samples/simple_vertex.spvasm.expected.msl
+++ b/test/tint/samples/simple_vertex.spvasm.expected.msl
@@ -1,8 +1,12 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void main_1(thread float4* const tint_symbol_3) {
-  *(tint_symbol_3) = float4(0.0f);
+struct tint_private_vars_struct {
+  float4 gl_Position;
+};
+
+void main_1(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).gl_Position = float4(0.0f);
   return;
 }
 
@@ -14,15 +18,15 @@
   float4 gl_Position [[position]];
 };
 
-main_out tint_symbol_inner(thread float4* const tint_symbol_4) {
-  main_1(tint_symbol_4);
-  main_out const tint_symbol_2 = {.gl_Position=*(tint_symbol_4)};
+main_out tint_symbol_inner(thread tint_private_vars_struct* const tint_private_vars) {
+  main_1(tint_private_vars);
+  main_out const tint_symbol_2 = {.gl_Position=(*(tint_private_vars)).gl_Position};
   return tint_symbol_2;
 }
 
 vertex tint_symbol_1 tint_symbol() {
-  thread float4 tint_symbol_5 = 0.0f;
-  main_out const inner_result = tint_symbol_inner(&(tint_symbol_5));
+  thread tint_private_vars_struct tint_private_vars = {};
+  main_out const inner_result = tint_symbol_inner(&(tint_private_vars));
   tint_symbol_1 wrapper_result = {};
   wrapper_result.gl_Position = inner_result.gl_Position;
   return wrapper_result;
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl
index 4cd6b66..c5637a4 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl
@@ -14,6 +14,10 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint nextIndex;
+};
+
 struct Uniforms {
   /* 0x0000 */ uint i;
   /* 0x0004 */ uint j;
@@ -31,17 +35,17 @@
   tint_array<S1, 8> a1;
 };
 
-uint getNextIndex() {
-  thread uint tint_symbol_2 = 0u;
-  tint_symbol_2 = (tint_symbol_2 + 1u);
-  return tint_symbol_2;
+uint getNextIndex(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).nextIndex = ((*(tint_private_vars)).nextIndex + 1u);
+  return (*(tint_private_vars)).nextIndex;
 }
 
-kernel void tint_symbol(const constant Uniforms* tint_symbol_3 [[buffer(0)]]) {
+kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
   InnerS v = {};
   OuterS s = {};
-  uint const tint_symbol_1 = getNextIndex();
-  s.a1[tint_symbol_1].a2[(*(tint_symbol_3)).j] = v;
+  uint const tint_symbol_1 = getNextIndex(&(tint_private_vars));
+  s.a1[tint_symbol_1].a2[(*(tint_symbol_2)).j] = v;
   return;
 }
 
diff --git a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl
index 3c7c47a..c7c4bd6 100644
--- a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl
+++ b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl
@@ -14,25 +14,29 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  int counter;
+};
+
 struct S {
   tint_array<int4, 4> a;
 };
 
-int foo(thread int* const tint_symbol_4) {
-  *(tint_symbol_4) = as_type<int>((as_type<uint>(*(tint_symbol_4)) + as_type<uint>(1)));
-  return *(tint_symbol_4);
+int foo(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(1)));
+  return (*(tint_private_vars)).counter;
 }
 
-int bar(thread int* const tint_symbol_5) {
-  *(tint_symbol_5) = as_type<int>((as_type<uint>(*(tint_symbol_5)) + as_type<uint>(2)));
-  return *(tint_symbol_5);
+int bar(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).counter = as_type<int>((as_type<uint>((*(tint_private_vars)).counter) + as_type<uint>(2)));
+  return (*(tint_private_vars)).counter;
 }
 
-void tint_symbol(thread int* const tint_symbol_6) {
+void tint_symbol(thread tint_private_vars_struct* const tint_private_vars) {
   S x = S{};
-  int const tint_symbol_3 = foo(tint_symbol_6);
+  int const tint_symbol_3 = foo(tint_private_vars);
   int const tint_symbol_1_save = tint_symbol_3;
-  int const tint_symbol_2 = bar(tint_symbol_6);
+  int const tint_symbol_2 = bar(tint_private_vars);
   x.a[tint_symbol_1_save][tint_symbol_2] = as_type<int>((as_type<uint>(x.a[tint_symbol_1_save][tint_symbol_2]) + as_type<uint>(5)));
 }
 
diff --git a/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.msl b/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.msl
index 36a30d4..47a5e29 100644
--- a/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.msl
+++ b/test/tint/statements/compound_assign/divide_by_zero.wgsl.expected.msl
@@ -1,6 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int a;
+  float b;
+};
+
 int tint_div(int lhs, int rhs) {
   return (lhs / select(rhs, 1, bool((rhs == 0) | bool((lhs == (-2147483647 - 1)) & (rhs == -1)))));
 }
@@ -14,16 +19,14 @@
   }
 }
 
-void foo(int maybe_zero) {
-  thread int tint_symbol = 0;
-  thread float tint_symbol_1 = 0.0f;
-  tint_symbol = tint_div(tint_symbol, 0);
-  tint_symbol = tint_mod(tint_symbol, 0);
-  tint_symbol = tint_div(tint_symbol, maybe_zero);
-  tint_symbol = tint_mod(tint_symbol, maybe_zero);
-  tint_symbol_1 = (tint_symbol_1 / 0.0f);
-  tint_symbol_1 = fmod(tint_symbol_1, 0.0f);
-  tint_symbol_1 = (tint_symbol_1 / float(maybe_zero));
-  tint_symbol_1 = fmod(tint_symbol_1, float(maybe_zero));
+void foo(int maybe_zero, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).a = tint_div((*(tint_private_vars)).a, 0);
+  (*(tint_private_vars)).a = tint_mod((*(tint_private_vars)).a, 0);
+  (*(tint_private_vars)).a = tint_div((*(tint_private_vars)).a, maybe_zero);
+  (*(tint_private_vars)).a = tint_mod((*(tint_private_vars)).a, maybe_zero);
+  (*(tint_private_vars)).b = ((*(tint_private_vars)).b / 0.0f);
+  (*(tint_private_vars)).b = fmod((*(tint_private_vars)).b, 0.0f);
+  (*(tint_private_vars)).b = ((*(tint_private_vars)).b / float(maybe_zero));
+  (*(tint_private_vars)).b = fmod((*(tint_private_vars)).b, float(maybe_zero));
 }
 
diff --git a/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl b/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl
index daed750..cd34a12 100644
--- a/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl
+++ b/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl
@@ -14,42 +14,46 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint i;
+};
+
 struct S {
   int a;
   float4 b;
   float2x2 c;
 };
 
-int idx1(thread uint* const tint_symbol_5) {
-  *(tint_symbol_5) = (*(tint_symbol_5) + 1u);
+int idx1(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).i = ((*(tint_private_vars)).i + 1u);
   return 1;
 }
 
-int idx2(thread uint* const tint_symbol_6) {
-  *(tint_symbol_6) = (*(tint_symbol_6) + 2u);
+int idx2(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).i = ((*(tint_private_vars)).i + 2u);
   return 1;
 }
 
-int idx3(thread uint* const tint_symbol_7) {
-  *(tint_symbol_7) = (*(tint_symbol_7) + 3u);
+int idx3(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).i = ((*(tint_private_vars)).i + 3u);
   return 1;
 }
 
-void foo(thread uint* const tint_symbol_8) {
+void foo(thread tint_private_vars_struct* const tint_private_vars) {
   tint_array<float, 4> a = tint_array<float, 4>{};
   {
-    int const tint_symbol_2 = idx1(tint_symbol_8);
+    int const tint_symbol_2 = idx1(tint_private_vars);
     int const tint_symbol_save = tint_symbol_2;
     a[tint_symbol_save] = (a[tint_symbol_save] * 2.0f);
     while (true) {
-      int const tint_symbol_3 = idx2(tint_symbol_8);
+      int const tint_symbol_3 = idx2(tint_private_vars);
       if (!((a[tint_symbol_3] < 10.0f))) {
         break;
       }
       {
       }
       {
-        int const tint_symbol_4 = idx3(tint_symbol_8);
+        int const tint_symbol_4 = idx3(tint_private_vars);
         int const tint_symbol_1_save = tint_symbol_4;
         a[tint_symbol_1_save] = (a[tint_symbol_1_save] + 1.0f);
       }
diff --git a/test/tint/statements/compound_assign/private.wgsl.expected.msl b/test/tint/statements/compound_assign/private.wgsl.expected.msl
index f573620..dc43a37 100644
--- a/test/tint/statements/compound_assign/private.wgsl.expected.msl
+++ b/test/tint/statements/compound_assign/private.wgsl.expected.msl
@@ -1,16 +1,19 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int a;
+  float4 b;
+  float2x2 c;
+};
+
 int tint_div(int lhs, int rhs) {
   return (lhs / select(rhs, 1, bool((rhs == 0) | bool((lhs == (-2147483647 - 1)) & (rhs == -1)))));
 }
 
-void foo() {
-  thread int tint_symbol = 0;
-  thread float4 tint_symbol_1 = 0.0f;
-  thread float2x2 tint_symbol_2 = float2x2(0.0f);
-  tint_symbol = tint_div(tint_symbol, 2);
-  tint_symbol_1 = (tint_symbol_1 * float4x4(float4(0.0f), float4(0.0f), float4(0.0f), float4(0.0f)));
-  tint_symbol_2 = (tint_symbol_2 * 2.0f);
+void foo(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).a = tint_div((*(tint_private_vars)).a, 2);
+  (*(tint_private_vars)).b = ((*(tint_private_vars)).b * float4x4(float4(0.0f), float4(0.0f), float4(0.0f), float4(0.0f)));
+  (*(tint_private_vars)).c = ((*(tint_private_vars)).c * 2.0f);
 }
 
diff --git a/test/tint/statements/decrement/complex.wgsl.expected.msl b/test/tint/statements/decrement/complex.wgsl.expected.msl
index c3930ad..6bb4088 100644
--- a/test/tint/statements/decrement/complex.wgsl.expected.msl
+++ b/test/tint/statements/decrement/complex.wgsl.expected.msl
@@ -14,61 +14,65 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint v;
+};
+
 struct S {
   /* 0x0000 */ tint_array<int4, 4> a;
 };
 
-int idx1(thread uint* const tint_symbol_10) {
-  *(tint_symbol_10) = (*(tint_symbol_10) - 1u);
+int idx1(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v - 1u);
   return 1;
 }
 
-int idx2(thread uint* const tint_symbol_11) {
-  *(tint_symbol_11) = (*(tint_symbol_11) - 1u);
+int idx2(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v - 1u);
   return 2;
 }
 
-int idx3(thread uint* const tint_symbol_12) {
-  *(tint_symbol_12) = (*(tint_symbol_12) - 1u);
+int idx3(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v - 1u);
   return 3;
 }
 
-int idx4(thread uint* const tint_symbol_13) {
-  *(tint_symbol_13) = (*(tint_symbol_13) - 1u);
+int idx4(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v - 1u);
   return 4;
 }
 
-int idx5(thread uint* const tint_symbol_14) {
-  *(tint_symbol_14) = (*(tint_symbol_14) - 1u);
+int idx5(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v - 1u);
   return 0;
 }
 
-int idx6(thread uint* const tint_symbol_15) {
-  *(tint_symbol_15) = (*(tint_symbol_15) - 1u);
+int idx6(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v - 1u);
   return 2;
 }
 
-void tint_symbol_1(thread uint* const tint_symbol_16, device tint_array<S, 1>* const tint_symbol_17) {
+void tint_symbol_1(thread tint_private_vars_struct* const tint_private_vars, device tint_array<S, 1>* const tint_symbol_10) {
   {
-    int const tint_symbol_6 = idx1(tint_symbol_16);
-    int const tint_symbol_7 = idx2(tint_symbol_16);
+    int const tint_symbol_6 = idx1(tint_private_vars);
+    int const tint_symbol_7 = idx2(tint_private_vars);
     int const tint_symbol_2_save = tint_symbol_6;
     int const tint_symbol_2_save_1 = tint_symbol_7;
-    int const tint_symbol_3 = idx3(tint_symbol_16);
-    (*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3]) - as_type<uint>(1)));
+    int const tint_symbol_3 = idx3(tint_private_vars);
+    (*(tint_symbol_10))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_10))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3]) - as_type<uint>(1)));
     while (true) {
-      if (!((*(tint_symbol_16) < 10u))) {
+      if (!(((*(tint_private_vars)).v < 10u))) {
         break;
       }
       {
       }
       {
-        int const tint_symbol_8 = idx4(tint_symbol_16);
-        int const tint_symbol_9 = idx5(tint_symbol_16);
+        int const tint_symbol_8 = idx4(tint_private_vars);
+        int const tint_symbol_9 = idx5(tint_private_vars);
         int const tint_symbol_4_save = tint_symbol_8;
         int const tint_symbol_4_save_1 = tint_symbol_9;
-        int const tint_symbol_5 = idx6(tint_symbol_16);
-        (*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5]) - as_type<uint>(1)));
+        int const tint_symbol_5 = idx6(tint_private_vars);
+        (*(tint_symbol_10))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_10))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5]) - as_type<uint>(1)));
       }
     }
   }
diff --git a/test/tint/statements/decrement/private.wgsl.expected.msl b/test/tint/statements/decrement/private.wgsl.expected.msl
index 2c42333..1ca42a2 100644
--- a/test/tint/statements/decrement/private.wgsl.expected.msl
+++ b/test/tint/statements/decrement/private.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void tint_symbol() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) - as_type<uint>(1)));
+struct tint_private_vars_struct {
+  int i;
+};
+
+void tint_symbol(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).i = as_type<int>((as_type<uint>((*(tint_private_vars)).i) - as_type<uint>(1)));
 }
 
diff --git a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl
index cfdeaaf..db17a1d 100644
--- a/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl
+++ b/test/tint/statements/discard/atomic_cmpxchg.wgsl.expected.msl
@@ -12,6 +12,10 @@
   return {old_value, exchanged};
 }
 
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
 struct tint_symbol_2 {
   int old_value;
   bool exchanged;
@@ -21,12 +25,12 @@
   int value [[color(0)]];
 };
 
-int foo_inner(thread bool* const tint_symbol_4, device atomic_int* const tint_symbol_5) {
-  *(tint_symbol_4) = true;
+int foo_inner(thread tint_private_vars_struct* const tint_private_vars, device atomic_int* const tint_symbol_4) {
+  (*(tint_private_vars)).tint_discarded = true;
   int x = 0;
   tint_symbol_2 tint_symbol_1 = {};
-  if (!(*(tint_symbol_4))) {
-    atomic_compare_exchange_resulti32 const tint_symbol_3 = atomicCompareExchangeWeak_1(tint_symbol_5, 0, 1);
+  if (!((*(tint_private_vars)).tint_discarded)) {
+    atomic_compare_exchange_resulti32 const tint_symbol_3 = atomicCompareExchangeWeak_1(tint_symbol_4, 0, 1);
     tint_symbol_1.old_value = tint_symbol_3.old_value;
     tint_symbol_1.exchanged = tint_symbol_3.exchanged;
   }
@@ -37,12 +41,13 @@
   return x;
 }
 
-fragment tint_symbol foo(device atomic_int* tint_symbol_7 [[buffer(0)]]) {
-  thread bool tint_symbol_6 = false;
-  int const inner_result = foo_inner(&(tint_symbol_6), tint_symbol_7);
+fragment tint_symbol foo(device atomic_int* tint_symbol_5 [[buffer(0)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
+  int const inner_result = foo_inner(&(tint_private_vars), tint_symbol_5);
   tint_symbol wrapper_result = {};
   wrapper_result.value = inner_result;
-  if (tint_symbol_6) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return wrapper_result;
diff --git a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.msl b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.msl
index 73ffeac..36b7539 100644
--- a/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.msl
+++ b/test/tint/statements/discard/atomic_in_for_loop_continuing.wgsl.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
 int tint_ftoi(float v) {
   return select(2147483647, select(int(v), (-2147483647 - 1), (v < -2147483648.0f)), (v < 2147483520.0f));
 }
@@ -14,11 +18,11 @@
   int value [[color(0)]];
 };
 
-int foo_inner(float in, float2 coord, thread bool* const tint_symbol_4, texture2d<float, access::sample> tint_symbol_5, sampler tint_symbol_6, device atomic_int* const tint_symbol_7) {
+int foo_inner(float in, float2 coord, thread tint_private_vars_struct* const tint_private_vars, texture2d<float, access::sample> tint_symbol_4, sampler tint_symbol_5, device atomic_int* const tint_symbol_6) {
   if ((in == 0.0f)) {
-    *(tint_symbol_4) = true;
+    (*(tint_private_vars)).tint_discarded = true;
   }
-  int result = tint_ftoi(tint_symbol_5.sample(tint_symbol_6, coord)[0]);
+  int result = tint_ftoi(tint_symbol_4.sample(tint_symbol_5, coord)[0]);
   {
     int i = 0;
     while (true) {
@@ -30,8 +34,8 @@
       }
       {
         int tint_symbol_3 = 0;
-        if (!(*(tint_symbol_4))) {
-          tint_symbol_3 = atomic_fetch_add_explicit(tint_symbol_7, 1, memory_order_relaxed);
+        if (!((*(tint_private_vars)).tint_discarded)) {
+          tint_symbol_3 = atomic_fetch_add_explicit(tint_symbol_6, 1, memory_order_relaxed);
         }
         i = tint_symbol_3;
       }
@@ -40,12 +44,13 @@
   return result;
 }
 
-fragment tint_symbol_2 foo(texture2d<float, access::sample> tint_symbol_9 [[texture(0)]], sampler tint_symbol_10 [[sampler(0)]], device atomic_int* tint_symbol_11 [[buffer(0)]], tint_symbol_1 tint_symbol [[stage_in]]) {
-  thread bool tint_symbol_8 = false;
-  int const inner_result = foo_inner(tint_symbol.in, tint_symbol.coord, &(tint_symbol_8), tint_symbol_9, tint_symbol_10, tint_symbol_11);
+fragment tint_symbol_2 foo(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]], sampler tint_symbol_8 [[sampler(0)]], device atomic_int* tint_symbol_9 [[buffer(0)]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
+  int const inner_result = foo_inner(tint_symbol.in, tint_symbol.coord, &(tint_private_vars), tint_symbol_7, tint_symbol_8, tint_symbol_9);
   tint_symbol_2 wrapper_result = {};
   wrapper_result.value = inner_result;
-  if (tint_symbol_8) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return wrapper_result;
diff --git a/test/tint/statements/discard/helper_functions.wgsl.expected.msl b/test/tint/statements/discard/helper_functions.wgsl.expected.msl
index 57e769e..5fe7b84 100644
--- a/test/tint/statements/discard/helper_functions.wgsl.expected.msl
+++ b/test/tint/statements/discard/helper_functions.wgsl.expected.msl
@@ -1,23 +1,28 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void foo(device int* const tint_symbol_1, thread bool* const tint_symbol_2) {
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
+void foo(thread tint_private_vars_struct* const tint_private_vars, device int* const tint_symbol_1) {
   if ((*(tint_symbol_1) < 0)) {
-    *(tint_symbol_2) = true;
+    (*(tint_private_vars)).tint_discarded = true;
   }
 }
 
-void bar(thread bool* const tint_symbol_3, device float* const tint_symbol_4) {
-  if (!(*(tint_symbol_3))) {
-    *(tint_symbol_4) = dfdx(1.0f);
+void bar(thread tint_private_vars_struct* const tint_private_vars, device float* const tint_symbol_2) {
+  if (!((*(tint_private_vars)).tint_discarded)) {
+    *(tint_symbol_2) = dfdx(1.0f);
   }
 }
 
-fragment void tint_symbol(device int* tint_symbol_5 [[buffer(0)]], device float* tint_symbol_7 [[buffer(1)]]) {
-  thread bool tint_symbol_6 = false;
-  foo(tint_symbol_5, &(tint_symbol_6));
-  bar(&(tint_symbol_6), tint_symbol_7);
-  if (tint_symbol_6) {
+fragment void tint_symbol(device int* tint_symbol_3 [[buffer(0)]], device float* tint_symbol_4 [[buffer(1)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
+  foo(&(tint_private_vars), tint_symbol_3);
+  bar(&(tint_private_vars), tint_symbol_4);
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return;
diff --git a/test/tint/statements/discard/multiple_returns.wgsl.expected.msl b/test/tint/statements/discard/multiple_returns.wgsl.expected.msl
index 751016e..7bbefc8 100644
--- a/test/tint/statements/discard/multiple_returns.wgsl.expected.msl
+++ b/test/tint/statements/discard/multiple_returns.wgsl.expected.msl
@@ -1,22 +1,27 @@
 #include <metal_stdlib>
 
 using namespace metal;
-fragment void tint_symbol(device int* tint_symbol_1 [[buffer(0)]], device float* tint_symbol_3 [[buffer(1)]]) {
-  thread bool tint_symbol_2 = false;
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
+fragment void tint_symbol(device int* tint_symbol_1 [[buffer(0)]], device float* tint_symbol_2 [[buffer(1)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
   if ((*(tint_symbol_1) < 0)) {
-    tint_symbol_2 = true;
+    tint_private_vars.tint_discarded = true;
   }
-  if (!(tint_symbol_2)) {
-    *(tint_symbol_3) = dfdx(1.0f);
+  if (!(tint_private_vars.tint_discarded)) {
+    *(tint_symbol_2) = dfdx(1.0f);
   }
-  if ((*(tint_symbol_3) < 0.0f)) {
+  if ((*(tint_symbol_2) < 0.0f)) {
     int i = 0;
     while (true) {
-      if ((*(tint_symbol_3) > float(i))) {
-        if (!(tint_symbol_2)) {
-          *(tint_symbol_3) = float(i);
+      if ((*(tint_symbol_2) > float(i))) {
+        if (!(tint_private_vars.tint_discarded)) {
+          *(tint_symbol_2) = float(i);
         }
-        if (tint_symbol_2) {
+        if (tint_private_vars.tint_discarded) {
           discard_fragment();
         }
         return;
@@ -26,12 +31,12 @@
         if ((i == 5)) { break; }
       }
     }
-    if (tint_symbol_2) {
+    if (tint_private_vars.tint_discarded) {
       discard_fragment();
     }
     return;
   }
-  if (tint_symbol_2) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return;
diff --git a/test/tint/statements/discard/nested_return.wgsl.expected.msl b/test/tint/statements/discard/nested_return.wgsl.expected.msl
index eac069d..18a8700 100644
--- a/test/tint/statements/discard/nested_return.wgsl.expected.msl
+++ b/test/tint/statements/discard/nested_return.wgsl.expected.msl
@@ -1,14 +1,19 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
 fragment void tint_symbol(device int* tint_symbol_1 [[buffer(0)]]) {
-  thread bool tint_symbol_2 = false;
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
   if ((*(tint_symbol_1) < 0)) {
-    tint_symbol_2 = true;
+    tint_private_vars.tint_discarded = true;
   }
   {
     {
-      if (tint_symbol_2) {
+      if (tint_private_vars.tint_discarded) {
         discard_fragment();
       }
       return;
diff --git a/test/tint/statements/discard/non_uniform.wgsl.expected.msl b/test/tint/statements/discard/non_uniform.wgsl.expected.msl
index 2ada21d..d069100 100644
--- a/test/tint/statements/discard/non_uniform.wgsl.expected.msl
+++ b/test/tint/statements/discard/non_uniform.wgsl.expected.msl
@@ -1,15 +1,20 @@
 #include <metal_stdlib>
 
 using namespace metal;
-fragment void tint_symbol(device int* tint_symbol_1 [[buffer(0)]], device float* tint_symbol_3 [[buffer(1)]]) {
-  thread bool tint_symbol_2 = false;
+struct tint_private_vars_struct {
+  bool tint_discarded;
+};
+
+fragment void tint_symbol(device int* tint_symbol_1 [[buffer(0)]], device float* tint_symbol_2 [[buffer(1)]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.tint_discarded = false;
   if ((*(tint_symbol_1) < 0)) {
-    tint_symbol_2 = true;
+    tint_private_vars.tint_discarded = true;
   }
-  if (!(tint_symbol_2)) {
-    *(tint_symbol_3) = dfdx(1.0f);
+  if (!(tint_private_vars.tint_discarded)) {
+    *(tint_symbol_2) = dfdx(1.0f);
   }
-  if (tint_symbol_2) {
+  if (tint_private_vars.tint_discarded) {
     discard_fragment();
   }
   return;
diff --git a/test/tint/statements/increment/complex.wgsl.expected.msl b/test/tint/statements/increment/complex.wgsl.expected.msl
index 950b033..ab1347f 100644
--- a/test/tint/statements/increment/complex.wgsl.expected.msl
+++ b/test/tint/statements/increment/complex.wgsl.expected.msl
@@ -14,61 +14,65 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  uint v;
+};
+
 struct S {
   /* 0x0000 */ tint_array<int4, 4> a;
 };
 
-int idx1(thread uint* const tint_symbol_10) {
-  *(tint_symbol_10) = (*(tint_symbol_10) + 1u);
+int idx1(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v + 1u);
   return 1;
 }
 
-int idx2(thread uint* const tint_symbol_11) {
-  *(tint_symbol_11) = (*(tint_symbol_11) + 1u);
+int idx2(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v + 1u);
   return 2;
 }
 
-int idx3(thread uint* const tint_symbol_12) {
-  *(tint_symbol_12) = (*(tint_symbol_12) + 1u);
+int idx3(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v + 1u);
   return 3;
 }
 
-int idx4(thread uint* const tint_symbol_13) {
-  *(tint_symbol_13) = (*(tint_symbol_13) + 1u);
+int idx4(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v + 1u);
   return 4;
 }
 
-int idx5(thread uint* const tint_symbol_14) {
-  *(tint_symbol_14) = (*(tint_symbol_14) + 1u);
+int idx5(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v + 1u);
   return 0;
 }
 
-int idx6(thread uint* const tint_symbol_15) {
-  *(tint_symbol_15) = (*(tint_symbol_15) + 1u);
+int idx6(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).v = ((*(tint_private_vars)).v + 1u);
   return 2;
 }
 
-void tint_symbol_1(thread uint* const tint_symbol_16, device tint_array<S, 1>* const tint_symbol_17) {
+void tint_symbol_1(thread tint_private_vars_struct* const tint_private_vars, device tint_array<S, 1>* const tint_symbol_10) {
   {
-    int const tint_symbol_6 = idx1(tint_symbol_16);
-    int const tint_symbol_7 = idx2(tint_symbol_16);
+    int const tint_symbol_6 = idx1(tint_private_vars);
+    int const tint_symbol_7 = idx2(tint_private_vars);
     int const tint_symbol_2_save = tint_symbol_6;
     int const tint_symbol_2_save_1 = tint_symbol_7;
-    int const tint_symbol_3 = idx3(tint_symbol_16);
-    (*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3]) + as_type<uint>(1)));
+    int const tint_symbol_3 = idx3(tint_private_vars);
+    (*(tint_symbol_10))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_10))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3]) + as_type<uint>(1)));
     while (true) {
-      if (!((*(tint_symbol_16) < 10u))) {
+      if (!(((*(tint_private_vars)).v < 10u))) {
         break;
       }
       {
       }
       {
-        int const tint_symbol_8 = idx4(tint_symbol_16);
-        int const tint_symbol_9 = idx5(tint_symbol_16);
+        int const tint_symbol_8 = idx4(tint_private_vars);
+        int const tint_symbol_9 = idx5(tint_private_vars);
         int const tint_symbol_4_save = tint_symbol_8;
         int const tint_symbol_4_save_1 = tint_symbol_9;
-        int const tint_symbol_5 = idx6(tint_symbol_16);
-        (*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5]) + as_type<uint>(1)));
+        int const tint_symbol_5 = idx6(tint_private_vars);
+        (*(tint_symbol_10))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_10))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5]) + as_type<uint>(1)));
       }
     }
   }
diff --git a/test/tint/statements/increment/private.wgsl.expected.msl b/test/tint/statements/increment/private.wgsl.expected.msl
index 019bc09..ee2dbfe 100644
--- a/test/tint/statements/increment/private.wgsl.expected.msl
+++ b/test/tint/statements/increment/private.wgsl.expected.msl
@@ -1,8 +1,11 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void tint_symbol() {
-  thread int tint_symbol_1 = 0;
-  tint_symbol_1 = as_type<int>((as_type<uint>(tint_symbol_1) + as_type<uint>(1)));
+struct tint_private_vars_struct {
+  int i;
+};
+
+void tint_symbol(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).i = as_type<int>((as_type<uint>((*(tint_private_vars)).i) + as_type<uint>(1)));
 }
 
diff --git a/test/tint/types/module_scope_var.wgsl.expected.msl b/test/tint/types/module_scope_var.wgsl.expected.msl
index fbdf1db..413aa06 100644
--- a/test/tint/types/module_scope_var.wgsl.expected.msl
+++ b/test/tint/types/module_scope_var.wgsl.expected.msl
@@ -18,29 +18,33 @@
   float a;
 };
 
+struct tint_private_vars_struct {
+  bool bool_var;
+  int i32_var;
+  uint u32_var;
+  float f32_var;
+  int2 v2i32_var;
+  uint3 v3u32_var;
+  float4 v4f32_var;
+  float2x3 m2x3_var;
+  tint_array<float, 4> arr_var;
+  S struct_var;
+};
+
 kernel void tint_symbol() {
-  thread bool tint_symbol_3 = false;
-  thread int tint_symbol_4 = 0;
-  thread uint tint_symbol_5 = 0u;
-  thread float tint_symbol_6 = 0.0f;
-  thread int2 tint_symbol_7 = 0;
-  thread uint3 tint_symbol_8 = 0u;
-  thread float4 tint_symbol_9 = 0.0f;
-  thread float2x3 tint_symbol_10 = float2x3(0.0f);
-  thread tint_array<float, 4> tint_symbol_11 = {};
-  thread S tint_symbol_12 = {};
-  tint_symbol_3 = false;
-  tint_symbol_4 = 0;
-  tint_symbol_5 = 0u;
-  tint_symbol_6 = 0.0f;
-  tint_symbol_7 = int2(0);
-  tint_symbol_8 = uint3(0u);
-  tint_symbol_9 = float4(0.0f);
-  tint_symbol_10 = float2x3(float3(0.0f), float3(0.0f));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.bool_var = false;
+  tint_private_vars.i32_var = 0;
+  tint_private_vars.u32_var = 0u;
+  tint_private_vars.f32_var = 0.0f;
+  tint_private_vars.v2i32_var = int2(0);
+  tint_private_vars.v3u32_var = uint3(0u);
+  tint_private_vars.v4f32_var = float4(0.0f);
+  tint_private_vars.m2x3_var = float2x3(float3(0.0f), float3(0.0f));
   tint_array<float, 4> const tint_symbol_1 = tint_array<float, 4>{};
-  tint_symbol_11 = tint_symbol_1;
+  tint_private_vars.arr_var = tint_symbol_1;
   S const tint_symbol_2 = S{};
-  tint_symbol_12 = tint_symbol_2;
+  tint_private_vars.struct_var = tint_symbol_2;
   return;
 }
 
diff --git a/test/tint/types/module_scope_var_conversions.wgsl.expected.msl b/test/tint/types/module_scope_var_conversions.wgsl.expected.msl
index 012737e..7f65608 100644
--- a/test/tint/types/module_scope_var_conversions.wgsl.expected.msl
+++ b/test/tint/types/module_scope_var_conversions.wgsl.expected.msl
@@ -1,47 +1,71 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  bool bool_var1;
+  bool bool_var2;
+  bool bool_var3;
+  int i32_var1;
+  int i32_var2;
+  int i32_var3;
+  uint u32_var1;
+  uint u32_var2;
+  uint u32_var3;
+  bool3 v3bool_var1;
+  bool3 v3bool_var2;
+  bool3 v3bool_var3;
+  int3 v3i32_var1;
+  int3 v3i32_var2;
+  int3 v3i32_var3;
+  uint3 v3u32_var1;
+  uint3 v3u32_var2;
+  uint3 v3u32_var3;
+  bool3 v3bool_var4;
+  bool4 v4bool_var5;
+};
+
 kernel void tint_symbol() {
-  thread bool tint_symbol_1 = true;
-  thread bool tint_symbol_2 = true;
-  thread bool tint_symbol_3 = true;
-  thread int tint_symbol_4 = 1;
-  thread int tint_symbol_5 = 1;
-  thread int tint_symbol_6 = 1;
-  thread uint tint_symbol_7 = 1u;
-  thread uint tint_symbol_8 = 1u;
-  thread uint tint_symbol_9 = 1u;
-  thread bool3 tint_symbol_10 = bool3(true);
-  thread bool3 tint_symbol_11 = bool3(true);
-  thread bool3 tint_symbol_12 = bool3(true);
-  thread bool3 tint_symbol_13 = bool3(true);
-  thread bool4 tint_symbol_14 = bool4(true, false, true, false);
-  thread int3 tint_symbol_15 = int3(1);
-  thread int3 tint_symbol_16 = int3(1);
-  thread int3 tint_symbol_17 = int3(1);
-  thread uint3 tint_symbol_18 = uint3(1u);
-  thread uint3 tint_symbol_19 = uint3(1u);
-  thread uint3 tint_symbol_20 = uint3(1u);
-  tint_symbol_1 = false;
-  tint_symbol_2 = false;
-  tint_symbol_3 = false;
-  tint_symbol_4 = 0;
-  tint_symbol_5 = 0;
-  tint_symbol_6 = 0;
-  tint_symbol_7 = 0u;
-  tint_symbol_8 = 0u;
-  tint_symbol_9 = 0u;
-  tint_symbol_10 = bool3(false);
-  tint_symbol_11 = bool3(false);
-  tint_symbol_12 = bool3(false);
-  tint_symbol_13 = bool3(false);
-  tint_symbol_14 = bool4(false);
-  tint_symbol_15 = int3(0);
-  tint_symbol_16 = int3(0);
-  tint_symbol_17 = int3(0);
-  tint_symbol_18 = uint3(0u);
-  tint_symbol_19 = uint3(0u);
-  tint_symbol_20 = uint3(0u);
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.bool_var1 = true;
+  tint_private_vars.bool_var2 = true;
+  tint_private_vars.bool_var3 = true;
+  tint_private_vars.i32_var1 = 1;
+  tint_private_vars.i32_var2 = 1;
+  tint_private_vars.i32_var3 = 1;
+  tint_private_vars.u32_var1 = 1u;
+  tint_private_vars.u32_var2 = 1u;
+  tint_private_vars.u32_var3 = 1u;
+  tint_private_vars.v3bool_var1 = bool3(true);
+  tint_private_vars.v3bool_var2 = bool3(true);
+  tint_private_vars.v3bool_var3 = bool3(true);
+  tint_private_vars.v3i32_var1 = int3(1);
+  tint_private_vars.v3i32_var2 = int3(1);
+  tint_private_vars.v3i32_var3 = int3(1);
+  tint_private_vars.v3u32_var1 = uint3(1u);
+  tint_private_vars.v3u32_var2 = uint3(1u);
+  tint_private_vars.v3u32_var3 = uint3(1u);
+  tint_private_vars.v3bool_var4 = bool3(true);
+  tint_private_vars.v4bool_var5 = bool4(true, false, true, false);
+  tint_private_vars.bool_var1 = false;
+  tint_private_vars.bool_var2 = false;
+  tint_private_vars.bool_var3 = false;
+  tint_private_vars.i32_var1 = 0;
+  tint_private_vars.i32_var2 = 0;
+  tint_private_vars.i32_var3 = 0;
+  tint_private_vars.u32_var1 = 0u;
+  tint_private_vars.u32_var2 = 0u;
+  tint_private_vars.u32_var3 = 0u;
+  tint_private_vars.v3bool_var1 = bool3(false);
+  tint_private_vars.v3bool_var2 = bool3(false);
+  tint_private_vars.v3bool_var3 = bool3(false);
+  tint_private_vars.v3bool_var4 = bool3(false);
+  tint_private_vars.v4bool_var5 = bool4(false);
+  tint_private_vars.v3i32_var1 = int3(0);
+  tint_private_vars.v3i32_var2 = int3(0);
+  tint_private_vars.v3i32_var3 = int3(0);
+  tint_private_vars.v3u32_var1 = uint3(0u);
+  tint_private_vars.v3u32_var2 = uint3(0u);
+  tint_private_vars.v3u32_var3 = uint3(0u);
   return;
 }
 
diff --git a/test/tint/types/module_scope_var_initializers.wgsl.expected.msl b/test/tint/types/module_scope_var_initializers.wgsl.expected.msl
index f21fcf3..71b2857 100644
--- a/test/tint/types/module_scope_var_initializers.wgsl.expected.msl
+++ b/test/tint/types/module_scope_var_initializers.wgsl.expected.msl
@@ -18,29 +18,43 @@
   float a;
 };
 
+struct tint_private_vars_struct {
+  bool bool_var;
+  int i32_var;
+  uint u32_var;
+  float f32_var;
+  int2 v2i32_var;
+  uint3 v3u32_var;
+  float4 v4f32_var;
+  float2x3 m2x3_var;
+  tint_array<float, 4> arr_var;
+  S struct_var;
+};
+
 kernel void tint_symbol() {
-  thread bool tint_symbol_3 = false;
-  thread int tint_symbol_4 = 0;
-  thread uint tint_symbol_5 = 0u;
-  thread float tint_symbol_6 = 0.0f;
-  thread int2 tint_symbol_7 = int2(0);
-  thread uint3 tint_symbol_8 = uint3(0u);
-  thread float4 tint_symbol_9 = float4(0.0f);
-  thread float2x3 tint_symbol_10 = float2x3(float3(0.0f), float3(0.0f));
-  thread tint_array<float, 4> tint_symbol_11 = tint_array<float, 4>{};
-  thread S tint_symbol_12 = S{};
-  tint_symbol_3 = false;
-  tint_symbol_4 = 0;
-  tint_symbol_5 = 0u;
-  tint_symbol_6 = 0.0f;
-  tint_symbol_7 = int2(0);
-  tint_symbol_8 = uint3(0u);
-  tint_symbol_9 = float4(0.0f);
-  tint_symbol_10 = float2x3(float3(0.0f), float3(0.0f));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.bool_var = false;
+  tint_private_vars.i32_var = 0;
+  tint_private_vars.u32_var = 0u;
+  tint_private_vars.f32_var = 0.0f;
+  tint_private_vars.v2i32_var = int2(0);
+  tint_private_vars.v3u32_var = uint3(0u);
+  tint_private_vars.v4f32_var = float4(0.0f);
+  tint_private_vars.m2x3_var = float2x3(float3(0.0f), float3(0.0f));
+  tint_private_vars.arr_var = tint_array<float, 4>{};
+  tint_private_vars.struct_var = S{};
+  tint_private_vars.bool_var = false;
+  tint_private_vars.i32_var = 0;
+  tint_private_vars.u32_var = 0u;
+  tint_private_vars.f32_var = 0.0f;
+  tint_private_vars.v2i32_var = int2(0);
+  tint_private_vars.v3u32_var = uint3(0u);
+  tint_private_vars.v4f32_var = float4(0.0f);
+  tint_private_vars.m2x3_var = float2x3(float3(0.0f), float3(0.0f));
   tint_array<float, 4> const tint_symbol_1 = tint_array<float, 4>{};
-  tint_symbol_11 = tint_symbol_1;
+  tint_private_vars.arr_var = tint_symbol_1;
   S const tint_symbol_2 = S{};
-  tint_symbol_12 = tint_symbol_2;
+  tint_private_vars.struct_var = tint_symbol_2;
   return;
 }
 
diff --git a/test/tint/var/inferred/global.wgsl.expected.msl b/test/tint/var/inferred/global.wgsl.expected.msl
index 7213119..df36244 100644
--- a/test/tint/var/inferred/global.wgsl.expected.msl
+++ b/test/tint/var/inferred/global.wgsl.expected.msl
@@ -18,39 +18,59 @@
   float f1;
 };
 
+struct tint_private_vars_struct {
+  int v1;
+  uint v2;
+  float v3;
+  int3 v4;
+  uint3 v5;
+  float3 v6;
+  MyStruct v7;
+  tint_array<float, 10> v8;
+  int v9;
+  uint v10;
+  float v11;
+  MyStruct v12;
+  MyStruct v13;
+  tint_array<float, 10> v14;
+  int3 v15;
+  float3 v16;
+};
+
 kernel void f() {
-  thread int tint_symbol = 1;
-  thread uint tint_symbol_1 = 1u;
-  thread float tint_symbol_2 = 1.0f;
-  thread int3 tint_symbol_3 = int3(1);
-  thread uint3 tint_symbol_4 = uint3(1u, 2u, 3u);
-  thread float3 tint_symbol_5 = float3(1.0f, 2.0f, 3.0f);
-  thread MyStruct tint_symbol_6 = MyStruct{.f1=1.0f};
-  thread tint_array<float, 10> tint_symbol_7 = tint_array<float, 10>{};
-  thread int tint_symbol_8 = 0;
-  thread uint tint_symbol_9 = 0u;
-  thread float tint_symbol_10 = 0.0f;
-  thread MyStruct tint_symbol_11 = MyStruct{};
-  thread MyStruct tint_symbol_12 = MyStruct{};
-  thread tint_array<float, 10> tint_symbol_13 = tint_array<float, 10>{};
-  thread int3 tint_symbol_14 = int3(1, 2, 3);
-  thread float3 tint_symbol_15 = float3(1.0f, 2.0f, 3.0f);
-  int const l1 = tint_symbol;
-  uint const l2 = tint_symbol_1;
-  float const l3 = tint_symbol_2;
-  int3 const l4 = tint_symbol_3;
-  uint3 const l5 = tint_symbol_4;
-  float3 const l6 = tint_symbol_5;
-  MyStruct const l7 = tint_symbol_6;
-  tint_array<float, 10> const l8 = tint_symbol_7;
-  int const l9 = tint_symbol_8;
-  uint const l10 = tint_symbol_9;
-  float const l11 = tint_symbol_10;
-  MyStruct const l12 = tint_symbol_11;
-  MyStruct const l13 = tint_symbol_12;
-  tint_array<float, 10> const l14 = tint_symbol_13;
-  int3 const l15 = tint_symbol_14;
-  float3 const l16 = tint_symbol_15;
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.v1 = 1;
+  tint_private_vars.v2 = 1u;
+  tint_private_vars.v3 = 1.0f;
+  tint_private_vars.v4 = int3(1);
+  tint_private_vars.v5 = uint3(1u, 2u, 3u);
+  tint_private_vars.v6 = float3(1.0f, 2.0f, 3.0f);
+  tint_private_vars.v7 = MyStruct{.f1=1.0f};
+  tint_private_vars.v8 = tint_array<float, 10>{};
+  tint_private_vars.v9 = 0;
+  tint_private_vars.v10 = 0u;
+  tint_private_vars.v11 = 0.0f;
+  tint_private_vars.v12 = MyStruct{};
+  tint_private_vars.v13 = MyStruct{};
+  tint_private_vars.v14 = tint_array<float, 10>{};
+  tint_private_vars.v15 = int3(1, 2, 3);
+  tint_private_vars.v16 = float3(1.0f, 2.0f, 3.0f);
+  int const l1 = tint_private_vars.v1;
+  uint const l2 = tint_private_vars.v2;
+  float const l3 = tint_private_vars.v3;
+  int3 const l4 = tint_private_vars.v4;
+  uint3 const l5 = tint_private_vars.v5;
+  float3 const l6 = tint_private_vars.v6;
+  MyStruct const l7 = tint_private_vars.v7;
+  tint_array<float, 10> const l8 = tint_private_vars.v8;
+  int const l9 = tint_private_vars.v9;
+  uint const l10 = tint_private_vars.v10;
+  float const l11 = tint_private_vars.v11;
+  MyStruct const l12 = tint_private_vars.v12;
+  MyStruct const l13 = tint_private_vars.v13;
+  tint_array<float, 10> const l14 = tint_private_vars.v14;
+  int3 const l15 = tint_private_vars.v15;
+  float3 const l16 = tint_private_vars.v16;
   return;
 }
 
diff --git a/test/tint/var/initialization/private/array/array_i32.wgsl.expected.msl b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.msl
index 33ba833..7ac53d8 100644
--- a/test/tint/var/initialization/private/array/array_i32.wgsl.expected.msl
+++ b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.msl
@@ -14,11 +14,16 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<tint_array<int, 3>, 2> zero;
+  tint_array<tint_array<int, 3>, 2> init;
+};
+
 kernel void tint_symbol() {
-  thread tint_array<tint_array<int, 3>, 2> tint_symbol_1 = {};
-  thread tint_array<tint_array<int, 3>, 2> tint_symbol_2 = tint_array<tint_array<int, 3>, 2>{tint_array<int, 3>{1, 2, 3}, tint_array<int, 3>{4, 5, 6}};
-  tint_array<tint_array<int, 3>, 2> v0 = tint_symbol_1;
-  tint_array<tint_array<int, 3>, 2> v1 = tint_symbol_2;
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.init = tint_array<tint_array<int, 3>, 2>{tint_array<int, 3>{1, 2, 3}, tint_array<int, 3>{4, 5, 6}};
+  tint_array<tint_array<int, 3>, 2> v0 = tint_private_vars.zero;
+  tint_array<tint_array<int, 3>, 2> v1 = tint_private_vars.init;
   return;
 }
 
diff --git a/test/tint/var/initialization/private/array/i32.wgsl.expected.msl b/test/tint/var/initialization/private/array/i32.wgsl.expected.msl
index 60dac04..77e713c 100644
--- a/test/tint/var/initialization/private/array/i32.wgsl.expected.msl
+++ b/test/tint/var/initialization/private/array/i32.wgsl.expected.msl
@@ -14,11 +14,16 @@
     T elements[N];
 };
 
+struct tint_private_vars_struct {
+  tint_array<int, 3> zero;
+  tint_array<int, 3> init;
+};
+
 kernel void tint_symbol() {
-  thread tint_array<int, 3> tint_symbol_1 = {};
-  thread tint_array<int, 3> tint_symbol_2 = tint_array<int, 3>{1, 2, 3};
-  tint_array<int, 3> v0 = tint_symbol_1;
-  tint_array<int, 3> v1 = tint_symbol_2;
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.init = tint_array<int, 3>{1, 2, 3};
+  tint_array<int, 3> v0 = tint_private_vars.zero;
+  tint_array<int, 3> v1 = tint_private_vars.init;
   return;
 }
 
diff --git a/test/tint/var/initialization/private/matrix.wgsl.expected.msl b/test/tint/var/initialization/private/matrix.wgsl.expected.msl
index 09c45a0..0bfef77 100644
--- a/test/tint/var/initialization/private/matrix.wgsl.expected.msl
+++ b/test/tint/var/initialization/private/matrix.wgsl.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  float2x3 v;
+};
+
 kernel void tint_symbol() {
   return;
 }
diff --git a/test/tint/var/initialization/private/scalar.wgsl.expected.msl b/test/tint/var/initialization/private/scalar.wgsl.expected.msl
index 09c45a0..fd57a42 100644
--- a/test/tint/var/initialization/private/scalar.wgsl.expected.msl
+++ b/test/tint/var/initialization/private/scalar.wgsl.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int v;
+};
+
 kernel void tint_symbol() {
   return;
 }
diff --git a/test/tint/var/initialization/private/struct.wgsl.expected.msl b/test/tint/var/initialization/private/struct.wgsl.expected.msl
index 5534eee..d5b00c7 100644
--- a/test/tint/var/initialization/private/struct.wgsl.expected.msl
+++ b/test/tint/var/initialization/private/struct.wgsl.expected.msl
@@ -6,6 +6,10 @@
   float b;
 };
 
+struct tint_private_vars_struct {
+  S v;
+};
+
 kernel void tint_symbol() {
   return;
 }
diff --git a/test/tint/var/initialization/private/vector.wgsl.expected.msl b/test/tint/var/initialization/private/vector.wgsl.expected.msl
index 09c45a0..cab5132 100644
--- a/test/tint/var/initialization/private/vector.wgsl.expected.msl
+++ b/test/tint/var/initialization/private/vector.wgsl.expected.msl
@@ -1,6 +1,10 @@
 #include <metal_stdlib>
 
 using namespace metal;
+struct tint_private_vars_struct {
+  int3 v;
+};
+
 kernel void tint_symbol() {
   return;
 }
diff --git a/test/tint/var/uses/private.wgsl.expected.msl b/test/tint/var/uses/private.wgsl.expected.msl
index d5f572f..a83b2a7 100644
--- a/test/tint/var/uses/private.wgsl.expected.msl
+++ b/test/tint/var/uses/private.wgsl.expected.msl
@@ -1,47 +1,52 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void uses_a(thread int* const tint_symbol) {
-  *(tint_symbol) = as_type<int>((as_type<uint>(*(tint_symbol)) + as_type<uint>(1)));
+struct tint_private_vars_struct {
+  int a;
+  int b;
+  int c;
+};
+
+void uses_a(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).a = as_type<int>((as_type<uint>((*(tint_private_vars)).a) + as_type<uint>(1)));
 }
 
-void uses_b(thread int* const tint_symbol_1) {
-  *(tint_symbol_1) = as_type<int>((as_type<uint>(*(tint_symbol_1)) * as_type<uint>(2)));
+void uses_b(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).b = as_type<int>((as_type<uint>((*(tint_private_vars)).b) * as_type<uint>(2)));
 }
 
-void uses_a_and_b(thread int* const tint_symbol_2, thread int* const tint_symbol_3) {
-  *(tint_symbol_2) = *(tint_symbol_3);
+void uses_a_and_b(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).b = (*(tint_private_vars)).a;
 }
 
 void no_uses() {
 }
 
-void outer(thread int* const tint_symbol_4, thread int* const tint_symbol_5) {
-  *(tint_symbol_4) = 0;
-  uses_a(tint_symbol_4);
-  uses_a_and_b(tint_symbol_5, tint_symbol_4);
-  uses_b(tint_symbol_5);
+void outer(thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).a = 0;
+  uses_a(tint_private_vars);
+  uses_a_and_b(tint_private_vars);
+  uses_b(tint_private_vars);
   no_uses();
 }
 
 kernel void main1() {
-  thread int tint_symbol_6 = 0;
-  tint_symbol_6 = 42;
-  uses_a(&(tint_symbol_6));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.a = 42;
+  uses_a(&(tint_private_vars));
   return;
 }
 
 kernel void main2() {
-  thread int tint_symbol_7 = 0;
-  tint_symbol_7 = 7;
-  uses_b(&(tint_symbol_7));
+  thread tint_private_vars_struct tint_private_vars = {};
+  tint_private_vars.b = 7;
+  uses_b(&(tint_private_vars));
   return;
 }
 
 kernel void main3() {
-  thread int tint_symbol_8 = 0;
-  thread int tint_symbol_9 = 0;
-  outer(&(tint_symbol_8), &(tint_symbol_9));
+  thread tint_private_vars_struct tint_private_vars = {};
+  outer(&(tint_private_vars));
   no_uses();
   return;
 }